在我的游戏中,玩家需要使用 Apples Game Center 登录。如果他们是游戏的新玩家,他们必须先登录 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
{
}
这很好用。但我有2个问题。
1) 正如我所说,如果玩家是新玩家,那么他们必须先登录 Game Center,然后才能进行新用户注册。这个新注册在另一个类中。那么如何让其他类监听 GameCenter 的变量 gameCenterAuthenticationComplete = YES 呢?我在其他地方读到我可以使用委托,但这是否适用于对象?跨对象的通知会更好吗?
2) 更重要的是,如果玩家关闭模态以登录 GameCenter 会发生什么,当模态关闭时的回调/阻塞在哪里?所以我可以提示他们再次登录或至少在屏幕上显示一条消息?