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;
}

菜单控制器.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

4 回答 4

25

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

于 2013-11-10T12:17:34.730 回答
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];

}
于 2014-08-14T15:04:41.553 回答
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;
    }
}
于 2015-09-17T07:13:13.320 回答
0

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

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

SKView *skView = [[SKView alloc initWithFrame : self.view.frame];
  • 您只需要通过给 self.view 的框架而不是通过分配 self.view 的引用对象来初始化 SKView 的对象。
于 2017-12-21T11:27:49.390 回答