iPhone - 在线多人游戏...了解机制

时间:2012-02-23 09:04:57

标签: iphone ios game-center

我正在开发一款在线多人游戏,但我正在努力使用Apple文档。 (我已经尝试过Ray Wenderlichs Part 1part 2的这些教程,但它们没有工作(匹配永远不会启动,因为邀请设备永远不会接受匹配接受)。

由于这个话题很多,我将创建一个问题,然后在必要时继续创建另一个问题。

我想创建一个在线多人游戏,让用户邀请1到3个人。所以,这将是一个2到4人匹配。游戏没有基于。它是实时的,用户之间传输的数据最少。

让我们从基本的东西开始。

1)我要做的第一件事是创建通知

if (self.gameCenterAvailable) {
    NSNotificationCenter *nc = 
    [NSNotificationCenter defaultCenter];
    [nc addObserver:self 
           selector:@selector(authenticationChanged) 
               name:GKPlayerAuthenticationDidChangeNotificationName 
             object:nil];

}

告知通知何时更改。发生这种情况时,authenticationChanged方法将触发......这里是

- (void)authenticationChanged {    

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;
        [self 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;
        [self presentModalViewController:mmvc animated:YES];
    }
};

}

我从Apple那里获取了这个代码。我的问题是这个。如果Apple说在用户通过身份验证后运行此代码,为什么要检查邀请或用户邀请?据我所知,用户尚未被邀请。除非当时没有执行代码,对吧?它只会坐在记忆中等待被叫,当邀请完成时,对吗?

如果是这种情况,我现在创建一个匹配的邀请

[self dismissModalViewControllerAnimated:NO];
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease]; 
request.minPlayers = minPlayers;     
request.maxPlayers = maxPlayers;
request.playersToInvite = self.pendingPlayersToInvite;

GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];    
mmvc.matchmakerDelegate = self;

[self presentModalViewController:mmvc animated:YES];

我选择邀请的所有用户都会看到一个窗口。假设第一个在邀请上点击ACCEPT。我的应用程序将触发哪种方法,如何获取用户身份以及如何知道是否所有用户都接受了?

感谢。

1 个答案:

答案 0 :(得分:4)

首先请注意,沙盒环境中的邀请往往工作不正常,因此我建议您首先让所有玩家搜索可用的匹配项。代码将是这样的:

GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = minPlayers;
request.maxPlayers = maxPlayers;

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request
                               withCompletionHandler:^(GKMatch *match, NSError *error) {
                                     if (error || !match) {
                                       // handle the error
                                     }
                                     else if (match != nil){
                                       // match found
                                     }}];
  }

然后你必须实现协议GKMatchDelegate。那里有一个方法可以为每个加入比赛的玩家和每个与之断开连接的玩家调用(在这个方法中你可以找到带有其playerID的用户身份):

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state {
    switch (state){
      case GKPlayerStateConnected: 
        if (match.expectedPlayerCount == 0) {
          // start the match
        }
        break;
      case GKPlayerStateDisconnected:
        // remove the player from the match, notify other players, etc
        break;
    } 
}

关于您的第一个问题,authenticationChanged上的代码仅注册这些方法的处理程序,这意味着通知到达时将调用的代码。

编辑:关于你评论的问题,如果比赛是通过邀请开始的,那么开始比赛的用户必须等到所有邀请被接受,或取消其中一些邀请,然后按开始匹配(或类似的东西) )在邀请屏幕上。在这种情况下,一旦接受邀请的所有玩家都连接到匹配,就会满足match.expectedPlayerCount == 0条件。 如果匹配是由AutoMatch启动的,那么Game Center会执行以下操作:一旦发现minPlayers等待开始匹配,它会将它们分配给匹配,然后再等几秒钟以查看它是否可以填充剩余的插槽。在某些时候,它将在minPlayers和maxPlayers之间与一定数量的玩家开始比赛。然后只有在所有玩家有效加入比赛后才会满足条件match.expectedPlayerCount == 0,但请注意,当决定开始比赛时,预计该比赛的球员数量已由比赛中心确定。 / p>