iOS 6 中仅横向使用 CCLayer 的 Cocos2d 中的游戏中心身份验证

2023-12-11

我遇到的问题似乎是一个相当常见的问题,但我的解决方案的搜索和实现尚未成功。

我构建了一个 Cocos2d 游戏,该游戏仅供横向使用,但需要访问 Gamecenter。 Gamecenter 正在运行,启用了纵向模式,但它也允许游戏切换到纵向模式。

我已尝试以下修复:

游戏中心登录锁定横向仅在 iOS 6 中

仅横向应用程序中的 GameCenter 身份验证抛出 UIApplicationInvalidInterfaceOrientation

将 GameCenter 添加到仅限横向的 cocos2d 应用程序后,iOS 6 中出现错误

Cocos 2d 2.0 应该自动旋转不起作用?

我相信问题是我使用 CCLayers 而不是 UIViewControllers 构建了游戏

例子: 菜单层.h

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

菜单层.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 不调用 usesupportedInterfaceOrientations 或 shouldAutorotate 是否正确?

或者我应该以某种方式更改此代码来解决问题:

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

这也让我沮丧了一段时间。在网上挖掘了一段时间后,我发现了一些资源,其中一些适用于 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];

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 6 中仅横向使用 CCLayer 的 Cocos2d 中的游戏中心身份验证 的相关文章

随机推荐

  • 如何使用 Tidhttp 发出带有名为 xml 的参数的 Get 请求?

    我已成功使用 Delphi 2010 发出 http get 请求 但对于一项需要名为 xml 的参数的服务 请求失败并出现 HTTP 1 1 400 Bad Request 错误 我注意到调用相同的服务并省略 xml 参数是有效的 我尝试
  • 将文件内容重定向到php中的标准输入

    我有一个文件abc txt内容如下 hello hi good bad 现在 如何将文件的内容逐行重定向到php脚本的标准输入 这样当执行 php 脚本时 它可以通过以下任何命令收集输入 f fopen php stdin r line f
  • 视图状态 MAC 验证失败。应用程序由 Web Farm 托管,请确保 配置 [重复]

    这个问题在这里已经有答案了 Net 4 0框架 我在这个框架中制作了很多网站 但从未遇到过这样的错误 Validation of viewstate MAC failed If this application is hosted by a
  • 如何从最新版本的 Hyperledger Fabric 检索用户信息?

    我是 Hyperledger Fabric 的新手 在当前版本的 Hyperledger Fabric 中 在 chaincode go 中我找不到名为 ReadCertAttributes 的函数 有什么办法可以获取属性吗 从 Hyper
  • 返回文件或视图的方法

    我正在使用下面的 jquery 来调用GetFile方法 我想根据某些条件生成一个文本文件 这并不总是 始终生成一个文本文件 如果条件 True 生成文件 如果条件 False 返回主页 现在如果我回来 我只会得到一张空白页 我该如何写才能
  • Oracle PLSQL:xmltype.transform 与 xmltransform

    由于我们已将数据库从 11 2 0 2 0 移动到 11 2 0 4 0xmltype transform函数有特定的行为 问题是 之前它不能正常工作 它用开闭版本替换了所有标签 例如 它确实替换了 br with br 但我可以忍受 现在
  • 打印有序链表

    只是做了一些编辑 我尝试了你所说的 但它不起作用 所以我尝试了一些我更熟悉的东西 但它似乎无法正常工作 它奇怪地打印信息然后崩溃 例如 当我输入 9 8 7 6 5 4 3 2 1 然后输入 0 进行打印时 它会打印回给我 0 0 0 9
  • 列出“tkinter”中可用的字体系列

    In many tkinter那里有可用的示例 您可能会看到类似以下内容 canvas create text x y font Helvetica 12 text foo 但是 在您的计算机中运行时这可能不起作用 结果将完全忽略字体参数
  • 实体框架5性能不佳

    我有 5 个实体 public class Album public int Id get set public string Title get set public virtual List
  • “pygame.Surface”对象的描述符“get_at”不适用于“tuple”对象

    我正在创建一个程序 并且如果光标位置处的像素还不是黑色 则尝试在光标位置绘制一个矩形 if pygame Surface get at pygame mouse get pos 0 0 0 255 pygame draw rect win
  • Jooq fetchInto 类 java.util.LinkedHashMap 无法转换为类

    给出最后一个例子这个所以线程 我收到此错误 java lang ClassCastException class java util LinkedHashMap cannot be cast to class com example dto
  • VB.NET 中的 EntityDataSourceWhere 子句

    我有一个实体数据源绑定到我的网页上的网格视图 在后面的代码中 我可以使用实体数据源的 WHERE 语句过滤并在 gridview 中显示我想要的内容 我的 where 语句之一使用大型 OR 语句进行过滤 但逻辑性更强的 IN 语句不起作用
  • 使用Python密码保护Excel文件

    我还没有找到太多关于使用 Python 创建受密码保护的 Excel 文件的主题 在Openpyxl中 我确实找到了一个SheetProtection模块使用 from openpyxl worksheet import SheetProt
  • 为什么 validateantiforgerytoken cookie 值和隐藏表单值存在差异?

    我有MVC4 ValidateAntiForgeryToken 属性完美运行 但是 我不明白我在 Fiddler 中看到了什么 服务器发送到浏览器的 cookie 设置为以下值 RequestVerificationToken FVcmfj
  • C++ 单例初始化顺序

    I have class Foo class Bar 现在 我想要 Foo Foo singleton new Foo Bar Bar singleton new Bar 之前都初始化 int main 叫做 此外 我想要 Foo sing
  • 如何向 System.Type 添加元数据?

    我一直在研究一种语言 但就 NET 集成而言 到目前为止我只设法让原始类型发挥作用 昨晚我有了一个好主意 而不是试图弄清楚到底是什么System Type对于元组 模块和函数应该在类型检查期间 我可以做的是获取System Type of
  • 如何在shell脚本中向变量追加值

    我从属性中获取变量值 并且可以在 sh 文件中访问 但我无法向该变量附加另一个值 请建议 echo Build ID from properties BUILD ID Build ID from properties abcd v6 c1
  • 需要使图像从底到角:React Native

    I want to make image rounded from bottom of it Here is what I wanted to make 我尝试过设置边界半径 但它将适用于整个图像而不是底部 这是我的代码
  • 在 R 中重塑而不进行聚合(例如 MTurk 响应字符串)

    通常 我会为此使用一个非常基本的从长到宽的重塑 但它似乎正在删除我的聚合变量 设置是我在 Mechanical Turk 上有一项工作 我一式三份执行 我希望 MTurk1 Mturk2 MTurk3 的答案成为数据框中它们自己的变量 但由
  • iOS 6 中仅横向使用 CCLayer 的 Cocos2d 中的游戏中心身份验证

    我遇到的问题似乎是一个相当常见的问题 但我的解决方案的搜索和实现尚未成功 我构建了一个 Cocos2d 游戏 该游戏仅供横向使用 但需要访问 Gamecenter Gamecenter 正在运行 启用了纵向模式 但它也允许游戏切换到纵向模式