2012-08-27 12 views
6

Ho un gioco a turni a 2 giocatori, iOS che utilizza il centro del gioco e GKTurnbasedMatch.Kit giochi iOS Partita basata su turni Partita programmata

Esiste un modo per ripetere a livello di programmazione un avversario dopo che una partita è finita?

Mi piacerebbe dare ai giocatori l'accesso con un solo pulsante per iniziare una nuova partita l'uno con l'altro.

Se non esiste un approccio a un solo pulsante, quali sono alcune potenziali alternative?

+1

Buone notizie! Questo è ora molto facile da fare con iOS6, basta usare la rivincita di GKTurnBasedMatchWithCompletionHandler. –

risposta

4

In effetti appare una completa soluzione di programmatico viene ignorato da Game Center. Un dolore, senza dubbio. Provare quanto segue nel @selector (doRematchTap) ... o qualche equivalente:

NSMutableArray *playerIds = [NSMutableArray array]; 
    GKTurnBasedParticipant *otherPlayer = /* Get the other player some way */; 
    GKTurnBasedParticipant *myParticipant = /* Get yourself a very similar way*/; 

    [playerIds addObject:myParticipant.playerID]; 
    if (otherPlayer.playerID) { 
     [playerIds addObject:otherPlayer.playerID]; 
    }// sanity check 

    GKMatchRequest *request = [[GKMatchRequest alloc] init]; 
    request.playersToInvite = playerIds; 
    request.minPlayers = 2; 
    request.maxPlayers = 2; 

    GKTurnBasedMatchmakerViewController *tbmcv = [[GKTurnBasedMatchmakerViewController alloc] initWithMatchRequest:request]; 
    tbmcv.showExistingMatches = NO; 
    tbmcv.turnBasedMatchmakerDelegate = /* Your normal delegate for the callbacks */; 

    [self presentViewController:tbmcv 
         animated:YES 
        completion:^{ 
         }]; 

importante notare la showExistingMatches = NO, che salterà il controller della vista a destra in modalità matchmaking con l'utente corretto pre-selezionati (sembra) e non mostrare le corrispondenze esistenti dell'utente.

+0

Grazie! Il trucco era impostare showExistingMathes su NO. Non è esattamente quello che volevo (l'utente deve ancora fare clic su "Avanti" e "Invia", ma consente una più facile ripetizione. –

+1

iOS6 ha una nuova API per eseguire una rivincita senza richiedere l'interfaccia del centro di gioco. GKTurnBasedMatch-> rematchWithCompletionHandler –

1

non ho l'intera soluzione, ma un idea per voi:

Ogni giocatore ha un unico giocatore-ID, che si può ottenere, se si memorizza via dopo un

didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID

Ora puoi avviare a livello di programmazione una nuova partita e invitare questo giocatore. Gli verrà chiesto se vuole una rivincita e poi puoi giocare di nuovo.

So che questo non è un granché di codice o consiglio concreto, ma forse sono sufficienti informazioni per trovare il resto nello GameKit Class Reference.

Mi chiedo se riesci a risolverlo, dimmi se l'hai fatto e buona fortuna!

Edit:

Ho cercato nel references e trovato questo:

- (void) loadPlayerData: (NSArray *) identifiers 

non ho provato io stesso, ma si dovrebbe ottenere il giocatore in questo modo ancora una volta, se si memorizzare il suo identificatore in una matrice e passarlo a questa funzione.

Spero che portano alcuni cambiamenti nel iOS6 per Game Center, che potete fare le vostre partite a livello di codice nel proprio modo ...

+0

Non penso che sia attualmente possibile. Il metodo che conosco per inviare una richiesta di corrispondenza a livello di codice è findMatchForRequest: withCompletionHandler. Ha la seguente dichiarazione nella sua documentazione: La proprietà playersToInvite della richiesta di corrispondenza viene ignorata; per invitare un determinato gruppo di giocatori alla partita, è necessario visualizzare l'interfaccia utente standard. –