游戏套件点对点

6
我编写了一个使用GameKit点对点连接的炸弹人应用程序。问题在于一段时间后游戏不再同步。
我查看了GKTanks的示例代码并使用了他们的模型。在我的游戏中,对等方之间没有客户端/服务器关系,因此我没有使用其中一个。两个对等方都维护一个游戏状态,根据接收到的数据进行更新。
我有一个NSTimer用于在每帧运行游戏循环。 NSTimers不同步,因此有时游戏状态会变得不同,例如:玩家几乎同时拾取能量增强物,由于发送数据需要一些时间,所以两个玩家都获得了该能量增强物。
我会感激任何使应用程序正常工作的想法。我正在考虑重写代码以使用客户端-服务器,但我不确定这是否是个好主意...但愿可以。
谢谢!
编辑:我更改了代码,随机选择一个玩家作为主机。 每当玩家放置炸弹时,他都会询问服务器在哪里放置它。服务器返回玩家位置(如在服务器上看到的)然后告诉玩家在哪里放置炸弹。
对于能量增强物,服务器检查玩家是否拾取了能量增强物,如果是,则发送通知包。
现在出现了另一个问题。设备之间的延迟很高(我正在使用蓝牙连接)。在客户端点击按钮放置炸弹后,需要大约0.2秒才能放置炸弹。
我正在可靠地发送所有数据。我这样做对吗?
2个回答

5
最好的情况是你想要一个主机-客户端的关系,在这种情况下,只有主机可以操作游戏状态,所以在你的情况下是这样的:
两名玩家都抢夺道具。
主机先拿到了它。
它被注册并主机收到了道具。
同时,玩家#2也拿到了道具,并将动作发送给了主机。
主机告诉玩家#2,道具已经消失了。
你的情况是受到数据包丢失的影响而容易出现不同步的问题。
使用主机-客户端关系就不会发生这种情况,唯一的问题是主机总是占据优势,尤其是在设备之间的延迟增加时,特别是在智能手机上。
在像炸弹人这样的游戏中,完全有可能每次发生变化时发送整个游戏状态而不是执行的操作,以确保两个设备同步。
总之:两个用户都有自己的游戏状态,但只有主机可以操作两个状态。

1

你应该做的:

  • 其中一个设备是主机,另一个是客户端
  • 主机处理所有游戏状态并做出决策,然后将整个游戏状态发送给客户端
  • 客户端获取游戏状态并根据其绘制所有内容-它不做任何决策(谁选择了炸弹,炸弹是否爆炸等)
  • 客户端只向主机发送输入(按左、右、暂停等)

就是这样。如果您尝试在两台计算机上做出决策,您将遇到很大的麻烦,因为要保持它们同步。


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