2011-10-27 110 views
5

我编写了一个使用gamekit点对点连接的炸弹人应用程序。问题是过了一段时间,游戏不再同步。游戏工具包点对点

我看了GKTanks的示例代码并使用了他们的模型。同伴之间没有客户端/服务器关系,所以我没有在我的游戏中使用它。两个同伴都维护一个他们根据收到的数据进行更新的游戏状态。

我有一个NSTimer用于在每一帧运行gameloop。 NSTimers不同步,因此有时候游戏状态会变得不同:例如,玩家几乎在同一时间选择加电,并且两者都获得加电,因为发送数据需要一段时间。

我将不胜感激关于使应用程序工作的任何想法。我正在考虑重写代码以使用客户端服务器,但我不确定它是否是个好主意...但是

谢谢!

编辑:我改变了代码,这样随机播放器被挑选为主机。每当玩家放置炸弹时,他都会询问服务器放置在哪里。服务器返回玩家位置(如服务器上所示),然后告诉玩家放置炸弹的位置。

对于通电服务器检查是否玩家拿起电源,如果他做了,它会发送一个数据包通知他。

现在又出现了另一个问题。设备之间的延迟很高(我正在使用蓝牙连接)。客户点击按钮放置炸弹后需要大约0.2秒的时间。

我正在可靠地发送所有数据。我做对了吗?

回答

4

好preferbly你需要一台主机与客户的关系,其中仅主机可以操控游戏状态,所以在你的情况将是:

双方球员冲向通电。 主持人首先捡起它。
它被注册并且主机接收到启动。
与此同时,玩家#2也接通电源,将动作发送给主机。
主机通知玩家#2开机已经消失。

与你的情况有关的事情你必然会从数据包丢失获得desynchs。
由于无法发生主机 - 客户端关系,唯一的问题是主机总是有一个优势,当设备间的延迟增加时,特别是在智能手机上,总是会变得更大。

在像炸弹人这样的游戏中,每次发生某种变化而不是执行的动作时发送整个游戏状态是完全合理的,这是为了确保两个设备同步。

总结一下:两个用户都有他们的游戏状态,但只有主持人可以操纵两者。

0

你应该做的:

  • 的设备之一是主机,另一种是客户端
  • 主机过程中的所有游戏状态并作出决定,然后将其发送整个游戏状态到客户端
  • 客户端获取游戏状态并根据它绘制所有内容 - 它不做任何决定(谁挑选炸弹,炸弹爆炸等)
  • 客户端只是向主机发送输入(按左,右,暂停等)

就是这样。如果你试图在两台机器上做出决定,你会遇到很大的麻烦,试图让它们保持同步。