Мультиплеер своими руками. Часть 2.
В какой-то момент я четко осознал, что хочется создать нечто подобное, с живыми игроками. Конечно, сеть накладывала ограничения, и было принято простое решение – построить карту на блоках. По задумке, получилась такая себе песочница-платформер, где все можно разнести.
Игра мечты.
Конечно, хотелось сделать Игру Мечты. Чтоб с Душой. Но увы большинство задумок постигала одна и та же участь: делаешь ее по вечерам, пока интересно, потом наскучивает, и потихоньку забрасываешь, растягивая проект на многие месяцы. Или работа навалится, и просто нет времени. И в один прекрасный момент ты делаешь перерыв в недельку, а потом все. Думаю все знакомы с людьми, которые делают свои поделки долгое время. Один мой знакомый делает игру уже 5 (пять!) лет, и этому не видно конца.
Покопался в себе и понял, что мотивации изнутри в определенный момент не хватит. Порой бывает от родного проекта просто тошнит, когда уставший после работы приходишь, и открываешь IDE.
Чтобы решить проблему, поступил радикально: нашел человека онлайн, с которым заключил "соглашение": Каждые две недели я составляю план разработки, и к концу "спринта" я обязуюсь прислать ему свежий билд, в которым все намеченные пункты должны быть выполнены.
Если не успеваю – в единоразовом порядке высылаю ему 50 долларов, и проект считаю проваленным. Конечно, в определенный момент меня не хватило, и я сдался. Отправил деньги как обещал, конечно. Но меня хватило на целых 6 месяцев!
Спустя время я уже был готов хоронить проект, но в одной конференции игра пришлась по нраву другому человеку (художнику), с которым мы начали думать, что делать дальше.
Что мы сделали, вы можете почитать в первом посте, а сейчас я расскажу, как сделан мультиплеер.
В процессе разработки постепенно понял что решаю целый комплекс задач, с которыми сталкиваются все, не побоюсь этого слова, инди команды, по новой, каждый раз. Мне было жаль потраченного времени, поэтому онлайн составляющую игры было решено выделить в отдельный опенсорс проект, который был бы полезен другим разработчикам. Такой себе "онлайн из коробки". Когда-то мне хватит духу, и я его опубликую.
Мультиплеер же состоит из трех компонентов: клиентская часть игры (графика), серверная часть игры (консоль), и онлайн (комплекс сервисов). Онлайн решает следующие задачи:
1. Авторизация (в т.ч. через соцсети)
2. Профили игроков
4. Внутриигровые сообщения
5. Рейтинги (лидерборды)
6. События (ежедневные задания)
Система была разработана с возможностью масштабирования, а также размещения игровых серверов в разных регионах мира.
Онлайн задумывался как кучка микросервисов, максимально отдаленно от самой игры, делая его, таким образом, пригодным для любой игры.
Матчмейкинг.
Увы, об этом нигде не пишут, и то, к чему пришли получилось путем проб и ошибок. Сначала я просто запускал N игровых серверов, и они рапортовали в примитивный список о своем присутствии. Но потом стало понятно, что нужно делать систему "по требованию", в которой новый игровой сервер запускается, когда нехватает текущих.
Сам же матчмейкинг состоит из двух частей:
1. Мастер, который принимает запросы на поиск игр, отдает список комнат, а также создает новые игры, если кто хочет.
2. Контроллер, который представляет собой одну физическую машину с запущенными на ней игровыми серверами. Контроллеров может быть сколько угодно, и они могут быть размещены в разных регионах по всему миру.
Так как Мастер и Контроллеры находятся на разных физических машинах, а могут и в разных регионах, то меж ними должен быть настроен VPN (OpenVPN хорошо решает эту задачу)
Пока у игрока мигает квадратик, под капотом происходят следующие вещи.
1. Клиент авторизуется в системе.
2. Клиент запрашивает у Мастер сервиса свободную комнату. Также клиент может перечислить требования к комнате. Например, определенная карта или режим игры. С точки зрения онлайна это всего лишь ключи/значения, по которым комнаты фильтруются.
3. Если свободной комнаты нет – Мастер регистрирует новую, а также выбирает самый подходящий контроллер, на котором можно разместить новый игровой сервер, который будет обслуживать саму игру. В процессе подбора участвуют следующие параметры: расстояние от игрока до контроллера (геопозиция), а также загруженность самого контроллера (% загруженности ЦП и свободная оперативная память). Таким образом, нагрузка распределяется меж нескольких машин.
4. Затем Мастер обращается к выбранному контроллеру, с просьбой запустить новый игровой сервер.
5. Контроллер, в свою очередь, запускает новый процесс игрового сервера (предоставленный самой игрой), а также передает Unix domain socket как первый аргумент командной строки. Через этот сокет происходит обмен данными между игровым сервером, и онлайном. Также, контроллер следит за стандартным выводом игрового сервера. Контроллер выделяет под игровой сервер несколько портов (сколько самой игре нужно).
6. Затем клиент "регистрируется" в комнате, предоставля свой токен доступа. Последний всегда держится в секрете, получив который, можно делать все что угодно от имени игрока. Чтобы избежать этого, токен не передается игровому серверу напрямую. В ответ на регистрацию клиент получает короткий ключ комнаты, который является разрешением к подключению к игровому серверу, а также адрес (и порты) конкретного игрового сервера.
7. Клиент, используя средства самой игры подключается к игровому серверу. Тут уж выбор за разработчиком, TCP или UDP, или все вместе. В процессе подключения клиент передает ключ к комнате, на игровой сервер.
8. Игровой сервер, используя связь с контроллером, обращается к мастеру, и обменивает ключ комнаты, который передал клиент, на токен доступа игрока. Одновременно с этим, успешный обмен означает валидность игрока в системе и то, что игрок имеет право находиться на этом игровом сервере. Полученный токен доступа игрока в дальнейшем используется для того, чтобы загрузить профиль игрока на игровой сервер и делать другие операции с онлайном.
9. Таким образом, игроку гарантируется место в комнате, а также исключается передача ключа доступа игрока по незащищенному каналу между клиентом и игровым сервером.
В целом, всю систему можно представить следующим образом:
Также, для обеспечения стабильности контроллер периодически опрашивает игровой сервер, работает ли он. Кроме того, мастер опрашивает все контроллеры. Если контроллер не отвечает – все комнаты, которые числятся за этим контроллером временно пропадают из списка. Если контроллер перегружен – запросы на создание комнаты к нему перестают приходить, и клиент получает ошибку "503 Service Unavailable".
Синхронизация.
Проблемой задачей было синхронизировать игровой мир в рамках одного игрового сервера. То и дело игроки стреляют, взрываются гранаты, в следствии чего уничтожаются блоки, а также умирают сами игроки. Кроме того, само положение игроков нужно синхронизировать так, чтобы не было заметно лагов. Также, нужно валидировать данные от клиентов, дабы клиенты не могли проходить сквозь стены, например.
Тут можно выделить следующее:
1. При подключении на сервер, сервер делает полный дамп карты со всеми блоками и игроками, сериализует их, и отправляет клиенту. Таким образом, клиент получает то, что происходило в момент подключения.
2. Дальше при создании/удалении объектов клиент получает соотв. уведомление.
3. Когда игрок стреляет, клиент производит выстрелы моментально, параллельно сообщая серверу о произведенных выстрелах. Сервер валидирует эти данные (позиция, есть у и игрока патроны), а затем запускает эти выстрелы у себя. Также, он сообщает о выстрелах всем игрокам, кроме стрелявшего. При попаданиях весь урон наносится исключительно на сервере.
Перемещение игроков стоит выделить в отдельную категорию:
1. На клиенте висит объект-наблюдатель, который держит несколько триггеров по разным критериям. Например, триггер на скорость, триггер на перемещение, триггер на поворот пушки или триггер на контакт с землей.
2. При срабатывании триггера слепок игрока (позиция, скорость, поворот) отправляется на сервер.
3. Сервер валидирует эти данные, и передает их объекту-синхронизатору. Последний, в свою очередь, отсекает невозможные данные, и телепортирует игрока обратно (например, перемещение на слишком большое расстояние отсекается). Таким образом, проход через стену невозможен.
4. Тот, в свою очередь, постепенно доводит параметры игрока к требуемым (поправляет позицию, скорость и тд)
5. Как и в пункте 1, на том же объекте клиента, но на серверной стороне, висит объект наблюдатель. Но в этот раз при срабатывании триггеров, слепок отправляется всем клиентам, кроме игрока.
6. Все клиенты доводят состояния других клиентов к желаемым согласно слепкам.
Лига Разработчиков Видеоигр4.8K поста 19.8K подписчиков
Правила сообществаОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Только гифки/арты/скриншоты из игры. Такие материалы могут сопровождать рассказ об игре или обучающий туториал, но не должны являться основой поста
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры, для этих целей больше подойдёт Discord-сервер сообщества
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"
Я думал очередная фиговенькая технодемка, но скачал и залип на 2 часа. Что-то от старого доброго Gang Garrison, Cortex, пары еще игр, но с современными фишками и без проблем с пингом. Отличная работа!
Если информация не секретная:На чем писали? (Я ж правильно понимаю, что на Java?)С помощью чего? Каких библиотек графики?
А может помнит кто? Похожая игра была, флеш, 2д, вид сбоку, шутер, играл давно. Из ключевых черт могу сказать, что там были: возможность поставить до трёх ботов (игра была только с ботами), возможность выбрать скины ботам, различное оружие вплоть до базуки, возможность выбрать команду (за кого будут) боты, так можно было организовать 1vs3, 2vs2, и каждый сам за себя, несколько разных карт, графика вроде как pixel art была, а режим игры только survival (смерть без возрождений). Очень хотелось бы вспомнить её, но найти не вышло.
Класс! Я сам фанат Cortex Command, ребзя, вы молодцы!
Хотелось поиграть, но скачав установщик затрезвонил avast :( ТС @desertkun , предлагаю подумать, что там такое может вызвать avast, так как это может остановить некоторых людей уже на этапе установки :\
@desertkun, как насчёт подогнать бетку(а может и релиз) такому человеку как Wycc? Он бы тоже мог вставить свои 5 копеек, как в гринлайт, так и в онлайн
Черный плащ ремастер - Darkwing Duck Remastered
начал делать в свободное время ремастер - ремейк черного плаща. хотел бы узнать что думаете?
Краб у костра на берегу
Pixel-art концепт для игры, которую я делал последний год. 24 цвета.
Вот как он выглядит в игре:
Краб - 12 цветов, девочка с ушками - 42. Анимированный вариант:
Мы разрабатываем игру в сеттинге Дизельпанк уже три года и хотим ею поделиться
День Добрый, Жители Пикабу. Хотим поделиться с вами проектом мечты — Erra: Exordium. Это 2D Экшн-Адвенчура в сеттинге Дизельпанка и основанная на шумеро-аккадской мифологии. Ниже вы можете увидеть наш первый трейлер.
Противники это одна из самых важных игровых составляющих, поэтому им мы уделяем достаточно большое количество времени. То что представлено ниже это наша основная артиллерия, но во время прохождения вы увидите больше интересных видов.
Уничтожать армию Мехатронов вам придется с помощью холодного и огнестрельного оружия. Которое вы будете находить, по ходу прохождения. Вас ждут пистолеты, дробовики и винтовки. Как говорится: "Палка делает бум".
Как вы можете наблюдать ниже, игра претерпела значительные изменения в плане анимаций и подвижности персонажей. Хотя нашу игру все еще нельзя назвать супер-подвижной и стремительной, как многих других представителей жанра Action Adventure.
Мы уже публиковали на различных ресурсах статьи о разработке архитектур и прочего. Здесь предлагаем вам ознакомиться с некоторыми особенностями нашей игры. Может заинтересует наша страничка в Steam.
Когда мы были на игровой выставке самый первый раз, то главный вопрос звучал так: "А у вас Метроидвания?". Нет, у нас классическая 2D сюжетно-ориентированная игра. В первую очередь, потому что мы сами скучаем по таким играм. В нашем мире Шумерская цивилизация достигла технологических высот и на основе древних артефактов сумела построить армию Мехатронов. Роботов, созданных помогать и облегчать жизнь человечества. Но однажды произошел катаклизм, который изменил жизнь Телмуна. Люди заболели неизвестной хворью, а железная армия обернулись против своих создателей.
Вы играете за ученого, который сумел побороть смерть и перенести собственное сознание в искусственное тело. По ходу сюжета, вам предстоит узнать, что же все-таки произошло с островом и какая тайна стоит за смертью цивилизации.
За эти три года мы создали значительное количество контента, которое, по итогу, вылилось в проект, которым мы гордимся. Уместить всю игру в один пост у нас, увы, не получится, но надеемся на ваш интерес и поддержку.
Ознакомиться со страничкой на Steam.Подписаться на наш Twitter.
Локации так же не ограничатся какой-то одной цветовой палитрой. Вас ожидают разные уголки города Телмуна, которые порадуют вас крайне прорисованными деталями. Надеемся, что у нас получится создать для вас уникальный визуальный опыт, навеянный шумерской культурой.
Таверна
Маленькая уютная таверна для Witchcrafty
Крошки рыцари. Подведение итогов за год разработки
Привет, инди - разработчик! В этом посте я поведаю о том, что усвоил за год разработки в соло. Собранно. Кратко. Без воды.
КРАНЧИДанные приведены с учётом основной работы с ненормированным графиком, не связанной с геймдевом.— Общее время с момента начала разработки: 11 месяцев.Из которых:— 1-2 месяца кранчи по 50-70 ч/в неделю;— 3-4 месяца застои;— 6 месяцев средняя занятость проектом по 10 ч/в неделю;Общее время на разработку: 80 рабочих дней.Из которых:— 60 раб/дней ушло на проектирование и работу над ошибками.— 20 раб/дней составляют основную работу над проектом.Маленький вывод: Не смотря на застои и выгорание после кранчей, они окупились прибавкой в целый месяц высокопродуктивной работы и предоставили пассивное время для до/ и переосмысления проекта.
ЗАСТОИПомимо основных причин, вроде выгорания, главной причиной стало отсутствие опыта и навыков. Об этом я подробнее расскажу абзаце про ошибки.
РЕЛИЗТак близко и так далеко одновременно. Не могу назвать себя идеалистом. Просто хочется, чтобы было хорошо. Только начав разработку этого проекта, я определил для себя главное правило: готовая игра должна нравится именно мне, и расходящиеся с моим, мнения окружающих, учитываться будут лишь во вторую очередь. Однако, при этом, подавляющему большинству игроков, в финальном тестировании, должно быть удобно и весело играть. Все это также сказалось на растягивании сроков и работе в холостую.Маленький совет: У меня имеется четко сформулированная система меры и оценки качества всех основных составляющих игры. И если вопрос встаёт о том, а нужно ли это улучшать, я просто обращаюсь к ней и трезво принимаю нужное решение.
Пример можно скачать тут ДОКУМЕНТ
ПРОКАЧКА СКИЛЛОВИмея за плечами 2 года каждодневной практики и 1 год работы с пиксельной анимацией и работы с графическим редактором, уделяя при разработке примерно одинаковое количество времени на код и дизайн, могу сделать следующие выводы:— я научился не забрасывать проекты один за другим, пусть и приходится много всего переделывать.— теперь, при написании игровой логики, моей базы и навыков полностью достаточно, чтобы не замедлять разработку. А с периодичностью раз в три-четыре месяца, хватает двух дней, чтобы произвести полный рефакторинг кода и освежить его в памяти (на конкретном проекте).— навыки рисовальщика, юишника и дизайнера тоже не остались в стороне. Приведу пример ниже, в котором покажу прототипы меню в начале разработки и на текущий момент.
Не учитывал кратковременные периоды (до нескольких месяцев), потому что не считаю их достаточно продуктивными. В моем случае, ощутимые результаты в росте навыков появляются лишь при каждодневной работе на протяжении от полугода и выше. А без постоянной практики, навыки заметно проседают.
ОШИБКИ, ВОЗНИКШИЕ СЛОЖНОСТИ И ПУТИ ИХ РЕШЕНИЯ— Уход единственного художника с проекта. Разработка затянулась, а отсутствие рабочих концептов приводило к задержке задач для художника. Как итог, редкая разовая работа, параллельные заказы, повышение уровня мастерства и отсутствие интереса к мелким задачкам. Выводы из этой ситуации для себя каждый сможет сделать сам, дабы обезопасить себя в дальнейшем. (Кстати, я в поиске художника по фонам. Актуально в течение 2 недель, с момента публикации статьи).— Отсутствие опыта в проектировании UI/UX интерфейсов. В прототипировании мне не приходилось с этим сталкиваться, а отдельный экран не должен был сочетаться со всей игровой стилистикой. Решение банальное, просто набивать руку. Наличие референсов мне никак не помогло. Но не брать их во внимание тоже не стоит. В интернете масса интересных решений, которые порой в десятки раз лучше тех, чем те, которые мы только можем себе представить.— Отсутствие опыта в планировании игрового цикла и игровых меню. Также, все просто. Ни один проект дальше прототипирования основной механики не доходил.— Отсутствие опыта в работе с хранилищами и базами данных, при проектировании магазина торговли и вывода информации. Наверное, единственное место в проекте, где предварительная работа с диздоком действительно принесла бы свои плоды.— Отсутствие готового прототипа игровых меню и невозможность демонстрации проекта/ невозможность продолжать разработку. Так уж получилось, что проект включает 2 главные механики, замечательно уживающиеся друг без друга, такие как бой на арене и менеджмент в главном меню. Вот только уживание это происходит не долго. Все работает, но ничего нельзя протестировать, из-за сильного переплетения и зависимости одной части от другой.
ПРИШЛОСЬ ПЕРЕДЕЛАТЬВсе игровые меню и интерфейсы перерабатывались, без преувеличения, десятки раз, и что-то до сих пор нуждается в доработке. Но даже основная игровая механика, бой на арене, прототип который был сделан ещё 3 марта 2021 года, также неоднократно подвергалась модификациям. Однако тут, кардинальных изменений не было. В основном различные дополнения и улучшения. Изначально система получилась не очень гибкой, но неоднократный рефакторинг это исправил.
ПЛАНЫ НА БУДУЩЕЕКак ни странно, за последний год совсем ничего не изменилось. Что это, постоянство, как признак мастерства, или ленивое ковыряние в носу. В любом случае, в моих планах остается также, сведение боевки с менеджментом и покорение Стима. Когда релиз, гадать не буду. Предварительно, через пол года. Ровно столько я себе рассчитал, только начав разработку. Ну а там уже, как получится.
Маленький совет: Вы можете стать мастером прототипирования игровых механик. Но это вам никак не поможет, при полном цикле создании игры от идеи и до релиза.
Спасибо, что дочитали до конца. Всем интересных игр и успешных релизов!
Если хотите меня поддержать или вам просто интересно следить за проектом, заглядывайте в паблик ВКОНТАКТЕ.