我一直在为iOS构建一款游戏中心游戏,到目前为止效果很好。我终于开始测试游戏和theres(显然)一些延迟,这导致游戏不同步。
基本上我有2个玩家,每个玩家控制一个游戏角色。游戏角色可以射击火球和冰球等。这些攻击会造成伤害,并且会产生影响。例如。如果接触,冰球效果会使对手冻结3秒钟。火球会造成持续3秒的火焰伤害。
所以问题是,当我和我的兄弟一起玩时,由于延迟,我的游戏说我剩下40个健康状态并且他下降到0,而在他的设备上,游戏说我有0并且他有20。
这意味着攻击在一台设备上注册/冲突(基于角色/火球的位置)而不是另一台设备。反之亦然。
我目前正在使用默认的点对点游戏中心架构。使用客户端 - 服务器架构(一个人成为服务器)会解决这个不同步的问题吗?
如果没有,我对游戏套件API有哪些其他选择?
答案 0 :(得分:1)
我找到了解决这个问题的方法。
注意:这将是一个相对较长的答案。
我实施的一件事是使用udp
进行一些不像其他人那样重要的数据传输。例如,由于我每秒发送的动作数据大约是10次,所以如果10个中的1个或2个偶尔会丢失,我认为它没问题。
现在解决实际问题:
所以发生了以下事情 - 因为我使用的是p2p
架构,当他们看到游戏“世界”时,两个客户都会有延迟。这意味着在我的设备上,我看到敌方玩家处于延迟100-200毫秒的位置。 (所以他过去实际上有100-200毫秒)。
问题在于,当我向敌人射击时,我发现碰撞,如果碰撞正好在他的精灵(他的脚或头部)的边缘,在他的屏幕上,他已经过了那个位置 - 加 - 我的火球在他的屏幕上显示延迟了100ms。这意味着在他的设备上,他能够躲避我的攻击。这可能会发生随机次数,但我猜它可能会低于30%的时间。 70%,两个设备都看到了碰撞。
解决方案
我想到的是当任一设备发现碰撞时向其他玩家发送消息。请记住,每个设备都不知道对方是否看到了碰撞。所以我无法知道两个设备是否发生了碰撞,或者只看到了一个,而另一个看到了这次攻击被躲过了。
这意味着每次碰撞时我都必须向其他玩家发送消息。现在,由于我构建我的游戏的方式,当发送碰撞时,我会自动应用碰撞事件(意思是,造成的伤害,发生的抛射效果 - 就像冰螺栓冻结它碰撞的玩家)是有问题的,因为如果两个设备都看到了碰撞。这意味着两个设备互相发送冲突消息,并再次应用冲突。
为了解决这个问题,我为每个法术/攻击添加了一个“法术编号”,当发生碰撞时,我将这个数字与发生碰撞的玩家保存为“最后一次碰撞法术编号”。因此,如果与该咒语发生碰撞,则玩家知道他/她已经与该特定对象发生碰撞,因此碰撞逻辑不会运行两次。