2

在我的游戏中,玩家需要使用 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 会发生什么,当模态关闭时的回调/阻塞在哪里?所以我可以提示他们再次登录或至少在屏幕上显示一条消息?

4

1 回答 1

2

1).您可以通过导入其类标头并在委托的接口(Appdelegate.h)中声明该类的实例并通过 Appdelegate.m 中的该实例访问 gameCenterAuthenticationComplete 来访问您的 gameCenterAuthenticationComplete 或者您可以通过类的 sharedinstance 访问它 do您的班级 Yourclass.h 文件中的以下内容

+(YourClass*) sharedInstance;

在 YourClass.m

static YourClass* instance;

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

return instance;
}

2)这个方法在gamecenterleaderboardviewcontroller的取消按钮上被调用

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

}
于 2013-03-27T05:50:57.510 回答