2014-02-18 47 views
1

我有一个游戏,我正在开发基于2个玩家之间的回合。如果这是第一轮并且还没有找到球员,我对如何发送球员命令感到困惑。开始第一回合的Turn Based Game Center游戏

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

回答

0

它始终是当地玩家的回合中作为reference指定由findMatchForRequest: withCompletionHandler:返回的匹配对象。

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

更具体到你的问题,那场比赛对象的matchData属性将在本地播放器还没有一致的情况nil。由于您在转牌前将分配matchData,因此其他玩家将会看到该数据而不是nil

通过设计Game Center基于回合的比赛基础设施,您不会控制玩家顺序。如果findMatchForRequest: withCompletionHandler:发现某人已经轮到一场比赛,那么你就是第二名。如果它找到空匹配,你是第一个。

+0

感谢您的解释。我仍然无法包裹头脑的问题是我的下一个参与者数组应包含哪些内容,如果这仅仅是一个双人游戏而我的对手是零。 –

+0

这是“参与者”属性中不是本地玩家的项目。 –

0

这是一个古老的线程,但因为我最近与此相关的一些挣扎,我想这可能帮助其他人谁通过:

参加者插槽的比赛中,是否占用。玩家填补这些插槽,因为他们被发现。整个“总是轮到我”的事情等同于:您正在使用预设数量的参与者(插槽)进行游戏,但这些插槽可能尚未填充。这使得在某些情况下向用户显示信息非常困难,因为您只是从空的参与者字段中获得空值,而且您需要正常处理这些情况。在第一回合中,后来的用户甚至不知道他们已经被邀请,直到每个前面的玩家转牌。当你轮到你时,你需要从你的游戏中取出蒸汽,然后你的被邀请者因为不能玩而拒绝。国际海事组织,该模型只适用于自动匹配。邀请朋友参加比赛时,我不太喜欢用户体验。但是,就是这样。

因此,为了结束转弯,您基本上需要带上您的match.participants数组并将当前(又名本地)球员移动到列表的末尾。不要试图直接编辑match.participants,这会导致各种片状。相反,建立一个新的数组并按照你想要的顺序注入项目。我用这个代码,我认为最初来自雷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) 
    { 
      .... 
    }]; 

这工作,因为所有的参与者槽的存在,从目前看比赛被实例化,无论玩家是否已经填充了这些参与者时隙。这些未填充的插槽将处于“受邀”或“匹配”状态。当其中一个插槽泡泡到阵列的顶部时,让它“轮到”,然后游戏中心去寻找被邀请者/自动匹配的玩家来填充插槽并轮流。

相关问题