Загрузка...

Очередная игра на C# (WinForm)

Тема в разделе C# создана пользователем itstranger 12 дек 2020. 1990 просмотров

  1. itstranger
    itstranger Автор темы 12 дек 2020 13 19 апр 2020
    Пару недель назад, просматривая темы в ветке программирования на C# наткнулся на этот пост.
    Там парень сделал игру за несколько часов про гонки для своего друга.
    Так вот, мне никогда не доводилось делать гонки. Немного подумав, пришел к выводу собственно почему бы не создать?
    Поскольку AshotOneShot, а так звали автора той темы писал гоночки на WinForm, то я чем я хуже?
    Давайте поэтапно расскажу, что у меня в итоге вышло за несколько вечеров и пару ночей.

    Для начала 2 скрина, было стало.
    [IMG]
    [IMG]
    Да, основные ассеты и структуру меню, я взял у AshotOneShot.
    Все остальные ассеты, в плане музыки и пропов нашел в интернете, либо сделал сам.
    К слову, касаемо кода. Его писал полностью самостоятельно. Копипаст кусков кода с форумов тут нет.

    Сурсы и билд.
    Не буду ходить вокруг да около.
    Тем кому гитхаб нафиг не нужон, вот архив с билдом
    Ссылка на VirusTotal

    Сразу про баги.
    Тестировал на Win10, вроде все работает. Тестировал на серваках, была бесконечная загрузка.
    В общем, если у кого, что криво работает фидбэкните пожалуйста.

    Небольшой DevLog.
    Думаю нет смысла здесь писать стены кода и расписывать каждую строчку кода, зачем она и почему.
    Если народу будет интересно в чем сомневаюсь, могу записать видео, где рассказать прямо подробно, как что работает. =D
    А так, лучше расскажу в общих чертах, что сделал, какие были интересные моменты.

    Структура проекта.
    Основным классом проекта является Game он же UsrControl.
    В нем описана общая логика поведения игры.
    Есть таймер на 16 тиков (16 милесекунд в таймере дают 60 фпс).
    Основные надписи, функция репэйнта (о ней чуть позже), обработка стэйт машин, функция инициализации игры и на этом все.
    Дальше логику отдельных элементов уже реализуют контроллеры и менеджеры.
    Так же вторым основным классом приложения является сама форма, где прописаны первичные инициализации, а так же управление меню.
    Само меню построено на юзер контролах и в нем ничего сложного нет.)
    Вот собственно и вся игр.

    Отрисовка и анимации.
    В этот раз я решил написать 2 класса, которые потом надо бы обернуть в библиотеку, это AnimationManager и AnimationSprite
    В чем собственно проблема анимаций при отрисовке на Graphics, а в том, что фрэймы надо отрисовывать непосредственно со в общем апдейте (тик таймера). Поэтому я в очередной раз наваял 2 простеньких класса, собственно сам объект анимированного спрайта и ее мененджер. Однако, наконец-то
    я сделал все более менее по уму и отрисовка спрайтов происходит по z-index, и вся отрисовываемая графика в игре построена на AnimationSprite.
    В итоге функуия репэйнта сократилась до одного цикла с linq запросом на сортировку. Как по мне это неплохой подход.
    К слову, в этом же проекте я решил немного поработать с пост обработкой. В целом ничего сложного, просто в фотошопе наваял 2 пост эффекта, но разница чувствуется.
    [IMG]
    [IMG]

    Искусственный интеллект.
    Впервые мне довелось писать ии с нуля да еще и для гонок.
    Ранее я делал ии только для пошаговых игр, либо использовал уже готовые апи или коды.
    Запрограммировать поведение машины противника оказалось не так сложно, но при этом есть и свои подводные камни.
    Логика противника примерно следующая:
    Если игрок сзади, то всегда перекрывать проезд с собой и быть на одной линии
    Если игрок впереди, то включать буст для того, чтобы догнать и пытаться быть не на одной линии
    Если противник обгоняет, то уступать ему первенство через раз
    Вроде ничего сложного, но алгоритмы поведения, честно у меня получились немного кривые,
    однако это придает больше фана и непредсказуймости, поэтому не баг, а фича.)
    За ии отвечает в проекте класс EnemyAi.

    Работа с музыкой.
    На самом деле это первый раз, когда я делаю игру на WinForm и добавляю полноценную музыку и звуки в игру.
    В целом, они принесли много подводных камней и к слову именно из-за них у вас может не запускаться проект.
    Нет, с самими звуками работать не сложно, но их нужно так организовать, чтобы они могли проигрываться парралельно.
    В WinForm нет корутин, а обертывать WindowsMediaPlayer в отдельный поток учитывая, что он сам по себе работает в отдельном потоке довольно странно.
    Поэтому в проекте есть например 2 полностью одинаковых класса MusicManager и VoiceManager, которые банально нужны для многоканальности звука.
    Так же звуки машин пришлось подгружать в оперативную память сразу при запуске. К слову, поэтому в игре есть загрузка при запуске.
    В общем, если кто шарит за то, как грамотнее оформлять звуки на шарпах, можете поделиться скилом?)
    Ах да, моя лень не позволила мне сделать нормальное управление звуком, поэтому громкость и отключение звука регулировать тут. :З
    [IMG]

    Банальщина
    Систему коллизий, основные объекты, стэйт машины и прочее мне уже доводилось делать ни один раз, как на формах, так и на других платформах или игровых движках. Однако и среди них нашлось пара забавных моментов.

    Например, в этом проекте точкой отсчета является авто игрока, поэтому на самом деле игрок стоит на месте и все элементы игры движутся относительно него, путем вычитания и сложения скоростей.) Да, да прямо как корабль из футурамы, который по факту стоял на месте и двигал вселенную.)

    Решил сделать парочку пропов. Например следы от торможения. Работает вроде более менее неплохо.
    [IMG]
    В целом, больше ничего такого интересного вспомнить не могу.)

    Зачем это все?
    Вы наверное думаете, а нафига вообще делать игры на вин формах?
    Можно же сделать игру на нормальном движке и выглядеть она будет в 1000 раз лучше, плюс можно выложить на те же мобилки или хтмл 5, срубив еще при этом шекелей. Да и АшотВанШот сделал игру за пару часов ради 500 рублей.

    Потому что, склепать свою игру на движке, где все механики работают из коробки сможет любой, а вот клепать игры на платформах, которые для этого не предназначены это очень крутой экспириенс. Так лучше понимаешь, как устроены игры в целом. Как работают те же коллизии, потоки и почему игры имеют те или иные алгоритмы или структуры. Поэтому считайте это небольшим челенджем и проверкой знаний программирования.)
    В общем, на этом все. Как говорится всем удачи, денег, дачи.)
    [IMG]
     
    12 дек 2020 Изменено
  2. Soiakp
    Soiakp 18 дек 2020 14 23 янв 2019
    Сам писал? Посмотрел код стайл, он отличается, сначала вижу венгерскую нотацию, camelCase потом under_score, очень странно такое видеть в коде одном проекте и разных классах. Про солид я думаю затирать ненужно:flexing_dog:
     
    1. itstranger Автор темы
      Soiakp, Да, сам. Просто, как раз эксперементировал с нэймингом и искал разные ресурсы, это все же небольшой пет проект, а не продакшн. :) Что самое интересное, в разных местах пишут про разные общепризнанные стандарты. Просто у C# есть еще свои стандарты и в итоге какая-то путаница. Но в целом думаю в будущем буду придерживаться венгерского стандарта.
    2. Soiakp
      itstranger, Почти на каждом интерпрайсе, да и в различных микро гейм студиях используют венгерску. Приватные поля _camalCase, Публичные PascalCase. Методы PascalCase. Так вполне удобнее и ошибку допустить будет сложнее.
    3. itstranger Автор темы
      Soiakp, В целом да, согласен. В этом проекте я ее и придерживался. Единственное что не подлежит венгерской нотации, это методы, они через _. Вообще, согласен с вами, надо переименовать. Они правда выбиваются из общего стиля кода.)
  3. AshotOneShot
    AshotOneShot 12 янв 2021 долбаеб 18 10 фев 2017
    Ох, мне приятно и стыдно одновременно)
     
    1. Посмотреть предыдущие комментарии (4)
    2. itstranger Автор темы
    3. AshotOneShot
      itstranger, не знаю, но после прочтения твоей статьи, появилось чувство стыда))
    4. AshotOneShot
      itstranger, не знаю, но после прочтения твоей статьи, появилось чувство стыда))
  4. etoparanoia
    etoparanoia 2 май 2022 0 25 июл 2021
    На самом деле круто получилось. Знаком с первой версией этой игры :smile:
     
    2 май 2022 Изменено
Загрузка...
Top