问题
你想要侦测多人模式下玩家何时断开连接。
解决方案
实现和处理GKMatchDelegate类的match:player:didChangeState:托管消息。
讨论
在多人游戏中,一个玩家知道其它玩家的状态是重要的。此处的状态,是连接或断开连接。
假设你已经编写了一个赛车游戏,也使用了matchmaking。两个玩家连接后,开始了锦标赛的第一圈。突然,玩家#2断开了连接。此时,必须将这个消息通知给玩家#1,然后结束match,让玩家#1等待其它的邀请。
为获得玩家状态变更的通知,实现和处理GKMatchDelegate类的match:player:didChangeState:托管消息。参数player包含状体变更的玩家的ID;而didChangeState:参数(GKPlayerConnectionState类型),将包含下面的值之一:
GKPlayerStateUnknown
玩家状态不可知。在一个赛车游戏中,你可能想要临时地保持该玩家的汽车位置不变。
GKPlayerStateConnected
玩家连接。你可能想要显示一条消息(如“玩家2已连接, 出发吧!”)给本地玩家。
GKPlayerStateDisconnected
玩家断开连接。使用该状态决定是否要停止游戏、回到主菜单等待另一场match、临时暂停游戏等等。
你可以使用match对象的expectedPlayerCount实例方法获知还需要多个玩家才能开始游戏。比如,如果我们开始了一个需要两个玩家的游戏,然后,其中一个玩家断开了,则expectedPlayerCount将返回1,告诉我们这场游戏还需要一个玩家才能再次开始。在下面的代码中,假定我们在一个两人的match中,并且如果其中一人断开,我们就停止match。
/* The player state changed
(eg. connected or disconnected) */
- (void) match:(GKMatch *)match
player:(NSString *)playerID
didChangeState:(GKPlayerConnectionState)state{
switch (state){
case GKPlayerStateDisconnected:{
if ([match expectedPlayerCount] > 0){
[match disconnect];
}
break;
}
}
}