2014-02-18 2 views
1

나는 정확하게 2 명의 플레이어를 기반으로하는 턴입니다. 첫 라운드이고 플레이어가 아직 발견되지 않은 경우 플레이어 주문을 보내는 방법에 대해 다소 혼란 스럽습니다.턴 기반 게임 센터 게임의 첫 번째 턴 시작

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

답변

0

그것은 항상 reference에 지정된 findMatchForRequest: withCompletionHandler:에 의해 반환 된 Match 개체의 로컬 플레이어의 차례입니다.

플레이어가 경기에 배치되는 방법과 관계없이 로컬 플레이어 은 항상 반환 된 경기의 현재 참가자입니다.

더 구체적으로 귀하의 질문에, 일치하는 객체의 matchData 속성은 로컬 플레이어가 아직 일치되지 않은 경우 nil 될 것입니다. 턴을 커밋하기 전에 matchData을 할당 할 것이므로 다른 플레이어는 nil 대신 해당 데이터를 볼 수 있습니다.

Game Center 턴 기반 매치 인프라를 설계함으로써 플레이어 순서를 제어하지 않습니다. findMatchForRequest: withCompletionHandler:이 이미 턴을 한 적이있는 경기를 발견하면 두 번째입니다. 빈 일치를 찾으면 처음입니다.

+0

그 설명에 감사드립니다. 여전히 2 인 게임이고 내 상대가없는 경우 내 nextParticipants 배열에 포함되어야 할 것이 무엇인지 여전히 내 머리를 감쌀 수없는 질문이 있습니다. –

+0

'participants'속성에있는 로컬 플레이어가 아닌 항목입니다. –

0

이 오래된 스레드,하지만 난 최근에 관련된 무언가 고생하기 때문에, 나는이 통과 다른 사람 도움이 될 생각 :

참가자가 점유 여부 게임 슬롯이됩니다. 플레이어는 발견 된 슬롯을 채 웁니다. 전체 "It 's always my turn"은 다음과 같습니다 : 당신은 미리 설정된 참가자 수 (슬롯)로 게임을하고 있지만 슬롯이 아직 채워지지 않았을 수 있습니다. 이렇게하면 빈 참가자 필드에서 NULL을 반환하기 때문에 사용자에게 정보를 표시하는 것이 어렵고 이러한 상황을 정상적으로 처리해야합니다. 첫 번째 턴에서 후속 사용자는 각 선행 플레이어가 차례가 될 때까지 초대되었음을 알지조차 모릅니다. 턴을 걸면 게임 플레이에서 스팀이 빠져 나와 이 표시되고은 재생할 수 없기 때문에 초대 대상자가 감소합니다. IMO, 모델은 automatch에서만 실행 가능합니다. 친구를 게임에 초대 할 때 사용자 경험이 마음에 들지 않습니다. 그러나 그것이 그 방법입니다.

차례를 끝내려면 기본적으로 match.participants 배열을 가져 와서 현재 (일명 로컬) 플레이어를 목록의 끝으로 이동하십시오. match.participants를 직접 편집하지 마십시오. 모든 종류의 박편이 만들어집니다. 대신 새로운 배열을 만들고 원하는 순서대로 항목을 삽입하십시오.

[theMatch endTurnWithNextParticipants:nextParticipants 
           turnTimeout:timeOutSeconds      
           matchData:updatedMatchData 
         completionHandler:^(NSError *error) 
    { 
      .... 
    }]; 
참가자 슬롯이 모두 존재하기 때문에이 순간 경기에서 작동

: 다음과 같은 턴을 종료

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]; 
     } 
    } 

: 나는 원래 레이 Wenderlich 사이트에서 나온 생각이 코드를 사용 플레이어가 해당 참가자 슬롯을 채웠는지 여부에 관계없이 인스턴스화됩니다. 채워지지 않은 슬롯은 "초대 됨"또는 "일치"상태가됩니다. 그 슬롯 중 하나가 배열의 맨 위로 거품을 내면서 "자신의 차례"로 만들면 게임 센터는 초대받은 사람/자동 완성 플레이어가 슬롯을 채우고 차례를 찾아 보게됩니다.