我有一个Game Center应用程序。我成功连接了两个客户端,并且可以发送消息等。我现在正尝试使用[GKMatchmaker addPlayersToMatch]添加第3/4个客户端,如下所示...

- (void) findAdditionalPlayer
{
    GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
    request.minPlayers = 2;  // minPlayers = 3 doesn't work either
    request.maxPlayers = 4;

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:match matchRequest:request completionHandler:^(NSError *error)
    {
        if (error)
        {
            // Process the error.
            NSLog(@"Could not find additional player - %@", [error localizedDescription]);
        }
        else
        {
            NSLog(@"Find additional player expecting = %d", match.expectedPlayerCount);
        }
    }];
}


如果一个客户端(投票的服务器)呼叫findAdditionalPlayer,我将永远不会连接(另一客户端正在使用GKMatchmakerViewController)。奇怪的是,如果两个连接的客户端都调用findAddtionalPlayer,则我的完成代码块将执行(the match.expectedPlayerCount == 2),但是我的第三个客户端永远不会连接。

是否应该只有一个游戏客户端在上面调用此功能?该文档没有真正指定。

有人有使用addPlayersToMatch的示例吗?

最佳答案

以我的经验,对于2人游戏,两个玩家都应执行addPlayersToMatch,以使他们重新连接到游戏(并通过Game Center来回通信)。

如果两个客户端都调用findAdditionalPlayer,则这两个客户端可以连接,这是很有意义的,因为它们都在调用addPlayersToMatch。

如果您已经有2个玩家(例如A和B)玩游戏,并且想让第三个玩家(例如C)加入游戏,则必须:

在玩家A(邀请C)中:

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObject:playerC_id];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];


在玩家B中(邀请C):

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObject:playerC_id];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];


在播放器C中(邀请A和B):

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObjects:playerA_id, playerB_id, nil];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];


因此,重新加入比赛或向比赛添加新球员的机制似乎是:


当玩家检测到远程玩家已断开连接(或添加了一个全新的玩家)时,请创建一个新的比赛请求对象,在此新比赛请求的playersToInvite数组中仅包括断开连接/新玩家的ID,然后执行addPlayersToMatch。
当断开连接的播放器恢复播放时,创建一个新的匹配请求对象,将所有远程播放器的ID(您可能必须事先将它们存储在数组中,或者从GKMatch的playerIDs属性中获取它们)在其匹配请求的playersToInvite数组中并执行addPlayersToMatch用它。


换句话说,每个现有玩家都将新玩家添加到其匹配对象中,而新玩家会将所有现有玩家添加到其匹配对象中。

对于4人游戏(玩家A,B,C和D,其中玩家D是最新添加的玩家):
玩家A,B和C分别使用匹配请求对象执行其addPlayersToMatch调用,该对象的playerToInvite仅包含D的玩家ID。当玩家D用匹配请求对象执行其addPlayersToMatch调用时,该对象的playerToInvite数组包含A,B以及C的玩家ID。

关于iphone - 无法在iPhone/IOS 5上使用[GKMatchmaker addPlayersToMatch]添加其他播放器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8810691/

10-10 17:36