Контакты

Как создать самому сетевую игру

Навигация по статье:

1. Введение. Основные понятия организации многопользовательских игр.

Как мы все знаем, для многопользовательской игры мы должны быть подключены к локальной сети или интернету. За счет которых клиент игры получает данные от сервера или от других игроков. Данные могут содержать информацию различного рода: позиция игрока, смена инвентаря, текст в чате, действия игроков и многое другое. Обычно данные отправляются "пачками", т.е. берутся определенные параметры (позиция игрока, угол поворота, выбранное оружие и т.д.) и располагаются в массиве в определенной последовательности, после чего отправляется весь массив. Это позволяет уменьшить пинг между игроками, т.к. частая отправка маленьких пакетов данных намного медленней чем редкая отправка массива данных. Для организации обмена данными между клиентами в основном используются две схемы: клиент-сервер, клиент-клиент.

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

Это руководство разработано, чтобы дать вам обзор базовой сетевой настройки, указав минимальные необходимые шаги и необходимые функции и действия. Для тех из вас, кто к этому относится, это может помочь подумать о сетевых играх, используя реальную аналогию - стандартную почтовую службу. Если вы отправляете письмо, это письмо соответствует всем остальным письмам в центральное почтовое отделение, которые будут сортироваться и отправляться в пункт назначения. Ну, сетевое взаимодействие через Интернет одинаково, причем один клиент отправляет данные «пакеты» на сервер, который затем отправит его другим клиентам.

! Клиент-сервер - в этой схеме создается сервер игры, к которому подключаются клиенты. Главным выступает сервер, клиенты только отправляют ему данные и получают их, связи между клиентами нет. При использовании данной схемы у сервера появляется возможность перед отправкой данных всем игрокам откорректировать данные. Данная схема является наиболее распространенной, т.к. снимает нагрузку с клиента, переводя всю работу по рассылке данных на сервер.

Пример: к серверу подключено 10 игроков. Игрок 1 отправил серверу информацию, после чего сервер обработал ее и отправил эту информацию остальным 9-и игрокам.

! Клиент-клиент - один из клиентов запускает игру, после чего остальные игроки подключаются к нему. Происходит обмен данными между клиентами и они узнают информацию друг о друге. В данной схеме каждый клиент отправляет данные остальным сам. Данная схема используется редко, т.к. дает неоправданную нагрузку на клиент игры.

Пример: игрок 1 запускает игру, остальные к нему подключаются. С помощью игрока 1 все клиенты узнают друг о друге. После чего каждый клиент отправляет остальным полезную игровую информацию, принимая при этом данные и от остальных.

В общем, для нас доступны два типа серверов. Выделенный сервер - это тот, который не зависит от людей, играющих в игру, и все, что он получает, и пересылает пакеты данных. Фактическая часть программирования для обоих типов серверов более или менее одинакова, при использовании одних и тех же базовых функций, однако есть одно важное различие между ними: для выделенного сервера вам понадобятся два проекта: один для клиента и другой для сервер.

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

Какой из представленных схем воспользоваться выбор ваш, но стоит помнить, что при использовании схемы клиент-сервер уменьшается нагрузка на клиент игры и позволяет серверу откорректировать данные (при необходимости) перед их отправкой остальным игрокам.

Вот пример кода для настройки сервера. Как видно из приведенного выше кода, при создании сервера функция возвращает значение с чем-то от 0 и выше, что означает, что сервер был создан, а значение меньше 0 - ошибка. Это сервер настроен, но как насчет клиента?

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

Для передачи данных есть несколько видов протоколов (TCP, UDP, IPX и т.д.), каждый из которых обладает своими особенностями. К примеру протокол UDP не гарантирует доставку данных и их порядок, поэтому придется проверять пришли данные или нет и корректировать их порядок. В свою очередь TCP протокол гарантирует доставку данных и их порядок, но имеет меньшую скорость чем UDP.

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

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

! Game Maker поддерживает следующие типы подключений: IPX, TCP/IP, Modem и Serial.

В данной статье будет рассмотрен TCP/IP набор сетевых протоколов, т.к. остальные виды, которые поддерживает Game Maker уже почти не используются или не используются вовсе. Сразу стоит оговориться, что он не создан для организации среднестатистических ММО игр, но для кооператива из 2-6 игроков или простой ММО игры вполне подойдет.

Симулятор боёв на кораблях, который создал 17-летний Сергей Качмар.

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

Ученик ростовской школы не только запустил многопользовательскую игру, но и наладил прием платежей через «Единую кассу» Wallet One . Мы поговорили с ним о том, как найти время для создания собственной игры и как на этой игре можно заработать.

Привет! Где взять время на такой большой проект, когда есть куча других дел?

Следующий пример иллюстрирует типичную отправку с сервера на клиентское устройство. Здесь мы создали временный буфер и добавили данные, которые нам нужно отправить, используя буфер роста, чтобы убедиться, что ошибок переполнения буфера нет. Процесс отправки от клиента к серверу почти точно такой же, как показано выше, только теперь вместо отправки в несколько сокетов мы отправляем только один.

Теперь мы отправили информацию от нашего клиента на наш сервер и наоборот, но как насчет получения этих данных? Метод приема данных из соединения сокета прост, и следующие инструкции охватывают как клиент, так и сервер. Эта карта будет удалена в конце события, поэтому не пытайтесь получить к ней доступ за пределами Сетевого события! Таким образом, чтобы обнаруживать входящие данные и действовать на них, в сетевом событии было бы что-то похожее на следующее.

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

Чему нужно научиться, чтоб запустить свою игру?

Даже не знаю, могу ли я тут что-то советовать. Многие начинают с реализации как-то несложных игр, постепенно развивая свои проекты. Со временем люди получают более масштабные игры, как выросшие из маленьких, так и задуманные как крупные. С точки зрения конкретного обучения и того, что нужно осваивать - конечно же, языки программирования, причем серьезно. Я изучал Pascal, С# и HLSL. Движок написал самостоятельно. Стоит изучать дизайн, так как необходимо рисовать много элементов. Много чему приходится учиться, иногда в процессе.

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

Какой из этих вариантов твой? Расскажи, какие этапы были пройдены в создании и развитии игры?

Разработка этого проекта по сути являлась еще и обучением. Я открывал для себя новые возможности, постепенно создавая рендер, сетевую платформу, игровое ядро, работая с клиентской серверной частью. Разработку игры я начал в середине 2012 года, Первый прототип игры был создан в 2D, после началась работа над 3D-версией. И вот, 30 июня этого года началось бета-тестирование.

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

Создание проекта и импорт активов

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

Кто тебе помогал?

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

Во что ты сам играешь? Изменились ли твои игровые предпочтения после запуска собственной игры?

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

Попробуйте запустить игру сейчас, и вы должны увидеть пробел в игре. Этот объект будет отвечать за управление подключением разных клиентов в игре и синхронизацию игровых объектов между всеми клиентами. Например, если вы сейчас играете в игру, вы должны увидеть следующий экран.

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

Расскажи немного про то, как как можно зарабатывать на подобной игре?

Хост работает как клиент и сервер одновременно. Затем другие игроки могут подключаться к этому хосту как клиенты. Клиент связывается с сервером, но не выполняет какой-либо серверный код. Итак, чтобы проверить нашу игру, мы собираемся открыть два экземпляра, один как Хост, а другой как Клиент. Для этого вам необходимо создать свою игру и запустить первый экземпляр из сгенерированного исполняемого файла. Чтобы построить игру, вам нужно добавить сцену игры в сборку. Это откроет новое окно с игрой. Это то, что мы собираемся делать каждый раз, когда нам нужно протестировать многопользовательскую игру.

Бизнес-модель - free-to-play, это значит, что скачать игру и играть можно абсолютно бесплатно, но в игре есть магазин различных платных предметов, причем в игре можно купить не столько платную валюту, сколько, например, различные дизайны для корабля и всякие полезные предметы.


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

До сих пор все корабли появляются в середине экрана. Во-первых, нам нужно создать новый игровой объект, чтобы быть нашим местом появления и поместить его в нужную позицию появления. Случайное означает, что для каждого игрового экземпляра менеджер будет выбирать случайную позицию игрока случайно среди позиций появления. Затем он начинается с начала списка. К настоящему моменту вы снова можете попробовать играть в игру и посмотреть, появляются ли корабли в правильных положениях.

Легко ли было разобраться с приемом платежей, учитывая что раньше у тебя опыта в этом не было?

На мой взгляд, когда первый раз в жизни встречаешься с платежными системами, все они кажутся довольно сложными. Но когда я увидел «Единую кассу» Wallet One , то решил, что на самом деле все может оказаться проще, чем я думал. Поэтому я сразу же все это дело прикрутил к сайту и стал разбираться.

Следующее, что мы собираемся добавить в нашу игру, - это дать кораблям возможность стрелять в пули. Кроме того, эти пули должны быть синхронизированы между всеми экземплярами игры. Однако, как только создается пуля, игре не нужно распространять свою позицию по сети, так как позиция обновляется физическим движком. Кроме того, пуль будет иметь скорость и столкнуться с врагами позже.

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

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

Понравилась статья? Поделитесь ей