我正在制作一款基于2名玩家的游戏。如果这是第一轮并且尚未找到球员,我对如何发送球员命令感到有点困惑。
- (void)endTurnWithNextParticipants:(NSArray *)nextParticipants turnTimeout:(NSTimeInterval)timeout matchData:(NSData *)matchData completionHandler:(void (^)(NSError *error))completionHandler
答案 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)
{
....
}];
这是有效的,因为从实例化匹配的那一刻起,所有参与者时隙都存在,无论玩家是否填充了这些参与者时隙。那些未填充的插槽将处于“受邀”或“匹配”状态。当其中一个插槽冒泡到阵列的顶部,使其“轮流”时,游戏中心就会寻找被邀请者/自动匹配播放器以填充插槽并转弯。