在swift spritekit中正确呈现新场景

mno*_*not 3 ios sprite-kit swift

我正在使用带有swift的spritekit,我只是想尝试呈现一个新的场景......但是有些东西是错误的,并且会抛出错误.我很确定这是正确的语法,这真的让我陷入了一个循环.

这条线

    let skView = self.view as SKView
Run Code Online (Sandbox Code Playgroud)

给我错误"SKView?不能转换为SKView

任何建议表示赞赏!*我目前的代码如下:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch: AnyObject in touches{
        let location = touch.locationInNode(self)
        if(self.nodeAtPoint(location) == self.playButton)
            {
                var scene = PlayScene(size: self.size)
                let skView = self.view as SKView
                    // Configure the view.

                /* Sprite Kit applies additional optimizations to improve rendering performance */
                skView.ignoresSiblingOrder = true

                /* Set the scale mode to scale to fit the window */
                scene.scaleMode = .AspectFill

                skView.presentScene(scene)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

ABa*_*ith 14

问题是view属性on SKScene是一个optional(SKView?),因为SKScene它不一定有一个包含视图; 在呈现之前它包含了什么?没有.

要解决您的问题,您需要通过展开view属性来检查场景是否具有视图,通过使用可选绑定,例如:

if let view = self.view {
    let scene = PlayScene(size: self.size)
    scene.scaleMode = .AspectFill
    view.presentScene(scene)
}
Run Code Online (Sandbox Code Playgroud)

如果有人按下它,你可以非常肯定你SKScene已被呈现(因而view不是nil) - 因此你可以强行解包view,如下:

let scene = PlayScene(size: self.size)
scene.scaleMode = .AspectFill
view!.presentScene(scene)
Run Code Online (Sandbox Code Playgroud)

此外,您不需要配置SKViewagain(skView.ignoresSiblingOrder = true),因为这可能已经完成了GameViewController.


编辑:

这条线let skView = self.view as! SKView很可能来自GameViewController(一个子类UIViewController).如果你看看文档UIViewController,SKScene你会发现它们都有一个view属性:

class UIViewController: /* Superclass and Protocols */ {
    var view: UIView!
    // ...
}

class SKScene: SKEffectNode {
    weak var view: SKView? 
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是它们的类型不同意味着您使用它们的方式不同.在SKScene上面看到关于展开的情况.在这种情况下UIViewController,您需要SKView使用该行进行转换:

let skView = self.view as! SKView
Run Code Online (Sandbox Code Playgroud)

因为UIView没有表达所需的方法SKScene.(有关转换的更多信息,我建议你看看Swift编程语言:类型转换)


通常你不会被允许转换UIViewSKView(请记住,这SKView是一个子类UIView).在Playgrounds中尝试以下操作:

let view = UIView()
let skView = view as! SKView
Run Code Online (Sandbox Code Playgroud)

你应该得到一个错误:

无法将'UIView'(0x1041d0eb0)类型的值转换为'SKView'(0x10da10718)

然而,你可以从投UIViewSKViewGameViewController,因为自定义类GameViewControllerview已被设置为SKView:

在此输入图像描述

我希望这有助于消除你的困惑.