Jason
Jason

Reputation: 650

Game Center not dismissing?

Im trying to dismiss Game Center when the user is pressing Done, why is this not working?? I've looked at the Apple docs and Googled it ever way I can think of, what is wrong?

GCHelper.h

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

@protocol GameCenterManagerDelegate

@end

@interface GCHelper : NSObject <GKGameCenterControllerDelegate, GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate> {

BOOL gameCenterAvailable;
BOOL userAuthenticated;

UIViewController *presentingViewController;
id <GameCenterManagerDelegate> delegate;

}
@property (nonatomic, strong)  id <GameCenterManagerDelegate> delegate;
@property (assign, readonly) BOOL gameCenterAvailable;
@property (retain) UIViewController *presentingViewController;

+ (GCHelper *) showGameCenter;
+ (GCHelper *)sharedInstance;
- (void)authenticateLocalUser;

@end

GCHelper.m

#import "GCHelper.h"

@implementation GCHelper

@synthesize gameCenterAvailable;
@synthesize presentingViewController;
@synthesize delegate;


#pragma mark Initialization

static GCHelper *sharedHelper = nil;
static GCHelper *showGameCenter = nil;

+ (GCHelper *) sharedInstance {
if (!sharedHelper) {
    sharedHelper = [[GCHelper alloc] init];
}
return sharedHelper;
}

- (BOOL)isGameCenterAvailable {
// check for presence of GKLocalPlayer API
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

// check if the device is running iOS 4.1 or later
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(@"Authenticating local user...");
if ([GKLocalPlayer localPlayer].authenticated == NO) {
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
} else {
    NSLog(@"Already authenticated!");
}
}


/*
- (void) showBanner

{

NSString* title = [self generateTitle];

NSString* message = [self generateBannerMessage];

[GKNotificationBanner showBannerWithTitle: title message: message

                        completionHandler:^{

                            [self advanceToNextInterfaceScreen]

                        }];

}
*/

+ (GCHelper *)showGameCenter
{
@synchronized (self)
{
GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];

if (gameCenterController != NULL)

{

    [[CCDirector sharedDirector]presentViewController:gameCenterController animated:YES completion:nil];

}
}
return showGameCenter;
}

// When player dismisses game center.
- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController

{

gameCenterViewController.gameCenterDelegate = self;
[gameCenterViewController dismissModalViewControllerAnimated:YES];

}


@end

Upvotes: 0

Views: 658

Answers (1)

RaphBlanchet
RaphBlanchet

Reputation: 575

That's not the director that needs to be dismissed, but the GKGameCenterViewController that you receive by parameter in the function -(void)gameCenterViewControllerDidFinish. You should do this :

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

EDIT : You also have to set the delegate of your controller to your current scene and implement <GKGameCenterControllerDelegate> in the .h file of your class :

//In your .h file
@interface foo : CCScene <GKGameCenterControllerDelegate>{
}

//In you .m file
GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];

if (gameCenterController != NULL)
{
    gameCenterController.gameCenterDelegate = self;
    [[CCDirector sharedDirector]presentViewController:gameCenterController animated:YES completion:nil];
}

Upvotes: 2

Related Questions