首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS游戏中心游戏不同步

iOS游戏中心游戏不同步
EN

Stack Overflow用户
提问于 2015-10-04 03:26:15
回答 1查看 119关注 0票数 3

我一直在为iOS构建一个游戏中心游戏,到目前为止它工作得很好。我终于开始测试这个游戏了,而且(很明显)有一些延迟,这导致了游戏的不同步。

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

所以问题是,当我和我的兄弟比赛时,由于延迟,我的游戏说我还有40人健康,而他只剩下0,而在他的设备上,游戏说我有0,他有20。

这意味着攻击发生在一个设备上(根据字符/火球的位置),而不是在另一个设备上。反之亦然。

我目前正在使用默认的对等游戏中心架构。使用客户端服务器架构(一个人成为服务器)会解决这个不同步的问题吗?

如果没有,我对游戏工具包API还有其他选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-06 02:32:18

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

注:这将是一个相对较长的答案。

我实现的一件事是在一些不像其他数据传输那么关键的数据传输中使用udp。例如,由于我每秒钟发送10次移动数据,所以我想如果10次中的1或2偶尔丢失一次就可以了。

现在讲到实际问题:

因此,所发生的事情如下--因为我使用的是p2p架构,所以当两个客户端看到游戏“世界”时都会有延迟。这意味着在我的设备上,我看到敌人的位置被延迟了100到200毫秒。(因此,他过去曾在那里待过100至200毫秒)。

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

解决方案

我想出来的是,当任何一个设备看到碰撞时,都会向另一个玩家发送信息。记住,每个设备都不知道对方是否看到了碰撞。因此,我无法知道这两种设备是否都看到了碰撞,或者只有1,而另一种则认为攻击是被回避的。

这意味着每次发生碰撞时,我都要向其他玩家发送一个信息。现在,由于我设计游戏的方式,当碰撞被发送时,我会自动应用碰撞事件(意思是,所造成的伤害,发生的抛射效应--就像冰栓冻结了它与玩家的碰撞)--这是有问题的,因为如果两个设备都看到了碰撞,怎么办?这意味着两个设备都在相互发送一条碰撞消息,并再次应用冲突。

为了解决这个问题,我在每个法术/攻击中添加了一个“拼写号”,当碰撞发生时,我将这个数字保存在与碰撞发生的玩家之间,作为“最后一次碰撞咒语号”。因此,如果与该咒语发生碰撞,玩家知道他/她已经与特定的对象发生了碰撞,所以碰撞逻辑不会运行两次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32929731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档