Game Center Programmgesteuert eine Übereinstimmung finden

Ich kann einfach nicht herausfinden, wie das funktioniert. Was ich versuche, ist zuzulassen, dass zwei Spieler ein Spiel spielen, wenn sich ein dritter Spieler dem Spiel anschließt. Wenn sich der vierte und der letzte Spieler dem Spiel anschließen, können sie sich ebenfalls sofort dem Spiel anschließen. Sie können das Spiel auch jederzeit aus irgendeinem Grund verlassen. In diesem Fall sollte ein Bereich für eine andere Person oder für die Wiederherstellung der Verbindung durch dieselbe Person frei sein. Das ist die Idee

Nun, was ich habe, ist das Folgende. Ich authentifiziere den lokalen Spieler aus offensichtlichen Gründen. Dann suche ich nach einer Übereinstimmung wie folgt:

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

Wenn ich diesen Teil auf drei verschiedenen Geräten ausführe, werden sich zwei finden und das dritte sucht noch. Also dachte ich mir, nachdem der Such-Match für die Anfrage die Mindestanzahl an Spielern gefunden hat, wird er einmal ausgeführt. Was ich also brauchte, war eine Methode, die den matchCurrent verwendete, den ich beibehalten hatte, um weitere Spieler hinzuzufügen. Glücklicherweise existierte diese Methode, aber wie würde das funktionieren? Wann nennst du es in diesem Fall? Ich habe beschlossen, es unter einen Knopf zu legen, damit ich es manuell ausführen kann, wenn eine Übereinstimmung gefunden wurde.

Was ich herausgefunden habe, ist, dass, als ich es auf das erste Gerät drückte, das dritte Gerät endlich die Übereinstimmung finden konnte, in der sich das erste und das zweite Gerät befanden. Tatsächlich enthielten das zweite und das dritte Gerät die PlayerIDs aller beteiligten Geräte. Welches ist eine gute Sache. Es gibt aber zwei Probleme.

Welches Gerät sollte eigentlich die Methode addPlayersToMatch aufrufen? Und wie können Sie es auf ein Gerät beschränken, das diese Methode ausführt? Und wann sollten Sie es anrufen?

Warum werden auf dem Gerät, das diese Methode aufruft, die Player-IDs nicht aktualisiert?

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

Eigentlich werden sie aktualisiert. Wenn ich die PlayerIDs auf dem zweiten und dritten Gerät sehe, aktualisiere ich die matchCurrent.playerIDs auf Gerät eins manuell und plötzlich erkennt es den Player. Allerdings wird auch der 'didChangeState' für den Player nicht aufgerufen, wenn der neue Player auf dem ersten Gerät erkannt wird.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage