2

このチュートリアルhttp://www.raywenderlich.com/3276/how-to-make-a-simple-multiplayer-game-with-game-center-tutorial-part-12に従いましたが、マッチメイキング ウィンドウが開きません。ソース コードの DropBox リンクhttps://www.dropbox.com/s/e4pp95iqqo6xkrw/testCocos2d%202.zip

- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController delegate:(id<GCHelperDelegate>)theDelegate {

    if (!gameCenterAvailable) return;

    matchStarted = NO;
    self.match = nil;
    self.presentingViewController = viewController;
    delegate = theDelegate;

    if (pendingInvite != nil) {

        [presentingViewController dismissModalViewControllerAnimated:NO];
        GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:pendingInvite] autorelease];
        mmvc.matchmakerDelegate = self;
        [presentingViewController presentModalViewController:mmvc animated:YES];

        self.pendingInvite = nil;
        self.pendingPlayersToInvite = nil;

    } else {
        GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
        request.minPlayers = minPlayers;
        request.maxPlayers = maxPlayers;
        request.playersToInvite = pendingPlayersToInvite;

        GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
        mmvc.matchmakerDelegate = self;
        [presentingViewController presentViewController:mmvc animated:YES completion:nil];
        self.pendingInvite = nil;
        self.pendingPlayersToInvite = nil;

    }

}

これを使用すると、アプリは iOS 6 以降で実行されます bt は GKMatchmakerViewController を開きません

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Init the window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    CCDirector *director = [CCDirector sharedDirector];
    EAGLView *glView = [EAGLView viewWithFrame:[self.window bounds]
                                   pixelFormat:kEAGLColorFormatRGB565   // kEAGLColorFormatRGBA8
                                   depthFormat:0                        // GL_DEPTH_COMPONENT16_OES
    ];
    // attach the openglView to the director
    [director setOpenGLView:glView];
    //  // Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
    if( ! [director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");
    [director setAnimationInterval:1.0/60];
    // make the OpenGLView a child of the view controller
    [viewController setView:glView];
    // make the View Controller a child of the main window
    self.window.rootViewController = viewController;
    if( ! [director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");
    // Create a Navigation Controller with the Director
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:director];
    navController.navigationBarHidden = YES;
    NSString *reqSysVer = @"6.0";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
    {
        [self.window setRootViewController:navController];
    } else
    {
        [self.window addSubview: navController.view];
    }
    [self.window makeKeyAndVisible];
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    // Removes the startup flicker
    [self removeStartupFlicker];

    [[GCHelper sharedInstance] authenticateLocalUser];


    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
}

これを使用すると、iOS 6 以降でアプリがクラッシュしますが、GKMatchmakerViewController が開きます

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Init the window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    CCDirector *director = [CCDirector sharedDirector];
    EAGLView *glView = [EAGLView viewWithFrame:[self.window bounds]
                                   pixelFormat:kEAGLColorFormatRGB565   // kEAGLColorFormatRGBA8
                                   depthFormat:0                        // GL_DEPTH_COMPONENT16_OES
    ];
    // attach the openglView to the director
    [director setOpenGLView:glView];
    //  // Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
    if( ! [director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");
    [director setAnimationInterval:1.0/60];
    // make the OpenGLView a child of the view controller
    [viewController setView:glView];
    // make the View Controller a child of the main window
    self.window.rootViewController = viewController;
    if( ! [director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");
    // Create a Navigation Controller with the Director
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:director];
    navController.navigationBarHidden = YES;
    NSString *reqSysVer = @"6.0";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
    {
        [self.window setRootViewController:navController];
    } else
    {
        [self.window addSubview: navController.view];
    }
    [self.window makeKeyAndVisible];
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    // Removes the startup flicker
    [self removeStartupFlicker];

    [[GCHelper sharedInstance] authenticateLocalUser];


    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
}

ユーザー認証コード

- (void)authenticateLocalUser {

    if (!gameCenterAvailable) return;

    NSLog(@"Authenticating local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {
        [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
    } else {
        NSLog(@"Already authenticated!");
    }
}
4

1 に答える 1

0

数か月前に同じ問題に遭遇しましたが、これを修正する方法は、mmvc をモーダル ビュー コントローラーとして提示することでした。else を次のように置き換えてみてください。

[presentingViewController dismissModalViewControllerAnimated:NO];
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = minPlayers;
request.maxPlayers = maxPlayers;
request.playersToInvite = pendingPlayersToInvite;

GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];

self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;

また、認証に問題があるようです。メソッドは、次のようなプレイヤー認証に新しいメカニズムを使用する必要があります。

- (void)authenticateLocalUser { 

    if (!gameCenterAvailable) return;

    NSLog(@"Authenticating local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {

        // Use new authentication mechanism if the iOS version is 6.0 or above
        if ([[UIDevice currentDevice].systemVersion compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending) {
            [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *vc, NSError *error) {
                if (error)
                    NSLog(@"Error in authenticating User - %@", [error localizedDescription]);
                else if (vc) {
                    AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate;
                    [appDel.navigationController presentModalViewController:vc animated:YES];
                }
            }];
        }
        else
            [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
    }
    else {
        NSLog(@"Already authenticated!");
    }
}
于 2013-10-18T12:31:22.020 に答える