2014-02-18 44 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) 
    { 
      .... 
    }]; 

這工作,因爲所有的參與者槽的存在,從目前看比賽被實例化,無論玩家是否已經填充了這些參與者時隙。這些未填充的插槽將處於「受邀」或「匹配」狀態。當其中一個插槽泡泡到陣列的頂部時,讓它「輪到」,然後遊戲中心去尋找被邀請者/自動匹配的玩家來填充插槽並輪流。

相關問題