2013-12-13 3 views
3
내가 초대를 처리하기 위해 이전에 사용 된 다음 코드 한

: 그러나, 지금은이되었다은 더 이상 사용되지

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
    // Insert game-specific code here to clean up any game in progress. 
    if (acceptedInvite) { 
     GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite]; 
     mmvc.matchmakerDelegate = self; 
     [self presentViewController:mmvc animated:YES completion:nil]; 
    } 
}; 

iOS 7에서 더 이상 사용되지. 여기서 내 프로젝트에 GameKit 초대 핸들러를 등록하는 방법은 무엇입니까?

답변

5

GKInviteEventHandler을 구하고 특히 GKLocalPlayerListener을 살펴보십시오.

GKLocalPlayerListener 프로토콜을 준수하면 확인해야합니다. 아래는 invoiceHandler를 의도 한 대체품으로 보이지만 두 부분으로 나뉘는 프로토콜 방법입니다.

- (void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite 
- (void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite 

일부 개체를 설정 한 후에는 registerListener:을 호출하기 만하면됩니다.

[[GKLocalPlayer localPlayer] registerListener:yourObjectHere] 

는, 가능한 빨리 등록에 대해 걱정하지 마십시오 시스템은 캐시로 초대/도전 /이 사람들을 처리하기 위해 아무도 없습니다 당신의 청취자가 빨리 당신이 그것을 설정으로 알 수있는 경우, 기반 물건을 돌려 쪽으로.

3

Sam이 말한 것처럼이 작업을 수행하는 새로운 방법은 GKLocalPlayerListener 프로토콜을 사용하는 것입니다. 접근법은 지금 반대입니다. 과거에는 앱의 일부로 다른 플레이어에게 초대장을 보냈습니다. 다른 부분은 다른 플레이어의 초대를 청취하고 이에 응답했습니다. 이제는 matchMakerViewController 또는 게임 센터를 사용하여 초대장을 발행하지만 (이전과 같이) 이제 초대장을 수락합니다. 게임 센터에서 didFindMatch를 호출하면 모든 것이 시작됩니다. 초대장을받은 경우 게임 센터에서 게임을 시작한 다음 didFindMatch를 호출하여 게임을 시작합니다. 내 .H 파일에서 GKLocalPlayerListener 프로토콜

: 로컬 플레이어가 인증 된 후 내 authenticateHandler 블록에서하는 .m 파일에

@interface MNFStartupViewController : UIViewController<ADBannerViewDelegate, GKMatchmakerViewControllerDelegate, GKMatchDelegate, GKLocalPlayerListener, UIAlertViewDelegate> 

:

[[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에서 게임을 시작할 수 없기 때문에 동시에 Xcode에서 게임을 시작할 수 없기 때문에 디버깅하기가 어렵습니다 (어쨌든 그렇게 생각하지 않습니다!) 따라서 디버깅 할 수있는 AlertView가 삭제 될 수 있습니다. 마지막으로이 모든 플레이어가 연결되어있을 때가는 경기를 설정하기 위해 게임 센터에 의해 호출 방법은 갈 준비

-(IBAction)setupMatch:(id)sender{ 
GKMatchmakerViewController *matchViewController = [[GKMatchmakerViewController alloc] initWithMatchRequest:matchRequest]; 
matchViewController.matchmakerDelegate = self; 
[self presentViewController:matchViewController animated:YES completion:nil];} 

:

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

전체 중매 과정을 킥오프하는 방법입니다 . 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];} 

희망이 있습니다.

3

또한 초대는 기기에서만 작동합니다. iOS 8.1의 시뮬레이터에서 작동하도록 초대를받을 수 없었습니다.

1

답변은 성가 시게도 GKMatchGKTurnBasedMatch의 경우 다릅니다. GKTurnBasedMatch 초대를 들어

는 차례 이벤트로 계산하고이 기능으로 처리되어 다음 GKLocalPlayerListener 프로토콜 내부의

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)

. 이 작업을하려면 로컬 플레이어에 GKLocalPlayerListener 인스턴스를 공식적으로 등록해야하므로 인증 후에 만 ​​수행 할 수 있습니다.

... 항상 작동하지는 않습니다. Game Center가 신뢰할 수 없습니다. 하지만 때로는 효과가 있습니다.