Как говорит Сэм, новый способ сделать это — использовать протокол GKLocalPlayerListener. Сейчас подход обратный. В прошлом вы отправляли приглашения другим игрокам из части вашего приложения. Другая часть выслушала приглашение от другого игрока и ответила на него. Теперь вы используете matchMakerViewController или Game Center для отправки приглашений (как и раньше), но теперь вы ожидаете принятия этих приглашений. После этого Game Center вызывает didFindMatch, чтобы все началось. Если вы получили приглашение, Game Center запустит вашу игру, а затем вызовет didFindMatch для ее запуска.
Это мой код:
В моем файле .h протокол GKLocalPlayerListener:
@interface MNFStartupViewController : UIViewController<ADBannerViewDelegate, GKMatchmakerViewControllerDelegate, GKMatchDelegate, GKLocalPlayerListener, UIAlertViewDelegate>
в файле .m в моем блоке authenticationHandler после аутентификации локального игрока:
[[GKLocalPlayer localPlayer] registerListener:self];
Затем метод прослушивания принятия приглашения:
-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite{
//Called when another player accepts a match invite from the local player.
NSLog(@"didAcceptInvite was called: Player: %@ accepted our invitation", player);
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:invite];
mmvc.matchmakerDelegate = self;
[self presentViewController:mmvc animated:YES completion:nil];}
Теперь способ запустить игру из Game Center с набором игроков, выбранным в Game Center. Это сложно отладить, потому что вы не можете запустить игру в Game Center, одновременно запуская ее из Xcode (я так не думаю!), поэтому есть отладочный AlertView, который можно удалить.
-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite{
//Called when the local player starts a match with another player from Game Center
//Start of debugging logging and alerting
NSLog(@"In didRequestMatchWithPlayers for players: %@", playerIDsToInvite);
NSString *logString = [[NSString alloc] initWithFormat:@"didrequestMatchWithPlayers was called with player IDs: %@", playerIDsToInvite];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logging Alert" message:logString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
//End of debugging logging and alerting
//Create a match for the chosen players
GKMatchRequest *match = [[GKMatchRequest alloc]init];
match.playersToInvite = playerIDsToInvite;
//Create a matchmaking viewcontroller for that match
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc]initWithMatchRequest:match];
mmvc.matchmakerDelegate = self;
[self presentViewController:mmvc animated:YES completion:nil];}
Это способ начать весь процесс подбора игроков:
-(IBAction)setupMatch:(id)sender{
GKMatchmakerViewController *matchViewController = [[GKMatchmakerViewController alloc] initWithMatchRequest:matchRequest];
matchViewController.matchmakerDelegate = self;
[self presentViewController:matchViewController animated:YES completion:nil];}
Наконец, это метод, вызываемый Game Center, чтобы начать матч, когда все игроки подключены и готовы к игре. currentPlayer, currentMatch и hostingPlayer — это мои собственные свойства с очевидным использованием.
-(void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match{
//Called when GameCenter completes the auto matchmaking process
match.delegate = (id)self;
[self setCurrentMatch:match];
[self setCurrentPlayers:match.playerIDs];
NSLog(@"Match was found with players: %@, time to get on with the game.", self.currentPlayers);
//Use the built in features to decide which device should be the server.
self.hostingPlayer = [self chooseHostingPlayerIDfromPlayerIDs:self.currentPlayers];
[self dismissViewControllerAnimated:YES completion:nil];}
Надеюсь, поможет.
person
Tim
schedule
23.07.2014