开始基于回合制游戏中心游戏的第一个回合

时间:2014-02-18 17:23:07

标签: ios game-center gkturnbasedmatch

我正在制作一款基于2名玩家的游戏。如果这是第一轮并且尚未找到球员,我对如何发送球员命令感到有点困惑。

- (void)endTurnWithNextParticipants:(NSArray *)nextParticipants turnTimeout:(NSTimeInterval)timeout matchData:(NSData *)matchData completionHandler:(void (^)(NSError *error))completionHandler

2 个答案:

答案 0 :(得分:0)

findMatchForRequest: withCompletionHandler:中指定的matchData返回的匹配对象始终是本地玩家的回合。

  

无论球员如何进入比赛,本地球员   始终是返回的比赛的当前参与者。

更具体地说,对于您的问题,在本地播放器尚未匹配的情况下,该匹配对象的nil属性将为matchData。由于您在转弯前指定nil,因此其他玩家将看到该数据而不是findMatchForRequest: withCompletionHandler:

通过设计Game Center回合制匹配基础设施,您无法控制玩家订单。如果{{1}}找到某人已经转过的匹配项,那么您就是第二名。如果找到空匹配,那么你就是第一个。

答案 1 :(得分:0)

这是一个老线程,但由于我最近在与此相关的事情上挣扎,我认为这可能会帮助其他人通过:

参与者是游戏中的位置,无论是否被占用。玩家会在找到这些插槽时填写这些插槽。整个“它总是轮到我”的东西等同于:你正在使用具有预设数量的参与者(插槽)的游戏进行操作,但这些插槽可能还没有被填充。这使得在某些情况下向用户显示信息真的很难,因为你只是从空的参与者字段中获取NULL,并且你需要优雅地处理这些情况。在第一回合,后续用户甚至不知道他们已被邀请,直到每个前面的玩家转弯。当你转弯时,你的游戏玩法会消耗掉蒸汽,然后你的被邀请者因为无法玩而拒绝。 IMO,该模型仅适用于自动匹配。邀请朋友参加比赛时,我真的不喜欢用户体验。但是,就是这样。

因此,为了结束转弯,您基本上会使用match.participants数组并将当前(也称为本地)播放器移动到列表的末尾。不要试图直接编辑match.participants,这将导致各种各样的flakiness。而是创建一个新数组并按所需顺序注入项目。我使用了这段代码,我认为最初来自Ray Wenderlich网站:

    NSMutableArray *nextParticipants = [NSMutableArray new];
    for (GKTurnBasedParticipant *participant in theMatch.participants)
    {
        if ([participant.player.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID])
        {
            [nextParticipants addObject:participant];
        }
        else
        {
            [nextParticipants insertObject:participant atIndex:0];
        }
    }
然后结束转弯:

    [theMatch endTurnWithNextParticipants:nextParticipants
                              turnTimeout:timeOutSeconds                     
                                matchData:updatedMatchData
                        completionHandler:^(NSError *error)
    {
           ....
    }];

这是有效的,因为从实例化匹配的那一刻起,所有参与者时隙都存在,无论玩家是否填充了这些参与者时隙。那些未填充的插槽将处于“受邀”或“匹配”状态。当其中一个插槽冒泡到阵列的顶部,使其“轮流”时,游戏中心就会寻找被邀请者/自动匹配播放器以填充插槽并转弯。