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.
- Quale dispositivo deve effettivamente chiamare il metodo addPlayersToMatch? E come puoi limitarlo a un dispositivo che esegue quel metodo? Inoltre quando dovresti chiamarlo?
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.
È 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? –
"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