xCode 4.6.3:不完整的实现

时间:2013-09-07 17:57:45

标签: c# ios xcode

我搜索了很多,但我找不到解决方案:(也许是关于我糟糕的英语。 我的问题是:

IOSGameCenterManager.mm:

#import "IOSGameCenterManager.h"
#import "Unity3d.h"

@implementation IOSGameCenterManager //InComplete Implentation

- (id)init {
    self = [super init];
    if (self) {
        curentView =  NULL;
        requestedLeaderBordId = NULL;
        isAchievementsWasLoaded = FALSE;

        gameCenterManager = [[GameCenterManager alloc] init];
        NSLog(@"IOSGameCenterManager inited");
    }

    return self;
}



- (void)dealloc {
    [super dealloc];
}



- (void) reportScore: (int) score forCategory: (NSString*) category {
    NSLog(@"reportScore: ");
    NSLog(@"NEW HI SCORE : %i", score);
    NSLog(@"category %@", category);

    GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
    scoreReporter.value = score;
    [scoreReporter reportScoreWithCompletionHandler: ^(NSError *error) {
        if (error != nil) {
            NSLog(@"got error while score sibmiting");
        } else {
            NSLog(@"new hing score sumbited succsess: %i", score);
        }

    }];
}


-(void) resetAchievements {
    [gameCenterManager resetAchievements];
}

-(void) submitAchievement:(double)percentComplete identifier:(NSString *)identifier  notifayComplete: (BOOL) notifayComplete {
    [gameCenterManager submitAchievement:identifier percentComplete:percentComplete notifayComplete:notifayComplete];
}

- (void) propouseAuth {
    UIAlertView *alert = [[UIAlertView alloc] init];
    [alert setTitle:@"Game Center is disabled"];
    [alert setMessage:@"Do you whant to login now?"];
    [alert setDelegate:self];
    [alert addButtonWithTitle:@"Yes"];
    [alert addButtonWithTitle:@"No"];
    [alert show];
    [alert release];



}

- (void) showLeaderBoard:(NSString *)leaderBoradrId {

    requestedLeaderBordId = leaderBoradrId;
    [requestedLeaderBordId retain];

    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    if(localPlayer.isAuthenticated) {
        [self showLeaderBoardPopUp];
    } else {
        [self propouseAuth];
    }
}


- (void) showAchievements {
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    if(localPlayer.isAuthenticated) {
        [self showAchievementsPopUp];
    } else {
        [self propouseAuth];
    }
}

- (void) showAchievementsPopUp {

    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
    if(achievements != NULL) {

        achievements.achievementDelegate = self;

        CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        UIWindow* window = [UIApplication sharedApplication].keyWindow;

        UIViewController *glView2 = [[UIViewController alloc] init];
        curentView = glView2.view;
        [window addSubview: glView2.view];

        [glView2 presentViewController: achievements animated: YES completion:nil];

        achievements.view.transform = CGAffineTransformMakeRotation(0.0f);
        [achievements.view setCenter:CGPointMake(screenSize.width/2, screenSize.height/2)];
        achievements.view.bounds = CGRectMake(0, 0, screenSize.width, screenSize.height);

    }
}

- (void) showLeaderBoardsPopUp {
    GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];


    NSLog(@"showLeaderBoardsPopUp");
    leaderboardController.gameCenterDelegate = self;


    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    UIWindow* window = [UIApplication sharedApplication].keyWindow;


    UIViewController *glView2 = [[UIViewController alloc] init];
    curentView = glView2.view;
    [window addSubview: glView2.view];
    [glView2 presentViewController: leaderboardController animated: YES completion:nil];
    leaderboardController.view.transform = CGAffineTransformMakeRotation(0.0f);
    [leaderboardController.view setCenter:CGPointMake(screenSize.width/2, screenSize.height/2)];
    leaderboardController.view.bounds = CGRectMake(0, 0, screenSize.width, screenSize.height);


}

- (void) showLeaderBoardPopUp {

    GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];
    if (leaderboardController != NULL)
    {
        NSLog(@"requested LB: %@", requestedLeaderBordId);

        leaderboardController.leaderboardCategory = requestedLeaderBordId;
        leaderboardController.leaderboardTimeScope = GKLeaderboardTimeScopeWeek;
        leaderboardController.gameCenterDelegate = self;


        CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        UIWindow* window = [UIApplication sharedApplication].keyWindow;


        UIViewController *glView2 = [[UIViewController alloc] init];
        curentView = glView2.view;
        [window addSubview: glView2.view];
        [glView2 presentViewController: leaderboardController animated: YES completion:nil];
        leaderboardController.view.transform = CGAffineTransformMakeRotation(0.0f);
        [leaderboardController.view setCenter:CGPointMake(screenSize.width/2, screenSize.height/2)];
        leaderboardController.view.bounds = CGRectMake(0, 0, screenSize.width, screenSize.height);

        [requestedLeaderBordId release];

    }

    requestedLeaderBordId = NULL;
}


- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)vc {
    [self dismissGameCenterView:vc];
}


- (void)achievementViewControllerDidFinish:(GKAchievementViewController *)vc; {
    [self dismissGameCenterView:vc];
}


-(void) dismissGameCenterView: (GKGameCenterViewController *)vc {
    if(curentView != NULL) {
        [curentView removeFromSuperview];
    }

    [vc dismissViewControllerAnimated:YES completion:nil];
    [vc.view.superview removeFromSuperview];
    [vc release];
}


- (void) authenticateLocalPlayer {
    if([self isGameCenterAvailable]){
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        if(localPlayer.authenticated == NO) {
            [localPlayer authenticateWithCompletionHandler:^(NSError *error){
                if (localPlayer.isAuthenticated){
                    NSLog(@"PLAYER AUTHENICATED");
                    if(!isAchievementsWasLoaded) {
                        [self loadAchievements];
                    }

                }else{
                    NSLog(@"PLAYER NOT AUTHENICATED");
                }
            }];
        } else {
            NSLog(@"PLAYER AUTHENICATED PT 2");
        }
    }
}
- (void) loadAchievements {
    [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) {
        if (error == nil) {
            isAchievementsWasLoaded = TRUE;
            NSMutableString * data = [[NSMutableString alloc] init];
            BOOL first = YES;
            for (GKAchievement* achievement in achievements) {


                if(!first) {
                    [data appendString:@","];
                }

                [data appendString:achievement.identifier];
                [data appendString:@","];

                NSLog(@"achievement.percentComplete:  %f", achievement.percentComplete);

                [data appendString:[NSString stringWithFormat:@"%f", achievement.percentComplete]];

                first = NO;

            }

            NSString *str = [[data copy] autorelease];
            UnitySendMessage("GameCenterManager", "onAchievementsLoaded", [Unity3d NSStringToChar:str]);
        }
    }];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0) {
        [self authenticateLocalPlayer];
    } else if (buttonIndex == 1) {

    }
}



- (BOOL)isGameCenterAvailable {
    BOOL localPlayerClassAvailable = (NSClassFromString(@"GKLocalPlayer")) != nil;
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
    return (localPlayerClassAvailable && osVersionSupported);
}


-(void) retrieveScoreForLocalPlayerWithCategory:(NSString*)category
{
    GKLeaderboard *leaderboardRequest = [[[GKLeaderboard alloc] init] autorelease];
    leaderboardRequest.category = category;

    if (leaderboardRequest != nil) {
        NSMutableString * data = [[NSMutableString alloc] init];

        [leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error){
            if (error != nil) {
                //Handle error <- don't care
            }  else {
                [data appendString:category];
                [data appendString:@","];
                [data appendString:[NSString stringWithFormat:@"%lld", leaderboardRequest.localPlayerScore.value]];

                NSString *str = [[data copy] autorelease];
                UnitySendMessage("GameCenterManager", "onLeaderBoardScore", [Unity3d NSStringToChar:str]);


                NSLog(@"Retrieved localScore:%lld",leaderboardRequest.localPlayerScore.value);
            }
        }];
    }
}




@end


static IOSGameCenterManager *GCManager = NULL;

extern "C" {
    void _init ()  {
        GCManager = [[IOSGameCenterManager alloc] init];
        [GCManager authenticateLocalPlayer];

    }

    void _showLeaderBoard(char* leaderBoradrId) {
        [GCManager showLeaderBoard:[Unity3d charToNSString:leaderBoradrId]];
    }

    void _showLeaderBoards() {
        [GCManager showLeaderBoardsPopUp];
    }

    void _getLeadrBoardScore(char* leaderBoradrId) {
        [GCManager retrieveScoreForLocalPlayerWithCategory:[Unity3d charToNSString:leaderBoradrId]];
    }

    void _showAchievements() {
        [GCManager showAchievements];
    }




    void _reportScore(int score, char* leaderBoradrId) {
        [GCManager reportScore:score forCategory:[Unity3d charToNSString:leaderBoradrId]];
    }

    void _submitAchievement(float percents, char* achievementID, BOOL notifayComplete) {
        double v = (double) percents;
        [GCManager submitAchievement:v identifier:[Unity3d charToNSString:achievementID] notifayComplete:notifayComplete];
    }

    void _resetAchievements() {
        [GCManager resetAchievements];
    }

}

IOSGameCenterManager.h:

#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
#import "GameCenterManager.h"


@interface IOSGameCenterManager : NSObject <GKGameCenterControllerDelegate, GKAchievementViewControllerDelegate>{
    BOOL isAchievementsWasLoaded;
    UIView* curentView;
    NSString* requestedLeaderBordId;
    GameCenterManager *gameCenterManager;
}



- (void) reportScore: (int) score forCategory: (NSString*) category;

- (void) authenticateLocalPlayer;
- (void) showLeaderBoard: (NSString*)leaderBoradrId;

- (void) showAchievements;
- (void) resetAchievements; 
- (void) submitAchievement: (double) percentComplete identifier: (NSString*) identifier notifayComplete: (BOOL) notifayComplete;

- (BOOL)isGameCenterAvailable;

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)vc;


@end

我对Objective-C不好,我正在努力专注于C#。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

你忘了实施:

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)vc;

尝试AppCode,它帮了很多忙!