我正在尝试通过游戏中心实施邀请,但有一点我不明白。好的,我已从一台设备向另一台设备发送了邀请。然后我在接收器上有一个 UIAlertView 询问我是否愿意接受或拒绝邀请。当我接受它时,它的处理方式如下:
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite)
{
// Insert application-specific code here to clean up any games in progress.
if (acceptedInvite)
{
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
}
else if (playersToInvite)
{
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = 2;
request.maxPlayers = 4;
request.playersToInvite = playersToInvite;
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
}
};
嗯,那太好了,但是接下来呢?发送者设备显然正在等待某种标准类型的响应,因为它还显示一条警报,告诉我如果我点击“立即播放”,则有一些邀请尚未答复。
那么我该如何接受邀请呢?我应该发回什么样的数据(以及如何)?我在接收方到底应该做什么?游戏应该在点击“接受”后立即开始,还是应该先关闭 AlertView,然后点击“立即玩”?
Ray Wenderlich 的教程说我应该选择第二种方式,但是当解除警报并点击“立即播放”时,事实证明发送者设备仍在等待响应并且不知道我已经接受了邀请。如果我此时点击“立即播放”,那么正如我上面所说,它会显示一条警报,表明应用程序正在等待响应。因此,如果您曾经这样做过,请解释一下我应该做什么。谢谢!
- 游戏加载后我就注册邀请并致电
收到邀请时委托
- 因此inviteReceived会调用匹配器来取消比赛
中心控制器并创建匹配
- 最后,当找到匹配项时,该方法
connectionStatusChanged 负责呈现游戏的所有状态
观点、球员和其他东西
这是代码:
我在游戏加载后立即注册邀请,并在收到邀请后致电委托人:
- (void)registerInvites {
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
self.pendingInvite = acceptedInvite;
self.pendingPlayersToInvite = playersToInvite;
[delegate inviteReceived];
};
}
因此,inviteReceived 会调用匹配器来关闭游戏中心控制器并创建匹配:
- (void)inviteReceived {
[[GCMultiplayerHelper sharedInstance] findMatchWithMinPlayers:2 maxPlayers:2 viewController:(UIViewController*)[self.superview nextResponder] delegate:self];
}
- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController delegate:(id<GCMultiplayerHelperDelegate>)theDelegate {
if (!gameCenterAvailable) return;
matchStarted = NO;
self.match = nil;
self.presentingViewController = viewController;
delegate = theDelegate;
[presentingViewController dismissModalViewControllerAnimated:YES];
GKMatchmakerViewController *mmvc;
if (pendingInvite != nil) {
mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:pendingInvite] autorelease];
} else {
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = minPlayers;
request.maxPlayers = maxPlayers;
request.playersToInvite = pendingPlayersToInvite;
mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
}
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;
}
最后,当找到匹配时,connectionStatusChanged 方法负责显示所有游戏视图、玩家并开始匹配:
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch
{
self.match = theMatch;
match.delegate = self;
if (!matchStarted && match.expectedPlayerCount == 0) {
NSLog(@"Ready to start match! - didFindMatch");
[presentingViewController dismissModalViewControllerAnimated:YES];
[self.delegate connectionStatusChanged:CONNECTIONSUCCESS];
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)