2010-10-07 12 views
13

Non riesco proprio a capire come funziona. Quello che sto cercando di fare è lasciare che due giocatori giochino un gioco se un terzo giocatore si unisce a esso può immediatamente entrare nel gioco, se il quarto e ultimo giocatore si unisce può anche unirsi istantaneamente al gioco. Possono anche lasciare il gioco in qualsiasi momento per qualsiasi ragione, se ciò dovesse accadere ci dovrebbe essere uno spazio aperto per un'altra persona o per la stessa persona per riconnettersi. Questa è l'idea.Game Center Trovare una corrispondenza a livello di programmazione

Ora quello che ho ottenuto è il seguente. Autentico il player locale per ovvi motivi. Poi cerco per una partita in questo modo:

if (matchRequest) [matchRequest release]; 
matchRequest   = [[GKMatchRequest alloc] init]; 
matchRequest.minPlayers = 2; 
matchRequest.maxPlayers = 4; 

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) { 
    if (error) { 
     // An error occured 
    } else { 
     if (matchCurrent) [matchCurrent release]; 
     matchCurrent   = [match retain]; 
     matchCurrent.delegate = self; 
    } 
}]; 

Se eseguo questa parte su tre dispositivi diversi, due di loro troverà l'altro e il terzo è ancora alla ricerca. Così ho pensato dopo che la ricerca di find per la richiesta ha trovato la quantità minima di giocatori che verrà eseguita una volta. Quindi quello di cui avevo bisogno era un metodo che usasse il matchCurrent che ho trattenuto per aggiungere più giocatori. Fortunatamente quel metodo esisteva, ma come funzionerebbe? Quando lo chiamate in questo caso? Ho deciso di metterlo sotto un pulsante in modo da poterlo eseguire manualmente quando è stata trovata una corrispondenza.

Quello che ho scoperto è che quando ho premuto sul primo dispositivo, finalmente il terzo dispositivo poteva trovare la corrispondenza tra il primo e il secondo dispositivo. In effetti il ​​secondo e il terzo dispositivo contenevano gli ID player di ogni dispositivo coinvolto. Che è una buona cosa Ma ci sono due problemi.

  1. Quale dispositivo deve effettivamente chiamare il metodo addPlayersToMatch? E come puoi limitarlo a un dispositivo che esegue quel metodo? Inoltre quando dovresti chiamarlo?
  2. Perché sul dispositivo che chiama questo metodo non sono aggiornati gli ID giocatore?

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { 
        //matchCurrent.playerIDs is not updated?! 
    }]; 
    

    Attualmente sono aggiornati. Quando vedo gli ID giocatore visualizzati sul secondo e sul terzo dispositivo, aggiorno manualmente i valori matchCurrent.playerIDs sul dispositivo uno e improvvisamente riconosce il lettore. Tuttavia, anche il "doChangeState" per il giocatore non viene chiamato quando il nuovo giocatore viene scoperto sul dispositivo uno.

+0

È questo il basano su un modello client-server o di un modello p2p? Cosa viene utilizzato per inizializzare una connessione, tcp, udp, http? Dove si trovano i dati per i giocatori attualmente connessi? –

+3

"Quello che sto cercando di fare è consentire a due giocatori di giocare una partita se un terzo giocatore si unisce" - Puoi aggiungere un punto e virgola e virgole nella seconda e terza frase? Così com'è, nelle frasi run-on, è difficile dire se ogni if-clausola modifica una clausola indipendente precedente o successiva. – LarsH

risposta

0

vorrei suggerire che periodicamente (forse una volta al secondo o due) sondaggio per lo stato di altri giocatori, in modo da poter rilevare se qualcuno ha aderito, o di sinistra, per qualsiasi motivo. A meno che l'architettura di iPhone che stai usando già fornisce una funzione che gestisce quell'evento.

Sembra che si desideri trovare ulteriore documentazione e/o codice di esempio per il framework per più giocatori che si sta utilizzando.

1

Quale dispositivo deve effettivamente chiamare il metodo addPlayersToMatch ? E come può lo si limita a un dispositivo eseguendo tale metodo?

Si potrebbe risolvere questo problema avendo i dispositivi "disegnare cannucce". Ogni dispositivo genera un numero casuale, quindi lo invia agli altri. Il dispositivo con il numero più grande è il leader ed è quello che deve chiamare addPlayersToMatch. Se due dispositivi scelgono lo stesso numero, lancia i numeri e ricomincia da capo.

2

Utilizzo della classe GKMatchmaker per Game Center Apple iOS. Suppongo che tu stia utilizzando una connessione peer-to-peer, non ospitata.

La classe GKMatch fornisce all'utente l'array playerIDs.

@property(nonatomic, readonly) NSArray *playerIDs 

Questo è un elenco ordinato, per cui si potrebbe essere in grado di usarlo per selezionare il primo giocatore addPlayersToMatch chiamata.

Di seguito è riportata una documentazione.

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304

Problemi correlati