这并不是一个简单的问题。在最基本的层面上,你可以说网络提供了与原始循环中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
当客户端请求敌人位置时,服务器从共享内存块中读取所有其他玩家的位置并将其发送回来。
这只是一个极为简化的概述,还有许多其他调整可以提高性能(例如,服务器向客户端发送敌人位置可能比客户端请求它们更值得),您需要决定某些逻辑决策的位置(例如,客户端是否根据自己最新的位置决定他是否被击中,或者服务器防止作弊)。