我的点对点 iPhone 游戏运行良好。我创建了一个表格来显示可用的对等点,我可以连接(到目前为止)多达四个设备并从头到尾玩一整轮游戏:
但这是我的问题...
我GKSession
在一台设备上GKSessionModeClient
用GKSessionModeServer
. 客户端看到服务器,选择连接它,然后服务器批准。然后,当所有对等点都连接时,服务器可以点击“开始游戏”。
如果——在服务器开始游戏之前——客户端点击“返回”按钮转到上一个屏幕,自定义对等选择器显示从视图中弹出并且会话被“销毁”......
[_gkSession disconnectFromAllPeers];
[_gkSession setAvailable:NO];
[_gkSession setDelegate:nil];
[_gkSession setDataReceiveHandler:nil withContext:nil];
现在,如果客户端返回对等选择器并再次加入服务器,我会再次获得一个GKSessionStateConnected
状态,但是当我sendDataToAllPeers:
什么都没有到达客户端时。如果一台设备开始游戏并且三台设备加入,然后服务器点击“开始游戏”,它可以完美运行。但是如果有人在游戏开始前退出,那么重新创建会话并加入会失败。
有任何想法吗?在这一点上,我能想到的唯一技巧是阻止用户在连接到服务器后点击“返回”,但这很糟糕……如果他们改变主意,他们将不得不完全退出应用程序。除了这个连接问题之外,我对这个应用程序正在运行以及我喜欢它,我对此束手无策。一种边缘情况,但我可以看到如果用户无法启动游戏而无需重新启动应用程序以清除会话,他们会感到恼火。
当我可以的时候,我会把它变成一个赏金。请帮忙!
编辑@byteclub
- 如果客户端在游戏开始前离开,服务器是否正确清理了所有相关的数据结构?
如果客户端在服务器接受他们的连接后离开游戏大厅,则客户端的会话被破坏:
- (void)destroySession
{
trace(@"destroySession");
self.gameDelegate = nil;
self.lobbyDelegate = nil;
[_gkSession disconnectFromAllPeers];
[_gkSession setAvailable:NO];
[_gkSession setDelegate:nil];
[_gkSession setDataReceiveHandler:nil withContext:nil];
[_peerList removeAllObjects];
}
不过,我不会在服务器设备上调用任何 disconnectFromPeers 方法。
* Is the client-disconnect-cleanup procedure different for cases when the
游戏已经开始了吗?
稍微,如果客户端断开连接,那么每个人都会收到“对等退出”通知并且游戏结束。在这种情况下,我不担心重新连接。主要是在游戏大厅,客户端可以“取消”回到问题所在的主屏幕。在这种情况下,客户端的会话被破坏。如果他们随后返回大厅并分配了一个新的GKSession,他们仍然可以连接到服务器,但是一旦连接,sendDataToAllPeers 将不再工作。
* Do you still have a problem if, before reconnecting, you restart the
客户端,但让服务器按原样运行?
客户端可以在任何情况下重新连接。我可以退出,返回,重新启动应用程序并重新连接没有问题。除非服务器和客户端都重新启动,否则 sendDataToPeers 会失败。
* Do you completely destroy GKSession object on the client side
当用户点击“返回”时?
是的。(见上面的代码)
我意识到从远处进行调试可能很疯狂,但是如果您对我可以研究的内容有任何建议,我将不胜感激。