"Объясняю каждую строчку" - отчёт за март месяц

chelovekbeznika В динамике выглядит чуть лучше, правда. Придётся учиться пилить гифки.<br />
chelovekbeznika В динамике выглядит чуть лучше, правда. Придётся учиться пилить гифки.

Тот упоротый чувак, который делает видеоигру на стримах, возвращается с очередным отчётом. Практика показала, что от ежемесячных отчётов толку больше будет.

Что тут происходит?

Вместо того, чтобы валять дурака на стримах, я решил заняться в сети чем-нибудь полезным. Например, поучить людей программированию. Ну, или скорее поучиться самому. А ещё сделать полноценную видеоигру. А ещё заработать денег, покорить ютуб, захватить мир, купить себе квартиру (в порядке возрастания сложности). Но и валять попутно дурака нам никто не запретит, конечно.

Обычно я стараюсь стримить в понедельник, в среду и в субботу. Но иногда это может меняться. В любом случае, на ютубе трансляция всегда создаётся заранее.

Присоединиться к веселью:

Присоединиться к веселью по настоящему:

Присоединиться к сообществу:

Следующий эфир в понедельник, в 20:00.

И что есть на данный момент?

Не так уж и много. Кроме игрока, который научился стильно двигаться и мощно стрелять, на экране имеются враги двух типов: мины, которые наносят урон, когда на них налетаешь, и охотники, которые летят за тобой по красивой дуге, выписывая виражи, когда от них уворачиваешься.

Ещё из не самых заметных, но очень важных достижений: практически всё, что касается баланса (хит-пойнты, урон, скорость, скорострельность, ускорение, размер хит-бокса, небо, аллах), вынесено в JSON-файл, где это дело можно править, не лазая в исходный код.

Чё так мало?

Во-первых, выбрана изначально такая низкоуровневая вещь, как Monogame, где очень многое надо делать самому. Например, контроль столкновений я делал сам, прямо на глазах у всей честной компании. После чего с помощью юнит-тестов убеждался, что там всё правильно отрабатывает вплоть до самого распоследнего пикселя.

Во-вторых, я привык делать всё тщательно, в долгую. То есть, не тяп-ляп, а с расчётом на то, что в будущем на этом фундаменте будут красивые уровни, весёлые пострелушки, цветущие яблони и дальше по списку.

В-третьих, попрошу обратить внимание на то, как называется наша передача. Я время от времени, особенно в начале, прерывался, чтобы провести очередную лекцию.

Статистика

  • 12 стримов и один маленький, тестовый, на полчасика
  • 1 день, 8 часов, 13 минут, 23 секунды видео, где я отважно программирую, борясь с особенностями языка, особенностями фреймворка и своей глупостью
  • 2 часа, 28 минут, 43 секунды - средняя длительность видео
  • 646 строк кода на данный момент есть в проекте, если не врёт Visual Studio
  • файлов с кодом
  • 26 юнит-тестов, что не очень много, но они все пригодились
  • 46 коммитов в репозитории на гитхабе
  • 46 комментариев к коммитам со ссылкой на видео, где я делаю этот коммит
  • 1 статья на хабре написана по итогам уже случившегося веселья. Если вам интересен язык C#, то вот она: https://habr.com/ru/post/445804/
  • 1 баг на DTF, оказывается, был исправлен. Я о том, что АЛЛИЛУЙЯ, РЕШЁТКА БОЛЬШЕ НЕ ПРЕВРАЩАЕТСЯ В СРАНЫЙ ХЭШ-ТЕГ
  • 1 день рождения на стриме отмечен
  • 1 конкурс проведён
  • 2 сигны выписаны
  • 1 безумный челлендж за донаты назначен. Потому что глупо игнорировать такой инструмент маркетинга. Ну, и потому что это весело.
  • 2 000 000 рублей - цена этого челленджа.
  • 17854 буквы "А" подряд содержит книга, которую я прочитаю полностью вслух на стриме, если случится чудо и эта сумма будет собрана. Хотя вряд ли, конечно, это случится в ближайшее время.

Умные слова, которые услышали те, кто не испугались и не разбежались

Я ещё стрима два назад хотел дать где-нибудь вконтакте список того, что я успел пообъяснять на этих стримах. А тут такой повод. Сразу скажу: за указанными вещами следуйте в описание. Там всё самое интересное отмечено тайм-кодами.

Плейлист на ютубе с уже прошедшими стримами:

  • 1 выпуск - Что такое объект и класс (очень коротко и криво), инкапсуляция, Single responsibility principle.
  • 2 выпуск - Полиморфизм и наследование (тоже так себе, на последующих стримах, на практике было объяснено лучше), обработка исключений
  • 3 выпуск - Наследование (примеры использования + некоторые вопросы с ним связанные), свойства (кусочно)
  • 4 выпуск - Использование уже имеющихся атрибутов в C#, введение в юнит-тестирование, Reference-типы и Value-типы в .NET (ключевое слово struct в C#)
  • 5 выпуск - События и делегаты, перегрузка методов
  • 6 выпуск - Дженерики, которые, увы, начались в этом проекте с немного мозгодробильного примера. И рефлексия, которая в итоге нам не понадобилась.
  • 7 выпуск - Code-convention связанные с событиями, методы расширения и LINQ (Select, Where и чуть-чуть SelectMany).
  • 8 выпуск - Первый стрим, на котором мне не пришлось объяснять ничего нового. Но ссылку на пару мелочей с тайм-кодами я оставил.
  • 9 выпуск - Тоже мелочь. Nullable, опетор ? : и кое-чего нового о делегатах.
  • 10 выпуск - Ошибки округления в вещественных числах.
  • 11 выпуск - Где и как лучше хранить данные, о том, почему предпочёл JSON, о некоторых нюансах глобализации, которые могут больно стукнуть по лбу. Ну и попытался порассказывать о SOLID, (конкретно, о буквах O и L)
  • 12 выпуск - Тронули буквы I и D из SOLID. Натолкнулись на ограничения, связанные с дженериками. К букве I оттуда мы ещё вернёмся на следующем стриме.

Ещё что-нибудь?

Да, хочу спросить у народа, который тут в этих делах более-менее опытный. Где можно набрать звуковых эффектов? Я знаю, что есть места, где можно скачать какой-нибудь прилично звучащий "пыщь-пыщь", за который потом к тебе не приедет зондер-команда копирастов. Но какие из этих мест вы мне посоветуете?

ПыСы: Следующий стрим тут, в понедельник, в 20:00:

5050
50 комментариев

Комментарий недоступен

2
Ответить

Не, можно и потопить. Плюсы в 80-ых/90-ых, насколько я знаю, были стандартом во всей отрасли, когда дело касалось ООП и вообще всякого энтерпрайза. А в геймдеве это стандарт, который держит свои позиции до сих пор. Всё-таки скорость выполнения решает. Если бы не запредельная сложность языка (плюсы) и не запредельная низкоуровневость (чистый си), то цены б им не было. А, ну ещё и синтаксис чуть-чуть нечеловеколюбивый. Но к этому мы уже привыкли и в другие производные языки потащили, вплоть до Джаваскрипта.

5
Ответить

Комментарий недоступен

1
Ответить

А можно узна́ть зачем в играх юнит тесты?

Я как бы понимаю что если игра онлайн, то сервер может отрубится и клиент начнет работать не правильно. И что бы не искать ошибок там где их нет есть вот такие тесты.

Но вот для офлайновых игр, особенно для определения столкновения по пикселям, не совсем понятно. Ведь пишеш функцию, она работает, если переменные изолированы в ней то все, она всегда будет работать, зачем юнит тесты в таком случае?

1
Ответить

А как ты ещё проверишь те же столкновения? Чисто на глаз? Чисто на всякий случай: под юнит-тестами понимается код, которые проверяет небольшие части другого кода. И вот для того, чтобы проверить, что код столкновений работает правильно, как ты не распологай два хит-бокса, юнит-тесты идеальны. Ещё один случай: убедиться, что перезарядка работает правильно даже в тех случаях, когда у нас пять-десять кадров в секунду. Да и просто убедиться, что важные тебе части кода работают правильно, перед тем, как их использовать, явно будет не лишним.

4
Ответить

Тесты пишутся зачастую, чтоб потом легко можно было понять, что и где отвались при изменениях. Почитайте про регрессионное тестирование.

Ответить