如何在游戏中心接受邀请

And*_*kha 6 iphone multiplayer game-center

我正在尝试与Game Center实施邀请,有一件事我不明白.好的,我已经从一个设备向另一个设备发送了邀请.然后我在接收器上有一个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];

                     }
                 };
Run Code Online (Sandbox Code Playgroud)

嗯,这很好,但接下来呢?发件人设备显然正在等待某种标准类型的响应,因为它还会显示一条警告,告诉我如果我点按"立即播放",则会收到一些尚未接听的邀请.

那么我该如何接受邀请呢?我应该寄回什么样的数据(以及如何)?我究竟应该在接收器方面做些什么呢?点击"接受"后游戏是否应立即开始,或者我应首先关闭AlertView,然后点击"立即播放"?

Ray Wenderlich的教程说我应该选择第二种方式,但是当解除警报并点击"立即播放"时,发现发送方设备仍在等待响应并且不知道我已经接受了邀请.如果我此时点击"立即播放",那么,如上所述,它会显示一条警告,表示应用程序正在等待响应.所以,如果你曾经这样做过,请解释我应该怎么做.谢谢!

Jua*_*rre 5

  1. 我在加载游戏后立即注册邀请,并在收到邀请时致电代表
  2. 因此,inviteReceived会调用匹配器来解除游戏中心控制器并创建匹配
  3. 最后,当找到匹配时,connectionStatusChanged方法负责呈现所有游戏的视图,玩家和东西

这是代码:

我在加载游戏后立即注册邀请,并在收到邀请时致电代表:

- (void)registerInvites {
    [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
        self.pendingInvite = acceptedInvite;
        self.pendingPlayersToInvite = playersToInvite;
        [delegate inviteReceived];
    };
}
Run Code Online (Sandbox Code Playgroud)

所以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;
}
Run Code Online (Sandbox Code Playgroud)

最后,当找到匹配时,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];
    }
}
Run Code Online (Sandbox Code Playgroud)