4

我正在创建我的第一个 SpriteKit 游戏,这就是我想要做的:

1. 移除默认 Main_iphone 和 Main_ipad 故事板

  • 从 中删除Main_iphoneMain_ipad列出info.plist
  • Main_iPhone.storyboardMain Interface下 删除deployment info

2.在AppDelegate.m下添加如下代码didFinishLaunchingWithOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[CMViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;

3.在viewController.m中配置SKScene

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    //Configure the view.
    SKView* skView = (SKView*)self.view;
    //Create and configure the scene.
    SKScene* scene = [CMHomeScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    //Present the scene.
    [skView presentScene:scene];
 }

运行时错误

-[UIView presentScene:]:无法识别的选择器发送到实例 0x155854d0
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIView presentScene:]:无法识别的选择器发送到实例 0x155854d0”
**** 第一次抛出调用stack: (0x2c3eac1f 0x39b95c8b 0x2c3f0039 0x2c3edf57 0x2c31fdf8 0x10883d 0x2f8a7433 0x2f2cfa0d 0x2f2cb3e5 0x2f2cb26d 0x2f2cac51 0x2f2caa55 0x2fb0b1c5 0x2fb0bf6d 0x2fb16379 0x2fb0a387 0x32b770e9 0x2c3b139d 0x2c3b0661 0x2c3af19b 0x2c2fd211 0x2c2fd023 0x2f90e3ef 0x2f9091d1 0x10c2d1 0x3a115aaf) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

PS:

  • 当我不删除情节提要和修改 info.plist 时,我所有的场景都可以正常工作。
  • 我正在以编程方式创建所有场景和视图控制器。
  • 我试过 self.view = [[SKView alloc]initWithFrame:self.view.frame]在下面初始化-(void)loadView
4

2 回答 2

1

引发异常是因为您试图调用presentScenetype 的视图UIView,而 method 属于SKView

Storyboard 默认将self.viewclass 设置为SKView. 由于您已删除情节提要,并尝试按正常初始化的方式使用控制器,self.view因此将启动为UIView而不是SKView.

在此处输入图像描述

希望能帮助到你。

于 2015-03-27T07:28:53.203 回答
1

您已分配SKView* skView = (SKView*)self.view. 我相信 self.view 不是SKView的子类,因此简单地进行类型转换会将您的 SKView 指向 UIView。

虽然构建代码会成功,但您肯定会遇到运行时错误,因为您的 SKView 会发现 self.view 将其真实身份 (UIView) 隐藏在 nil 指针 SKView 后面。

您可能想更改您的3. 将视图配置为以下内容:

    - (void)viewWillLayoutSubviews 
    { 
    // Configure the view. 
    SKView* skView = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Create and configure the scene. 
    SKScene* scene = [CMHomeScene sceneWithSize:skView.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeAspectFill; 
    // Present the scene. 
    [skView presentScene:scene]; 
[self.view addSubview:skView];
    }
于 2015-03-27T07:21:52.160 回答