Разработка "Танчики 2" Часть 6: Мультиплеер. Часть 1
Привет!
То что вы видите сверху - диаграмма клиент-серверного взаимодействие в главном меню игры с момента запуска и до момента попадания обоих игроков в основное меню.
Как вы можете догадаться, речь пойдет о мультиплеере и о сетевом его части в частности.
После билда 1.0.0 (последнего опубликованного на сайте) я решил что пришло время заняться мультиплеерной составляющей. Выбор пал на локальный мультиплеер. В меня появилась функция начать вдвоем, а код был вынужден изрядно перестроиться под натиском новых требований. Показывать тут особо нечего, ну, разве что, как выглядело главное меню:
Во всем остальном внешне ничего не поменялось, за исключкнием того, что все экраны (выбор класса, меню перед боем) повторялись дважды, по разу для каждого игрока.
В самой же битве появлялись (да, впрочем и появляются) 2 танка вместо одного, первый управляется на WASD, второй же на стрелки.
К тому моментуу меня уже давненько терзали смутные сомнения по поводу того насколько впринципе актуален локальный мультиплеер (когда все сидят по домам и общаются через интернет), но когда я начал непосредственно щупать это в бою, вскрылась еще одна проблема: управление. Где брать вторую мышку для управления башней второго танка? Управление башней на клавиатуре? Джойстики?
Такие думы окончательно меня догрызли и было принато решение заняться сразу сетевым кодом, поскольку он решает обе проблемы сразу. Я примерно понимал во что я ввязываюсь, но даже мои самые писсимистичные ожидания были недооценкой того с чем я столкнулся на самом деле.
Тезисно покажу основные проблемы, чуть подробнее, как всегда, в видео. В порядке влияния на сложность:
* Нулевой опыт разработки мультиплеерных игр и лишь базовое понимание основных концептов клиент - серверного взаимодействия.
* Очень базовая поддержка сетевых функций движком игры.
* Внутренние ограничения движка, которые непосредственно влияют на сетевой код.
* Отсутсвие внятных гайдов по созданию мультиплеерных игр на движке, а те что есть не выдерживают никакой критики и годятся лишь в плане обучения самым базам.
В итоге разработка превратилась в замкнутый цикл:
* Долго заставляешь себя сесть за разработку.
* Садишься, долго вспоминаешь что и где.
* Пытаешься решить последнюю нерешенную проблему.
* Тратишь кучу времени в попытках ее решить.
* Выясняешь, что проблемы глубже и нужно решить еще пару проблем прежде чем разобраться с этой.
* Свободное время заканчивается, ты вынужден остановиться на полпути.
И так по кругу. Иногда бывало и хуже, например, тебе не просто нужно решить еще пару проблем, но и переделать много из того что было сделано до этого, так как оно просто не работает или концептуально неправильно.
Кто знаком с тем как работает система мотиваций человева знает, что для того чтобы было желание за что-то браться, человеку нужно достигать долгосрочных целей, в моем случае это было написание базового скелета сетевой игры. Если долгосрочная цель выполняется, мозг получает дозу серотонина и это подстегивает его на заниматия новыми делами. А если мозг этот серотонин не получает, желание продолжать или браться за новые начинания угасает. В моем случае это и происходило на протяжении 10 месяцев, так как ровно столько я не мог довести сетевой код до состояния, которое меня хоть сколько-бы удовлетворяло.
Так было до вчерашнего дня.
Наконец, я нахожусь в той стадии когда могу сказать да, это готово, двигаемся дальше.
Слева - сервер, справа - клиент. Как видите, действия танков точно реплицируются, и, что более важно, они точно синхронизированы по времени. Не обращайте внимание на положение башен, это действие еще не отправляется по сети.
Самый базовый скелет сетевой игры готов, теперь буду наращивать на нем мышцы. Но впереди еще очень и очень много работы.
Буду стараться держать вас в курсе, по мере возможностей.
Рекомендую проверять youtube канал, так как буду выкладывать там небольшие видео прогресса, тех. сложности и просто рассуждения, которыми не хотел бы захламлять свой профиль здесь.
Всем пока!