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


15

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

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

Ответы:


24

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

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

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

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

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

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

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


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

8
@AttackingHobo: Вы просто описываете предсказание клиента. Вы можете прекрасно сочетать предсказание клиента и полномочия сервера, и это вовсе не исключает архитектуру, описанную в руководстве Zoidcom.

@AttackingHobo @Joe: А Zoidcom на самом деле поддерживает предсказание на стороне клиента ^^
Leftium

2

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.