iOS 游戏中心游戏不同步

iOS game center game is out of sync

我一直在为 iOS 构建一个游戏中心游戏,到目前为止效果很好。我终于开始测试游戏并且(显然)存在一些延迟,这导致游戏不同步。

基本上我有2个玩家,每个玩家控制一个游戏角色。游戏角色可以发射火球、冰球等,这些攻击会造成伤害,并且有效果。例如。如果接触,冰球效果会冻结对手 3 秒。火球会造成持续 3 秒的持续火焰伤害。

所以问题是,当我和我兄弟对战时,由于延迟,我的游戏显示我还剩 40 点生命值,而他已降至 0,而在他的设备上,游戏显示我有 0 并且他有 20.

这意味着攻击 registering/colliding 在一个设备上(基于 characters/fireballs 的位置)而不是在另一台设备上。反之亦然。

我目前使用的是默认的点对点游戏中心架构。使用客户端-服务器架构(一个人成为服务器)是否可以解决这个不同步的问题?

如果没有,我还有哪些游戏套件可供选择 API?

我找到了解决这个问题的方法。

Note: this will be a relatively long answer.

我确实实现的一件事是使用 udp 进行一些不如其他重要的数据传输。例如,由于我每秒发送大约 10 次移动数据,我认为如果 10 个中的 1 个或 2 个偶尔丢失一次就可以了。


现在进入实际问题:


所以发生的事情如下 - 因为我使用的是 p2p 架构,所以两个客户端在看到游戏时都有延迟 'world'。这意味着在我的设备上,我看到敌方玩家处于延迟 100-200 毫秒的位置。 (所以他过去 100-200 毫秒实际上在那里)。

这个问题是,当我向敌人发射弹丸时,我看到碰撞,如果碰撞正好在他的精灵(他的脚或头)的边缘,在他的屏幕上,他是已经超过那个位置 - 加上 - 我的火球在他的屏幕上出现延迟 100 毫秒。这意味着在他的设备上,他能够躲避我的攻击。这可能发生随机次数,但我猜它可能低于 30% 的时间。 70%,两个设备都看到了碰撞。


解决方法


我想到的是在任一设备发生碰撞时向另一位玩家发送消息。请记住,每台设备都不知道对方是否看到了碰撞。所以我无法知道是两个设备都看到了碰撞,还是只有1个,另一个看到了攻击被躲开了。

这意味着每次发生碰撞时我都必须向其他玩家发送消息。现在,由于我构建游戏的方式,当发送碰撞时,我会自动应用碰撞事件(意思是,造成的伤害,发生的射弹效果 - 就像冰箭冻结与之碰撞的玩家一样)这是有问题的,因为如果两个设备都看到碰撞怎么办。这意味着两个设备都在互相发送碰撞消息,并再次应用碰撞。

为了解决这个问题,我为每个 spell/attack 添加了一个 "spell number",当发生碰撞时,我将这个数字与发生碰撞的玩家一起保存为 "last collision spell number"。因此,如果该法术发生碰撞,玩家就会知道 he/she 已经与该特定对象发生碰撞,因此碰撞逻辑不会 运行 两次。