Ich habe gerade das funktioniert an meinem Spiel heute Abend. Es gibt mehr Verhandlungen, die Sie tun müssen, um den Kommunikationskanal einzurichten. Die anfängliche Übereinstimmung, die an den Inviter zurückgegeben wird, wartet darauf, dass der Eingeladene antwortet ... Hier ist mein Prozess mit nur zwei Spielern. Hier sind alle Schritte, die mein Kommunikations-Spin-Up durchführt. Offensichtlich keine wirkliche Fehlerbehandlung hier enthalten:
Erstens erkennen Sie echte Spieler
Zweitens direkt nach der Authentifizierung gesetzt inviteHandler. So etwas wie das:
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite* acceptedInvite, NSArray *playersToInvite)
{
if(acceptedInvite != nil)
{
// Get a match for the invite we obtained...
[[GKMatchmaker sharedMatchmaker] matchForInvite:acceptedInvite completionHandler:^(GKMatch *match, NSError *error)
{
if(match != nil)
{
[self disconnectMatch];
// Record the new match...
self.MM_gameCenterCurrentMatch = match;
self.MM_gameCenterCurrentMatch.delegate = self;
}
else if(error != nil)
{
NSLog(@"ERROR: From matchForInvite: %@", [error description]);
}
else
{
NSLog(@"ERROR: Unexpected return from matchForInvite...");
}
}];
}
};
Drittens, Holen Sie sich Ihre Liste der Freunde playerIds (nicht Alias).
Viertens Richten Sie Ihre GKMatchRequest so etwas wie dieses ... Ich lade nur einen Freund:
// Initialize the match request - Just targeting iOS 6 for now...
GKMatchRequest* request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = [NSArray arrayWithObject:player.playerID];
request.inviteMessage = @"Let's play!";
// This gets called when somebody accepts
request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response)
{
if (response == GKInviteeResponseAccepted)
{
//NSLog(@"DEBUG: Player Accepted: %@", playerID);
// Tell the infrastructure we are don matching and will start using the match
[[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:self.MM_gameCenterCurrentMatch];
}
};
Fünftens Verwenden Sie die Anfrage findMatchForRequest zu nennen: withCompletionHandler: so etwas wie dieses ...
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch* match, NSError *error) {
if (error)
{
NSLog(@"ERROR: Error makeMatch: %@", [error description]);
[self disconnectMatch];
}
else if (match != nil)
{
// Record the new match and set me up as the delegate...
self.MM_gameCenterCurrentMatch = match;
self.MM_gameCenterCurrentMatch.delegate = self;
// There will be no players until the players accept...
}
}];
Sechste, das sendet die Anfrage an den anderen Spieler und wenn sie akzeptieren, wird der "inviteHandler" aus dem zweiten Schritt aufgerufen.
Siebtens erhält der "inviteHandler" aus dem zweiten Schritt das Spiel für den GKInvite!
Achtzig, der "girlaineResponseHandler" aus dem vierten Schritt wird aufgerufen, der das Spiel beendet hat!
Neuntens, erstellen Sie einen didChangeState von GKMatchDelegate, um die Finalisierung der Übereinstimmung zu behandeln.Etwas wie folgt aus:
- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state{
switch (state)
{
case GKPlayerStateConnected:
// Handle a new player connection.
break;
case GKPlayerStateDisconnected:
// A player just disconnected.
break;
}
if (!self.matchStarted && match.expectedPlayerCount == 0)
{
self.matchStarted = YES;
// Handle initial match negotiation.
if (self.iAmHost && !self.sentInitialResponse)
{
self.sentInitialResponse = true;
// Send a hello log entry
[self sendMessage: [NSString stringWithFormat:@"Message from friend, 'Hello, thanks for accepting, you have connected with %@'", self.MM_gameCenterLocalPlayer.alias] toPlayersInMatch: [NSArray arrayWithObject:playerID]];
}
}}
Zehnter, hier ist mein nachrichts:
- (void) sendMessage:(NSString*)action toPlayersInMatch:(NSArray*) playerIds{
NSError* err = nil;
if (![self.MM_gameCenterCurrentMatch sendData:[action dataUsingEncoding:NSUTF8StringEncoding] toPlayers:playerIds withDataMode:GKMatchSendDataReliable error:&err])
{
if (err != nil)
{
NSLog(@"ERROR: Could not send action to players (%@): %@ (%d) - '%@'" ,[playersInMatch componentsJoinedByString:@","],[err localizedDescription],[err code], action);
}
else
{
NSLog(@"ERROR: Could not send action to players (%@): null error - '%@'",[playersInMatch componentsJoinedByString:@","], action);
}
}
else
{
NSLog(@"DEBUG: Message sent to players (%@) - '%@'",[playersInMatch componentsJoinedByString:@","], action);
}}
Elfte, erstellen Sie eine didReceiveData von GKMatchDelegate etwas wie folgt aus:
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID{
NSString* actionString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
// Send the initial response after we got the initial send from the
// invitee...
if (!self.iAmHost &&!self.sentInitialResponse)
{
self.sentInitialResponse = true;
// Send a hello log entry
[self sendMessage: [NSString stringWithFormat:@"Message from friend, 'Hello, thanks for inviting, you have connected with %@'", self.MM_gameCenterLocalPlayer.alias] toPlayersInMatch: [NSArray arrayWithObject:playerID]];
}
// Execute the action we were sent...
NSLog(actionString);}
Zwölfte ... Nun Sie Lassen Sie die Kommunikationskanäle laufen ... machen Sie, was immer Sie wollen ...
Wie haben Sie startBrowsingForNearbyPla bekommen? yersWithReachableHandler funktioniert? Ich bekomme nie einen Rückruf von ihm? – bobmoff