我正在使用两个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
构建时未显示任何错误,但未报告分数。我该如何解决这个问题?
答案 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:您还应该在提交前检查您的分数值。