1

我正在开发一款基于 2 名玩家的回合制游戏。如果这是第一轮并且尚未找到玩家,我对于如何发送玩家订单有点困惑。

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

2 回答 2

0

总是轮到本地玩家轮到由referencefindMatchForRequest: withCompletionHandler:中指定的返回的匹配对象。

无论玩家在比赛中的位置如何,本地玩家始终是返回比赛中的当前参与者。

更具体地说,对于您的问题,该matchData匹配对象的属性将nil在本地玩家尚未匹配的情况下。由于您将matchData在提交回合之前分配,因此其他玩家将看到该数据而不是nil

通过 Game Center 回合制比赛基础设施的设计,您无法控制玩家顺序。如果findMatchForRequest: withCompletionHandler:找到一个已经有人转弯的比赛,你是第二名。如果它找到一个空匹配,你是第一个。

于 2014-02-18T18:01:03.483 回答
0

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

参与者是游戏中的位置,无论是否被占用。玩家在找到时填补这些位置。整个“总是轮到我”的事情等同于:您正在使用具有预设数量的参与者(插槽)的游戏进行操作,但这些插槽可能尚未填满。这使得在某些情况下向用户显示信息非常困难,因为您只是从空的参与者字段中返回 NULL,并且您需要优雅地处理这些情况。在第一个回合,后续用户甚至不知道他们已被邀请,直到每个前面的玩家都轮到过。当你转弯时,有点让你的游戏失去动力你的被邀请者拒绝了,因为他们不能玩。IMO,该模型仅适用于自动匹配。我不太喜欢邀请朋友参加比赛时的用户体验。但是,事情就是这样。

所以,为了结束一个回合,你基本上拿你的 match.participants 数组并将当前(又名本地)玩家移动到列表的末尾。不要尝试直接编辑 match.participants ,这会导致各种片状。相反,创建一个新数组并按照您想要的顺序注入项目。我使用了这段代码,我认为它最初来自 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)
    {
           ....
    }];

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

于 2015-03-08T15:43:02.130 回答