在景观的GameCenter认证只用的cocos2d的CCLayer iOS 6的(Gamecent

2019-08-06 08:59发布

我有什么似乎是一个相当普遍的问题,但我的搜索和解决方案的实现还没有制定。

我已经建立了一个cocos2d的游戏,是仅是景观,但需要访问GameCenter的。 GameCenter的工作,并启用人像模式,但它也使游戏翻转到肖像模式了。

我已经尝试以下修正:

只有在我的OS 6的Game Center登录锁定在景观

仅在景观应用的GameCenter认证抛出UIApplicationInvalidInterfaceOrientation

在iOS 6中添加错误的GameCenter的景观仅cocos2d的应用程序后,

科科斯2D 2.0 shouldAutorotate不工作?

我认为,问题是,我已经建立了使用CCLayers代替UIViewControllers游戏

例如:MenuLayer.h

@interface MenuLayer : CCLayer <GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate, UINavigationControllerDelegate>{
   ..my header info..
}

MenuLayer.m

...
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotate {
    return [[UIDevice currentDevice] orientation] != UIInterfaceOrientationPortrait;
}

-(void)authenticateLocalPlayer
{

    GKLocalPlayer * localPlayer= [GKLocalPlayer localPlayer];

    if(localPlayer.authenticated == NO)
    {
        NSString *reqSysVer = @"6.0";
        NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
        if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
        {
            [[GKLocalPlayer localPlayer] setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {
                if (viewcontroller != nil) {
                    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
                    [[app navController] presentModalViewController:viewcontroller animated:YES];
                }else if ([GKLocalPlayer localPlayer].authenticated)
                {
                    //do some stuff
                }
            })];
        }
        else
        {
            [localPlayer authenticateWithCompletionHandler:^(NSError *error){
                if(localPlayer.isAuthenticated)
                {
                    //Peform Additionl Tasks for the authenticated player.
                }
            }];
        }
    }

}
...

既然我已经建立了使用CCLayers代替UIViewControllers的比赛中,我有什么办法? 我在假设CCLayers不调用使用supportedInterfaceOrientations或shouldAutorotate正确吗?

还是我应该以某种方式改变这个代码来解决这个问题:

// Create a Navigation Controller with the Director
navController_ = [[UINavigationController alloc] initWithRootViewController:director_];
navController_.navigationBarHidden = YES;

Answer 1:

这我感到沮丧的一段时间了。 周围挖了一段时间的“网后,我发现一对夫妇的来源和一些工作与iOS 6,一些与iOS5的,但我不得不作出一些修改,使得它的工作,我想双方的iOS5和iOS6的方式。 这是我使用的代码,它使用5.1和6.注意游戏中心登录仍处于纵向上来的作品在我的iPhone,似乎没有成为任何你可以做的。 但比赛的其余部分将保持在横向模式。

  1. 启动肖像模式,如您的构建设置(info.plist中)支持的方向。
  2. UINavigationController的创建一个新的子类。 命名此类无论对你有意义。
  3. 在AppDelegate中,包含新的自定义UINavigationController的头文件。
  4. 在应用程序委托,注释掉原来的呼叫,而是调用您的自定义类。

这应该够了吧。 这里是我的自定义类的代码:

#import <UIKit/UIKit.h>

@interface CustomNavigationViewController : UINavigationController

-(UIInterfaceOrientation) getCurrentOrientation;

@end

而实现文件:

#import "CustomNavigationViewController.h"

@interface CustomNavigationViewController ()

@end

@implementation CustomNavigationViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// This is required to allow GameCenter to login in portrait mode, but only allow landscape mode for the rest of the game play/
// Arrrgg!

-(BOOL) shouldAutorotate {
    return YES;
}

-(NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

-(UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeRight; // or left if you prefer
}

-(NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        return UIInterfaceOrientationMaskLandscape;
    else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return [[UIDevice currentDevice] orientation] != UIInterfaceOrientationPortrait;
}

-(UIInterfaceOrientation) getCurrentOrientation {
    return [[UIDevice currentDevice] orientation];
}

@end

需要注意的是最后的方法getCurrentOrientation不需要我只是把在那里的情况下,我想,以确定当前的方向是什么。

自定义类被称为在AppDelegate.m这样的:(注释掉原代码)

navController = [[CustomNavigationViewController alloc] initWithRootViewController:director];
window.rootViewController = navController;
navController.navigationBarHidden = YES;
[window makeKeyAndVisible];

希望这可以帮助。



文章来源: Gamecenter authentication in landscape only Cocos2d with CCLayer for iOS 6