Если ваш проект находится на стадии планирования, рекомендуется с самого начала разработать проект для сетевого взаимодействия. Болтование сетевого кода в позднем состоянии проекта, скорее всего, приведет либо к массовому рефакторингу, либо к большому количеству взломов, что приведет к трудно обслуживаемому и подверженному ошибкам коду.
Самый чистый способ - реализовать всю игру, как если бы она была чистой сетевой игрой. Таким образом, реализуйте код для выделенного сервера и реализуйте этот код только для того, чтобы быть серверным кодом. Реализуйте код игрового клиента аналогичным образом. Сервер и клиент могут работать в одном и том же процессе, и им даже не нужно использовать настоящий сетевой сокет, но они должны быть отдельными объектами, и весь код должен быть разработан для такой работы. Когда игрок прыгает, не изменяйте вектор прыжка игрока напрямую, а отправьте пакет «нажал при нажатии клавиши» на сервер и позвольте серверу обработать это.
Это означает, что даже в одиночной игре в фоновом режиме работает невидимый сервер. Многопользовательская версия одной и той же игры просто должна подключаться к удаленному серверу, а не к локальному и так далее, многопользовательский режим готов. Преимущества этого:
нет отдельного кода для одиночной и многопользовательской игры, сетевой код тестируется и разрабатывается в течение всего проекта.
Проекты, использующие эту схему, - это почти все игры, использующие любой из движков Quake, Civilization 4, Neverwinter Nights и многие другие.
Для соединения клиента и сервера в одном процессе с нулевой задержкой могут использоваться локальные сокеты. Они предоставляются Zoidcom и передают пакеты напрямую от одного ZCom_Control к другому, не проходя через сокет уровня ОС.
Я согласен с советом, приведенным в ответе Leftium; разработайте его для сетей с самого начала, потому что вы не сможете добавить его позже .
В первый раз, когда я попытался сделать многопользовательскую игру (я даже не пытался сделать игру для одного игрока!), Я подумал, что сначала я заставлю игру работать, а затем добавлю сеть. Плохая идея. У меня остался прототип действительно скучной одиночной игры, и я не представлял, как превратить это в многопользовательскую игру. Я полностью его отбросил и начал заново, на этот раз с самого начала писал код для многопользовательской сети. Все щелкнуло.
Я уверен, что нет ничего невозможного начать с игры для одного игрока и добавить многопользовательские функции. Если вы обдумаете это, спланируете правильно и убедитесь, что знаете свою стратегию, тогда обязательно попробуйте. Я думаю, что было бы интересной загадкой проработать, по крайней мере. Но действительно убедитесь, что вы знаете свой план относительно того, как вы собираетесь добавить сеть.
Я думаю, что есть середина (хотя я никогда не пробовал это). Вы могли бы написать несколько фиктивных классов для сетевых / многопользовательских функций и усердно использовать их во время написания однопользовательской игры. Позже, если вы решите реализовать мультиплеер, просто заполните пустые классы, и все будет в порядке. Это очень похоже на метод сервер / клиент, но вам, возможно, удастся уйти с меньшим количеством работы; в конце концов, однопользовательскую игру легче создать, чем многопользовательскую, поэтому, если вы собираетесь написать свою однопользовательскую игру, как многопользовательскую, то почему бы просто не сделать ее многопользовательской?
источник