【问题标题】:Simple Sprite Kit Scene setup going wrong简单的 Sprite Kit 场景设置出错
【发布时间】:2013-11-22 06:17:57
【问题描述】:

我正在尝试设置一个简单的 Sprite Kit 设置。 我所做的只是从“空应用程序”重新创建默认的 xCode 模板“Sprite Kit Game”。

它一直在 skView.showsFPS = YES; 行崩溃。我无法解释。你可以吗?谢谢!

一些代码:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  MenuController *menuController = [[MenuController alloc] init];
  self.window.rootViewController = menuController;
  [self.window makeKeyAndVisible];
  return YES;
}

MenuController.m

- (void)viewDidLoad
{
  [super viewDidLoad];

  SKView *skView = (SKView *)self.view;
  skView.showsFPS = YES;
  skView.showsNodeCount = YES;

  MultiplayerView *gameView = [MultiplayerView sceneWithSize:skView.bounds.size];
  gameView.scaleMode = SKSceneScaleModeAspectFill;

  [skView presentScene:gameView];
}

当我启动它时,会出现以下错误:

2013-11-10 13:08:01.605 ByS[9419:70b] -[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60
2013-11-10 13:08:01.608 ByS[9419:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60'

【问题讨论】:

    标签: ios objective-c uiviewcontroller ios7 sprite-kit


    【解决方案1】:

    在界面生成器中,将窗口视图的类更改为SKView。将UIView 类型转换为SKView 不会做任何事情,除非UIView 先前是通过转换SKView 获得的。

    【讨论】:

    • 错误提示是这种情况的一个很好的提示:它列出的类是UIView,而不是SKView。另外,错误是关于选择器setShowFPS:没有被识别(由SKView实现,但不是它的父类UIView)。
    • 谢谢,但这里没有使用任何故事板。所以没有界面生成器。无论如何要在代码中做到这一点?以为是 SKView *skView = (SKView *)self.view; 行..
    • 用 xib 重新创建了 'MenuController' 并将视图更改为 SKView。完美运行,谢谢!不过最好避免使用xib..
    • 如果你是通过代码实现的,请尝试创建一个SKView,并在视图控制器的init方法中将其分配给视图控制器的view属性。
    【解决方案2】:

    与通常的 SpriteKit 模板相比,从单视图或空应用程序开始时,我遇到了同样的问题。当我添加一些我发现覆盖 loadView 方法的代码时,我的工作正常。尝试将它放在 View Controller 中的 viewDidLoad 上方。

    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    

    .h 文件是通常的 UIViewController。并记住在链接框架后#import!:

    @interface CharacterViewController : UIViewController
    

    所以完整的 .m 代码应该是这样的:

    @implementation CharacterViewController
    
    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"CharacterViewController viewDidLoad");
        // Do any additional setup after loading the view.
    
        // Configure the view.
        SKView * skView = (SKView *)self.view;
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;
    
    
        // Create and configure the scene.
        CharacterScene *character = [[CharacterScene alloc]initWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height)];
    
        character.backgroundColor = [UIColor blueColor];
    
        [skView presentScene:character];
    
    }
    

    【讨论】:

      【解决方案3】:

      或者您可以在prepareForSegue: 或在任何其他演示之前快速修复它

      -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
           UIViewController *destinationVC = segue.destinationViewController;
           SKView * skView = (SKView *)destinationVC.view;
      
          if (![skView isKindOfClass:[SKView class]]) {
              skView = [[SKView alloc] initWithFrame: skView.frame]; // self.view.bounds
              destinationVC.view = skView;
          }
      }
      

      【讨论】:

        【解决方案4】:

        在 MenuController.m 中替换你的初始化

        SKView *skView = (SKView *) self.view;

        SKView *skView = [[SKView alloc initWithFrame : self.view.frame];
        
        • 您只需要通过给 self.view 的框架而不是通过分配 self.view 的引用对象来初始化 SKView 的对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多