0

ユーザーが [完了] を押しているときに Game Center を閉じようとしていますが、これが機能しないのはなぜですか?? 私はAppleのドキュメントを見て、考えられる方法でGoogleで検索しましたが、何が問題なのですか?

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
4

1 に答える 1

2

これは、解任する必要があるディレクターではなくGKGameCenterViewController、関数のパラメーターで受け取るディレクターです-(void)gameCenterViewControllerDidFinish。これを行う必要があります:

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

編集: また、コントローラーのデリゲートを現在のシーンに設定し<GKGameCenterControllerDelegate>、クラスの .h ファイルに実装する必要があります。

//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];
}
于 2014-04-08T00:08:29.037 に答える