iPhone多人游戏设计

4
我已经搜索并阅读了许多文章,查看了GKTank苹果样例(似乎没有关于我的问题的具体信息,似乎只是按照发生的事件进行处理),但我找不到一个能够回答以下问题的示例或教程:
在蓝牙/互联网上的多人游戏中,如何同步玩家交互,以便考虑延迟等因素,从而出现正确的游戏结果...
例如:
在通过蓝牙连接的两个独立设备上,向每个玩家A和B显示一个按钮
玩家A按下按钮(玩家A是主机,因此延迟不是问题) 玩家B比玩家A稍微晚一些按下按钮,但他与玩家A的设备之间的网络延迟至少为200毫秒
问题:游戏需要知道玩家B先按下按钮,即使玩家A的触摸请求会先到达游戏代码 - 即主机玩家没有优势。
我知道触摸事件有时间戳,所以我可以确保从玩家B发送实际按下的时间到游戏代码...但不确定这是否是正确的方法,如果是的话,从哪里开始...
我预计答案在某些游戏时间周期中,触摸不会立即被处理,而是在游戏周期内处理...
任何关于此问题的帮助或指向处理此问题的特定源代码的教程都将不胜感激。
亚当
2个回答

2

由于这是一个关于多人游戏延迟或延迟的一般问题,而不是特别针对iPhone的问题,因此您可能希望在https://gamedev.stackexchange.com/上提出此问题。

您可以使用时间戳来对动作消息进行排序。我认为iPhone与AT&T维护的日期时间服务器同步。


1

我没有实际创建多人游戏的经验。但是像大多数游戏开发问题一样,我认为并没有对错之分,所以一些逻辑思考应该就可以解决问题。

以下是您可能需要考虑的一些想法:

即使玩家A的设备没有延迟,你也需要引入一些来补偿玩家B(反之亦然,因为从玩家B的角度来看,玩家A也晚了)。
因此,您需要引入某种“命令堆栈”来缓冲来自两个玩家的输入,并在两个玩家都有机会为给定的游戏时间点贡献其输入后执行命令。
您可能希望引入ping命令以不时地测量实际延迟。
只有一个设备(主机)应该测量延迟并将其通知客户端。
根据测得的延迟,计算命令堆栈中的时间偏移量(相对于主机时间)或延迟(使用延迟将玩家B的时间戳转换为“本地”时间)。
如果可能,保持延迟动态,以补偿不同的延迟(在整个会话期间保持测量延迟)。
如果实际延迟峰值超过计算出的延迟,则可以将来自玩家B的命令放到堆栈上 - 确保它们仍将被执行(此时可能会经历滞后)。
您实际上需要两个“层” - 输入层,用于交换、缓冲和同步实际输入,以及游戏层,用于接收来自输入层的延迟命令。

到目前为止,这是我的两分钱 ;-)


感谢评论 - 大致上是我所想的,尽管我希望其他人可能已经完成了跨设备的所有多人游戏中必须存在的逻辑。我想我必须自己解决它。 - adam pinder
由于互联网的存在,你几乎可以找到任何目的的代码,但特别是对于游戏来说,大多数情况下使用它并不容易 - 至少这是我迄今为止的经验,因为游戏代码很微妙。可用的代码可能不适合“原样使用”,并且会强制您进行大量重写,有时甚至需要从头开始编写自己的逻辑才能更好地实现目标。另一种选择是使用引擎... 话虽如此,仍然有可能在某个地方找到你需要的东西,但不幸的是我没有提示你去哪里寻找它... - Toastor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接