2010-12-02 14 views
4

Hallo, ich bin ein neuer Bie im Game Center für iOS. Ich versuche, die Multiplayer-Funktion mit Übereinstimmungen zu meinem Spiel hinzuzufügen und der Dokumentation zu folgen.Game Center Multiplayer mit GKMatch, aber scheint nicht verbunden werden

Bisher habe ich einen Punkt erreicht, wo 2 meiner Clients erfolgreich eine Übereinstimmung erhalten können, d. H. Der matchmakerViewController: didFindMatch-Callback wird aufgerufen und ein GKMatch-Objekt wird geliefert.

Aber danach scheint ich dort für immer festgefahren zu sein, weil ich gemäß der Dokumentation warten muss, bis alle Spieler (2 in meinem Fall) tatsächlich verbunden sind, bevor ich mein Spiel starte. Aber es scheint die Übereinstimmung: player: didChangeState Callback wird nie aufgerufen, um eine erfolgreiche Verbindung anzuzeigen. Nun, ich bin mir sicher, dass meine Kunden alle im gleichen WLAN-Netzwerk sind (oder ist es ein Muss?) Könnte mich jemand in diesem Fall aufklären? Muss ich irgendwelche zusätzlichen Dinge tun, um die Clients zu verbinden? Vielen Dank für die Hilfe!

+1

Einige Updates zu dem Problem, ich habe schließlich eine Wireshark Erfassung aller Verkehr, und ich fand gerade heraus, dass Game Center STUN verwendet, um Router/NAT/Firewalls zu überwinden, und indem Sie einen Blick auf den RFC, es sagt "STUN funktioniert nicht, wenn es verwendet wird, um eine Adresse zu erhalten, um mit einem Peer zu kommunizieren, der zufällig hinter demselben NAT ist." OK, ich denke, das könnte die Wurzel meines Problems sein, zwei meiner Kunden sind beide in das private Netzwerk (192.168.2.x) eines WLAN-Routers. Aber ich bin nicht sicher, was der beste Weg ist, dies zu überwinden, wenn ich die Tests mache .... irgendwelche Ideen? –

+3

Ich habe das gleiche Problem wie Sie, aber ich glaube nicht, dass diese STUN-Frage, die Sie oben erwähnt haben, das Problem ist, da ich meine Tests mit Geräten durchführe, die an zwei verschiedene NAT-Netzwerke angeschlossen sind. – thomdask

Antwort

0

Stellen Sie sicher, dass Sie Ihre Klasse als Delegat für GKSession festgelegt haben. Die Klasse muss das Protokoll GKSessionDelegate implementieren ... andernfalls wird sie diesen Rückruf niemals empfangen. Hier ist die protocol reference. Hoffe das hilft!

+0

Danke Sam, aber ich implementiere Multiplay mit Match anstelle von Peer-to-Peer. Also habe ich das GKMatchDelegate-Protokoll und GKMatchmakerViewControllerDelegate korrekt implementiert und gesetzt, aber anscheinend konnte ich den match: player: didChangeState-Callback nicht empfangen. –

2

Wenn Sie das GKMatch-Objekt erhalten, überprüfen Sie die expectedPlayerCount-Eigenschaft. Es ist möglich, dass der andere Spieler bereits verbunden ist und somit keine Übereinstimmung erreicht wird: player: didChangeState für den Delegaten.

+0

Derselbe Code funktioniert im selben NAT, aber nicht in verschiedenen. Das ist also nicht der Fall. – thomdask

+0

Haben Sie die Immobilie überprüft? Dies ist vollständig zeitbezogen und wird sich daher in verschiedenen Netzwerken unterschiedlich verhalten. – nrp

1

Ich hatte das gleiche Problem mit einem Freund. Die Lösung war ziemlich seltsam, aber es funktioniert danach. Auf allen Geräten müssen Sie die Benachrichtigungen (Sounds/Alerts/Badges) für das Game Center in den Einstellungen/Benachrichtigungen aktivieren. Danach konnten wir eine Verbindung herstellen und erhielten ein Match-Objekt

+0

Ich weiß nicht, ob das funktioniert, da ich meine Entwicklungstests mit iOS-Simulatoren durchführe. Eine läuft auf meiner nativen Maschine und die zweite läuft in vmware auf dem os x Server. Benachrichtigungen sind nicht im ios-Simulator enthalten. – thomdask

3

Also ich lief in das und die Lösung (für mich) war etwas peinlich. Ich hatte einen Teil des Codes aus den Apple-Dokumenten kopiert und eingefügt ... und sie haben einen offensichtlichen Schritt ausgelassen. Sie setzen den Delegierten des Matches nie richtig ein!

Mein Code ist jetzt:

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match { 
[self dismissModalViewControllerAnimated:YES]; 
self.myMatch = match; // Use a retaining property to retain the match. 
self.myMatch.delegate = self; // THIS LINE WAS MISSING IN THE APPLE DOCS. DOH. 
// Start the game using the match. 
NSLog(@"Match started! Expected Player Count:%d %@",match.expectedPlayerCount, match.playerIDs);} 

Sobald ich die Spieldelegierten tatsächlich einstellen, werden die Funktionen aufgerufen. Do.

+0

Dank dir habe ich VERBINDUNG VERBOTEN !!!! Vielen Dank! – Voldemort

1

In Ihrem Rückruf matchmakerViewController: didFindMatch

diesen Code hinzufügen, dann werden Sie den Rückruf "match: Spieler: didChangeState" sehen durch GC genannt wird

GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease]; 
    request.minPlayers = 2; 
    request.maxPlayers = 2; 
    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:match matchRequest:request completionHandler:^(NSError* error) { 
     if(error) 
      NSLog(@"Error adding player: %@", [error localizedDescription]); 
    }]; 
1

Es war die ganze Zeit arbeiten. Der einzige Unterschied ist, dass ... wenn Sie Einladungen verwenden, das Ereignis "didChangeState" nicht aufgerufen wird. Sie sind ohne vorherige Ankündigung verbunden und Sie können mit dem Empfang von Daten beginnen. Ich habe nie versucht, Daten zu senden/zu empfangen ... weil ich das Ereignis zuerst erwartet habe, aber ich habe versehentlich etwas aus Versehen gesendet, und es hat funktioniert. :)

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *) match {  
    //Dismiss window 
    [self dismissModalViewControllerAnimated:YES]; 

    //Retain match 
    self.myMatch = match; 

    //Delegate 
    myMatch.delegate = self; 


    //Flag 
    matchStarted = TRUE; 

    //Other stuff 
} 

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state { 
    //This code gets called only on auto-match 
} 

Der obige Code funktioniert wie erwartet.

+0

+1, weil dies eine Antwort ist;) – phlebotinum

Verwandte Themen