Это действительно не простая проблема. На самом базовом уровне вы можете сказать, что сеть предоставляет те же данные, что и элемент MoveEnemies в исходном цикле. Таким образом, вы могли бы просто заменить петлю:
while(user doesn't exit)
check for user input
run AI
send location to server
get locations from server
resolve collisions
draw graphics
play sounds
end while
Однако необходимо учитывать задержки, так что вы действительно не хотите, чтобы приостановить основной цикл с призывами к сети. Для того, чтобы преодолеть это не редкость увидеть сетевой двигатель, сидя на втором потоке, опроса для данных с сервера так быстро, как это возможно и размещение новых местоположения объектов в общее пространство памяти:
while(connectedToNetwork)
Read player location
Post player location to server
Read enemy locations from server
Post enemy locations into shared memory
Тогда ваш главный цикл будет выглядеть следующим образом:
while(user doesn't exit)
check for user input
run AI
read/write shared memory
resolve collisions
draw graphics
play sounds
end while
преимущество этого метода заключается в том, что ваш игровой цикл будет работать так же быстро, как это возможно, но информация от сервера будет обновляться только тогда, когда запись полностью в и из сервер завершен. Конечно, у вас теперь есть проблемы с совместным использованием объектов по потокам и потехой с помощью замков и т. Д., Которые поставляются вместе с ним.
На стороне сервера цикл одинаков, есть одно соединение для каждого игрока (нередко каждый игрок также находится в отдельном потоке, так что латентность одного не влияет на других) для каждого соединения, которое оно будет запустить цикл вроде
while (PlayerConnected)
Wait for player to post location
Place new location in shared memory
Когда клиент аппарат запрашивает расположение врагов сервер считывает все остальные игроки места из общего блока памяти и отправляет его обратно.
Это чрезвычайно упрощенный обзор, и есть еще много ухищрений, которые улучшат производительность (например, может быть, сервер, отправляющий позиции противника клиенту, а не клиент, запрашивающий их), и вам нужно решить, где определенные логически решения принимаются (это клиент решить, был ли он был снят, потому что он имеет самую последнюю позицию для себя, или на сервере, чтобы остановить мошенничество)
Ninja-psych! +1 – GWLlosa