游戏中心报告得分问题

时间:2014-07-25 11:14:59

标签: ios objective-c game-center

我正在使用两个View Controller创建一个游戏,并且我试图将GameCenter应用到我的游戏中。我在第二视图控制器中对本地播放器进行身份验证,并且在我的"第一视图控制器'播放游戏'中没有对游戏中心进行此类编码。 "第一视图控制器"上的按钮;通过行动segue' modal'到第二个视图控制器,然后退出' "第二视图控制器"上的按钮;将游戏带回" First View Controller"。

现在的问题是,无论何时我玩游戏并获得高分,我的分数都会完美地报告给游戏中心排行榜,但每次我在两个视图控制器之间切换时使用“玩游戏”#39;或者'退出'按钮,即使我获得高分,也没有更多的分数报告给游戏中心,我被困在这里,我无法找到我的错误,如果我用弹簧板终止我的游戏并关闭它,下次我开始游戏并且得分只是同样的事情发生第一次报道,但是当我在两个视图控制器之间移动时没有向游戏中心报告得分。

这是我的SecondViewController.m文件编码

@interface SecondViewController ()

@property (nonatomic) int64_t score;
@property (nonatomic) BOOL gameCenterEnabled;
@property (nonatomic, strong) NSString *leaderboardIdentifier;
-(void)reportScore;
-(void)authenticateLocalPlayer;
-(void)showLeaderboardAndAchievements:(BOOL)shouldShowLeaderboard;
@end

@implementation SecondViewController

-(void)authenticateLocalPlayer {
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
    if (viewController != nil) {
        [self presentViewController:viewController animated:YES completion:nil];
    }
    else {
        if ([GKLocalPlayer localPlayer].authenticated) {
            _gameCenterEnabled = YES;

            // Get the default leaderboard identifier.
            [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {

                if (error != nil) {
                    NSLog(@"%@", [error localizedDescription]);
                }
                else{
                    _leaderboardIdentifier = leaderboardIdentifier;
                }
            }];
        }
        else{
            _gameCenterEnabled = NO;
        }
    }
};
}

-(void)showLeaderboardAndAchievements:(BOOL)shouldShowLeaderboard {
    GKGameCenterViewController *gcViewController = [[GKGameCenterViewController alloc] init];

    gcViewController.gameCenterDelegate = self;

     if (shouldShowLeaderboard) {
         gcViewController.viewState = GKGameCenterViewControllerStateLeaderboards;
         gcViewController.leaderboardIdentifier = _leaderboardIdentifier;
     }
     else {
         gcViewController.viewState = GKGameCenterViewControllerStateAchievements;
     }

     [self presentViewController:gcViewController animated:YES completion:nil];
}

-(void)gameCenterViewControllerDidFinish:(GKGameCenterViewController    *)gameCenterViewController {
    [gameCenterViewController dismissViewControllerAnimated:YES completion:nil];
}

-(void)reportScore {
    GKScore *score = [[GKScore alloc] initWithLeaderboardIdentifier:_leaderboardIdentifier];
    score.value = _score;

        [GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
        if (error != nil) {
            NSLog(@"%@", [error localizedDescription]);
        }
    }];
}

这两个用于报告分数和查看排行榜的按钮

- (IBAction)HandleReportScore:(id)sender {
    [self reportScore];
}

- (IBAction)LabelShowLeaderboard:(id)sender {
    [self showLeaderboardAndAchievements:YES];
}

我的分数方法就是这个,当我需要在游戏中增加分数时,我称这种方法

-(void)Score {
    _score += 20;
}

在视图中加载我正在验证本地播放器

- (void)viewDidLoad {
    [super viewDidLoad];

    [self authenticateLocalPlayer];
    [self initValues];
    _gameCenterEnabled = NO;
    _leaderboardIdentifier = @"";
}

以下是我在视图中调用的得分的初始值方法

-(void)initValues{
// Set the initial values to all member variables.
    _score = 0;
}

@end

构建时未显示任何错误,但未报告分数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

对于临时解决方案,您可以直接使用@“My_Best_Flight”:

GKScore *score = [[GKScore alloc] initWithLeaderboardIdentifier:@"My_Best_Flight"];

对于持久解决方案,我建议使用静态字符串作为ID;

@implementation SecondViewController

static NSString* leaderboardID;

-(void)authenticateLocalPlayer{ ...

 if (error != nil) {
     NSLog(@"%@", [error localizedDescription]);
 } else {
     leaderboardID = leaderboardIdentifier;
 }

最后;

-(void)reportScore {
    GKScore *score = [[GKScore alloc] initWithLeaderboardIdentifier:leaderboardID];
    score.value = _score;
}

如果你不想要任何静态声明,你可以为ID和得分(可能)创建一个单独的类,但IMO只保存一个字符串就太过分了。

P.S:您还应该在提交前检查您的分数值。