Многопользовательская реализация, могу ли я реализовать ее позже, если захочу?

15

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

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

Брайан Харрингтон
источник

Ответы:

24

Вот хороший совет, взятый из руководства по сетевой библиотеке Zoidcom :

Если ваш проект находится на стадии планирования, рекомендуется с самого начала разработать проект для сетевого взаимодействия. Болтование сетевого кода в позднем состоянии проекта, скорее всего, приведет либо к массовому рефакторингу, либо к большому количеству взломов, что приведет к трудно обслуживаемому и подверженному ошибкам коду.

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

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

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

Проекты, использующие эту схему, - это почти все игры, использующие любой из движков Quake, Civilization 4, Neverwinter Nights и многие другие.

Для соединения клиента и сервера в одном процессе с нулевой задержкой могут использоваться локальные сокеты. Они предоставляются Zoidcom и передают пакеты напрямую от одного ZCom_Control к другому, не проходя через сокет уровня ОС.

Leftium
источник
Похоже, что это установка для чистых полномочий сервера, которые я ненавижу. Если ваш пинг к серверу низкий, он играет нормально. Но когда пинг становится слишком высоким, действия на вашем экране задерживаются. Я очень предпочитаю метод, который использует движок исходного кода, клиент запускает физику и все локально, и любое действие немедленно обнаруживается, но сервер все еще проверяет его, чтобы убедиться, что люди не взламывают, и если есть какие-либо несоответствия в том, что должно было произойти сервер отправляет правильное состояние игроку и переопределяет симуляцию клиентов новыми данными.
AttackingHobo
8
@AttackingHobo: Вы просто описываете предсказание клиента. Вы можете прекрасно сочетать предсказание клиента и полномочия сервера, и это вовсе не исключает архитектуру, описанную в руководстве Zoidcom.
@AttackingHobo @Joe: А Zoidcom на самом деле поддерживает предсказание на стороне клиента ^^
Leftium
2

Я согласен с советом, приведенным в ответе Leftium; разработайте его для сетей с самого начала, потому что вы не сможете добавить его позже .

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

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

Я думаю, что есть середина (хотя я никогда не пробовал это). Вы могли бы написать несколько фиктивных классов для сетевых / многопользовательских функций и усердно использовать их во время написания однопользовательской игры. Позже, если вы решите реализовать мультиплеер, просто заполните пустые классы, и все будет в порядке. Это очень похоже на метод сервер / клиент, но вам, возможно, удастся уйти с меньшим количеством работы; в конце концов, однопользовательскую игру легче создать, чем многопользовательскую, поэтому, если вы собираетесь написать свою однопользовательскую игру, как многопользовательскую, то почему бы просто не сделать ее многопользовательской?

Ricket
источник