代码之家  ›  专栏  ›  技术社区  ›  user3752308

IOS 7排行榜中的游戏中心

  •  1
  • user3752308  · 技术社区  · 10 年前

    我已成功将游戏中心功能添加到我的应用程序中。当应用程序打开时,它会成功验证用户,并显示“欢迎回来(用户名)”横幅。

    然而,我不知道如何在游戏中添加排行榜。我想知道是否有人可以帮助我A:帮助我了解如何将我在iTunes中制作的排行榜与应用程序连接起来,并使排行榜的价值更高。B:在应用程序中显示排行榜以及所有排名。

    到目前为止,我的应用程序中游戏中心的所有代码都在下面。

    接口文件:

    #import <Foundation/Foundation.h>
    #import <GameKit/GameKit.h>
    
    
    @interface GCHelper : NSObject {
    
    BOOL gameCenterAvailable;
    BOOL userAuthenticated;
    }
    
    @property (assign, readonly) BOOL gameCenterAvailable;
    
    + (GCHelper *)sharedInstance;
    -(void)authenticateLocalUser;
    
    @end
    

    实施文件:

    #import "GCHelper.h"
    
    
    
    @implementation GCHelper
    @synthesize  gameCenterAvailable;
    
    #pragma mark initialization
    
    static GCHelper *sharedHelper = nil;
    + (GCHelper *) sharedInstance {
    if (!sharedHelper) {
        sharedHelper = [[GCHelper alloc] init];
    }
    return sharedHelper;
    
    }
    
    - (BOOL)isGameCenterAvailable {
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
    
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer
                                           options:NSNumericSearch] != NSOrderedAscending);
    return (gcClass && osVersionSupported);
    }
    
    - (id) init {
    if ((self = [super init])) {
        gameCenterAvailable = [self isGameCenterAvailable];
        if(gameCenterAvailable) {
            NSNotificationCenter *nc =
            [NSNotificationCenter defaultCenter];
            [nc addObserver:self
                   selector:@selector(authenticationChanged)
                       name:GKPlayerAuthenticationDidChangeNotificationName
                     object:nil];
        }
    }
    return self;
    }
    
    -(void)authenticationChanged {
    
    if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) {
        NSLog(@"Authentication changed: player authenticated.");
        userAuthenticated = TRUE;
    } else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) {
        NSLog(@"Authentication changed: player not authenticated");
        userAuthenticated = FALSE;
    }
    }
    
    #pragma mark User Functions
    
    -(void) authenticateLocalUser {
    
    if(!gameCenterAvailable) return;
    
    NSLog(@"Authentication local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {
        [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
    } else {
        NSLog(@"Already authenticated!");
    }
    }
    
    @end
    

    好吧。代码现在正在运行,但当访问排行榜的代码返回错误时,我没有代码来处理它,而是让应用程序进入冻结状态,无法运行。

    正在调用代码以访问排行榜:

    - (void) presentLeaderboards
    {
    GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc]      init];
    gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
    gameCenterController.gameCenterDelegate = self;
    [self presentViewController:gameCenterController animated:YES completion:nil];
    
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Wyetro    10 年前

    要设置排行榜,请转到iTunes Connect>管理应用程序>您的应用程序>管理游戏中心>添加排行榜>单排行榜。

    给你的排行榜一个名字和所需的所有组织信息。

    将此方法添加到 GCHelper.m :

    -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard
    {
    
        //1: Check if Game Center
        //   features are enabled
        if (!_gameCenterFeaturesEnabled) {
            return;
        }
    
        //2: Create a GKScore object
        GKScore* gkScore =
        [[GKScore alloc]
         initWithLeaderboardIdentifier:leaderboard];
    
        //3: Set the score value
        gkScore.value = score;
    
        //4: Send the score to Game Center
        [gkScore reportScoreWithCompletionHandler:
         ^(NSError* error) {
    
             [self setLastError:error];
    
             BOOL success = (error == nil);
    
             if ([_delegate
                  respondsToSelector:
                  @selector(onScoresSubmitted:)]) {
    
                 [_delegate onScoresSubmitted:success];
             }
         }];
    
    
    }
    

    并将此添加到 GCHelper.h :

    -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard;
    

    现在,在游戏的.m中,将此方法添加到游戏结束时调用的任何方法中:

    [[GCHelper sharedGameKitHelper] submitScore:highScore Leaderboard:LeaderboardName];
    

    在此示例中 highScore int_64 你的分数和 LeaderboardName 是一个 NSString 等于您在iTunes Connect中设置的排行榜标识符。还要确保将Game Center功能添加到应用程序中。

    之后,你应该可以提交高分了!

    也将此添加到GCHelper.m

    -(void) setLastError:(NSError*)error {
        _lastError = [error copy];
        if (_lastError) {
            NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo]
                                               description]);
        }
    }
    

    并将其添加到GCHelper.h

    @property (nonatomic, assign)id<GCHelperProtocol> delegate;
    

    这是我的GCHelper。h:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    //   Include the GameKit framework
    #import <GameKit/GameKit.h>
    
    //   Protocol to notify external
    //   objects when Game Center events occur or
    //   when Game Center async tasks are completed
    @protocol GCHelperProtocol<NSObject>
    
    
    -(void) onScoresSubmitted:(bool)success;
    
    
    @end
    
    
    @interface GCHelper : NSObject
    
    @property (nonatomic, assign)id<GCHelperProtocol> delegate;
    
    // This property holds the last known error
    // that occured while using the Game Center API's
    @property (nonatomic, readonly) NSError* lastError;
    
    + (id) sharedGameKitHelper;
    
    // Player authentication, info
    -(void) authenticateLocalPlayer;
    
    //Scores
    -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard;
    
    
    
    
    @end
    

    这里是我的GCHelper.m:

    #import "GCHelper.h"
    
    @interface GCHelper ()
    <GKGameCenterControllerDelegate> {
        BOOL _gameCenterFeaturesEnabled;
    }
    @end
    
    @implementation GCHelper
    
    #pragma mark Singleton stuff
    
    +(id) sharedGameKitHelper {
        static GCHelper *sharedGameKitHelper;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedGameKitHelper =
            [[GCHelper alloc] init];
        });
        return sharedGameKitHelper;
    }
    
    #pragma mark Player Authentication
    
    -(void) authenticateLocalPlayer {
    
        GKLocalPlayer* localPlayer =
        [GKLocalPlayer localPlayer];
    
        localPlayer.authenticateHandler =
        ^(UIViewController *viewController,
          NSError *error) {
    
            [self setLastError:error];
    
    
            if (localPlayer.authenticated) {
                _gameCenterFeaturesEnabled = YES;
            } else if(viewController) {
                [self presentViewController:viewController];
            } else {
                _gameCenterFeaturesEnabled = NO;
            }
        };
    }
    
    #pragma mark Property setters
    
    -(void) setLastError:(NSError*)error {
        _lastError = [error copy];
        if (_lastError) {
            NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo]
                                               description]);
        }
    }
    
    #pragma mark UIViewController stuff
    
    -(UIViewController*) getRootViewController {
        return [UIApplication
                sharedApplication].keyWindow.rootViewController;
    }
    
    -(void)presentViewController:(UIViewController*)vc {
        UIViewController* rootVC = [self getRootViewController];
        [rootVC presentViewController:vc animated:YES
                           completion:nil];
    }
    
    
    #pragma mark Scores
    
    - (void) reportAchievementWithID:(NSString*) AchievementID {
    
        [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) {
    
            if(error) NSLog(@"error reporting ach");
    
            for (GKAchievement *ach in achievements) {
                if([ach.identifier isEqualToString:AchievementID]) { //already submitted
                    return ;
                }
            }
    
            GKAchievement *achievementToSend = [[GKAchievement alloc] initWithIdentifier:AchievementID];
            achievementToSend.percentComplete = 100;
            achievementToSend.showsCompletionBanner = YES;
            [achievementToSend reportAchievementWithCompletionHandler:NULL];
    
        }];
    
    }
    
    -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard
    {
    
        //1: Check if Game Center
        //   features are enabled
        if (!_gameCenterFeaturesEnabled) {
            return;
        }
    
        //2: Create a GKScore object
        GKScore* gkScore =
        [[GKScore alloc]
         initWithLeaderboardIdentifier:leaderboard];
    
        //3: Set the score value
        gkScore.value = score;
    
        //4: Send the score to Game Center
        [gkScore reportScoreWithCompletionHandler:
         ^(NSError* error) {
    
             [self setLastError:error];
    
             BOOL success = (error == nil);
    
             if ([_delegate
                  respondsToSelector:
                  @selector(onScoresSubmitted:)]) {
    
                 [_delegate onScoresSubmitted:success];
             }
         }];
    
    
    }
    
    
    
    
    -(void) gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
    {
        //nothing
    }
    
    @end