2013-03-27 72 views
2

在我的遊戲中,玩家需要使用蘋果遊戲中心登錄。如果他們是新玩家,他們必須首先登錄到Game Center,因爲我使用playerID作爲用於設置新用戶帳戶的數據的一部分。遊戲中心登錄

我有一個GameCenter類,我用它來簽名玩家,或者提示他們登錄,如果他們還沒有,這是主代碼。

-(void) setup 
{ 
    gameCenterAuthenticationComplete = NO; 

    if (!isGameCenterAPIAvailable()) { 
     // Game Center is not available. 
     NSLog(@"Game Center is not available."); 
    } else { 
     NSLog(@"Game Center is available."); 

      __weak typeof(self) weakSelf = self; // removes retain cycle error 

      GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; // localPlayer is the public GKLocalPlayer 

     __weak GKLocalPlayer *weakPlayer = localPlayer; // removes retain cycle error 

      weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) 
      { 
       if (viewController != nil) 
       { 
        [weakSelf showAuthenticationDialogWhenReasonable:viewController]; 
       } 
       else if (weakPlayer.isAuthenticated) 
       { 
        [weakSelf authenticatedPlayer:weakPlayer]; 
       } 
       else 
       { 
        [weakSelf disableGameCenter]; 
       } 
      }; 
     } 

    } 

    -(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller 
    { 
     [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil]; 
    } 

    -(void)authenticatedPlayer:(GKLocalPlayer *)player 
    { 
     NSLog(@"%@,%@,%@",player.playerID,player.displayName, player.alias); 

     localPlayer = player; 

     gameCenterAuthenticationComplete = YES;  

    } 

    -(void)disableGameCenter 
    { 

    } 

而且工作正常。但我有兩個問題。

1)正如我所說如果玩家是新玩家,那麼他們必須先登錄Game Center,然後才能開始新用戶註冊。這個新的註冊是在另一個班級。那麼如何讓其他班級聽取GameCenter的變量gameCenterAuthenticationComplete = YES?我在其他地方讀過我可以使用委託,但是這是否可以跨對象使用?對象中的通知會更好嗎?

2)更重要的是,如果玩家關閉了登錄GameCenter的模式會發生什麼,當模式關閉時回撥/阻止的位置在哪裏?所以我可以提示他們再次登錄或至少在屏幕上放置一個味精?

回答

2

1)。您可以通過導入其類頭並在代理的界面(Appdelegate.h)中聲明該類的實例並通過Appdelegate.m中的該實例訪問gameCenterAuthenticationComplete來訪問您的gameCenterAuthenticationComplete,或者可以通過一流的sharedinstance做你的類Yourclass.h文件中的以下

+(YourClass*) sharedInstance; 

和YourClass.m

static YourClass* instance; 

+(YourClass*) sharedInstance 
{ 
@synchronized(self) 
{ 
    if (instance == nil) 
    { 
     instance = [[YourClass alloc] init]; 
    } 
} 

return instance; 
} 

2)該方法被調用的取消gamecenterleaderboardviewcon的按鈕troller

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)view_controller 
{ 
[self.gameCenter dismissModalViewControllerAnimated:NO]; 
[view_controller release]; 

} 
+0

關於第2點,我該如何使用它?它去哪裏?在ny代碼中view_controller是viewController嗎? – Phil 2013-03-27 08:24:27

+0

gamecenter是您用來呈現遊戲中心排行榜的視圖控制器。你可以在委託中使用這個方法(GKLeaderBoardDelegate),或者如果你有單獨的viewcontroller和.xib,你也可以在這個類的主文件(.m)中使用[self dismissModalViewControllerAnimated:NO];在這種情況下,你也必須在你的類的.h文件的接口中提到GKLeaderBoardDelegate以觸發該方法 – hariszaman 2013-03-27 09:12:06