简单的Sprite Kit场景设置出了问题

8

我正在尝试建立一个简单的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'
4个回答

25
在界面构建器中,将窗口视图的类更改为SKView。将UIView强制转换为SKView除非先前通过强制转换SKView获得了UIView,否则不会产生任何效果。

1
一个很好的提示是错误信息中列出的类是UIView而不是SKView。此外,该错误是关于选择器setShowFPS:未被识别(这个选择器由SKView实现,但它的父类UIView没有实现)。 - Kitsune
谢谢,但我这里不使用任何storyboard。所以没有使用Interface Builder。有没有办法用代码来完成呢?我认为应该是_SKView *skView = (SKView *)self.view;_ 这一行... - Lapidus
重新创建了'MenuController',使用xib并将视图更改为SKView。完美运行,谢谢!不过最好避免使用xib。 - Lapidus
1
如果您想通过代码实现,请尝试在视图控制器的“init”方法中创建一个SKView并将其分配给视图控制器的“view”属性。 - Roshan

5

当我从单视图或空应用程序开始时,遇到了相同的问题,与通常的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];

}

1

或者您可以在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;
    }
}

0
在MenuController.m中,将您的初始化代码 SKView *skView = (SKView *) self.view; 替换为
SKView *skView = [[SKView alloc initWithFrame : self.view.frame];
  • 你只需要通过给出self.view的框架来初始化SKView对象,而不是分配self.view的引用对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接