Это действительно не простая проблема. На самом базовом уровне можно сказать, что сеть предоставляет те же данные, что и часть 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
Когда клиентский компьютер запрашивает местоположения врагов, сервер считывает местоположения всех других игроков из общего блока памяти и отправляет их обратно.
Это очень упрощенный обзор, и есть еще много настроек, которые улучшат производительность (например, может стоить того, чтобы сервер отправлял вражеские позиции клиенту, а не клиенту, запрашивающему их), и вам нужно решить, где определенно логически принимаются решения (решает ли клиент, был ли он застрелен, потому что он имеет самую последнюю позицию для себя или сервер, чтобы прекратить обманывать)