我正在尝试使用自定义UI(没有GKMatchMakerViewController)实现实时多人游戏 . 我正在使用startBrowsingForNearbyPlayersWithReachableHandler:^(NSString * playerID,BOOL可达)来查找本地播放器,然后使用GKMatchmaker单例(我已经发起)启动匹配请求 .
这是我遇到麻烦的地方 . 当我发送请求时,完成处理程序几乎立即触发,没有错误,并且它返回的匹配具有预期的玩家计数为零 . 同时,其他玩家肯定没有回应该请求
相关守则:
- (void) findMatch {
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = NUM_PLAYERS_PER_MATCH; //2
request.maxPlayers = NUM_PLAYERS_PER_MATCH; //2
if (nil != self.playersToInvite) {
// we always successfully get in this if-statement
request.playersToInvite = self.playersToInvite;
request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response) {
[self.delegate updateUIForPlayer: playerID accepted: (response == GKInviteeResponseAccepted)];
};
}
request.inviteMessage = @"Let's Play!";
[self.matchmaker findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error) {
// Print the error
NSLog(@"%@", error.localizedDescription);
} else
if (match != nil) {
self.currentMatch = match;
self.currentMatch.delegate = self;
// All players are connected
if (match.expectedPlayerCount == 0) {
// start match
[self startMatch];
}
[self stopLookingForPlayers];
}
}];
}
我从之前的一个问题(iOS Gamecenter Programmatic Matchmaking)知道我需要包含这个:
- (void)matchForInvite:(GKInvite *)invite completionHandler:(void (^)(GKMatch *match, NSError *error))completionHandler
在上面的代码,但我不知道应该包括在哪里 . 我已经尝试了GKMatchRequest inviteeResponseHandler,并在matchmaker finMatchForRequest:withCompletionHandler中无济于事 . 发生的行为是匹配器立即返回匹配(甚至在被邀请者被邀请之前)并且即使在被邀请者点击匹配邀请之后也从未调用matchRequest inviteeResponseHandler .
有人可以就此提出建议吗?谢谢 .
...吉姆
1 回答
我今晚刚刚开始研究这个游戏 . 为了获得通信通道设置,您需要进行更多的协商 . 返回给邀请者的初始匹配正在等待被邀请者回复...这是我的过程只有两个玩家 . 以下是我的通信启动所执行的所有步骤 . 显然,此处不包含真正的错误处理:
首先,验证您的播放器
第二,在认证设置inviteHandler之后 . 像这样的东西:
第三,获取朋友playerIds列表(不是别名) .
第四,设置这样的GKMatchRequest ......我只邀请一位朋友:
五,使用请求调用findMatchForRequest:withCompletionHandler:这样的......
第六,这将请求发送给另一个玩家,如果他们接受来自第二步的“inviteHandler”则被调用 .
第七,来自第二步的“inviteHandler”获得了GKInvite的比赛!
第八,来自第四步的“inviteeResponseHandler”被召唤完成比赛!
第九,从GKMatchDelegate创建一个didChangeState来处理匹配的最终化 . 像这样的东西:
第十,这是我的sendMessage:
第十一,从GKMatchDelegate创建一个didReceiveData,如下所示:
第十二......好了,现在你已经开始运行了沟通渠道......做你想做的事......