在swift spritekit中正确呈现新场景

时间:2015-06-01 20:54:25

标签: ios swift sprite-kit

我正在使用swift的spritekit,我只是想尝试呈现一个新场景......但是出了点问题并抛出错误。我很确定这是正确的语法,这真的让我失去了一个循环。

该行

    let skView = self.view as SKView

给我错误“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)
            }
        }
    }

2 个答案:

答案 0 :(得分:14)

问题是view上的SKScene属性是可选的(SKView?),因为SKScene不一定具有包含视图;在呈现之前它包含了什么?没有。

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

if let view = self.view {
    let scene = PlayScene(size: self.size)
    scene.scaleMode = .AspectFill
    view.presentScene(scene)
}

你可以非常肯定你的SKScene已被呈现(因此view不是nil)如果有人正在按下它 - 那么你可以强行解包{{1像这样:

view

此外,您无需再次配置let scene = PlayScene(size: self.size) scene.scaleMode = .AspectFill view!.presentScene(scene) SKView),因为这可能已在skView.ignoresSiblingOrder = true中完成。

编辑:

GameViewController可能来自let skView = self.view as! SKViewGameViewController的子类)。如果您查看UIViewControllerSKScene的文档,您会发现它们都有UIViewController属性:

view

但是它们的类型不同意味着您使用它们的方式不同。在class UIViewController: /* Superclass and Protocols */ { var view: UIView! // ... } class SKScene: SKEffectNode { weak var view: SKView? // ... } 的情况下,请参阅上文关于展开的内容。对于SKScene,您需要使用以下行转换为UIViewController

SKView

因为let skView = self.view as! SKView 没有展示UIView所需的方法。 (有关投射的更多信息,我建议您查看The Swift Programming Language: Type Casting

通常,您不会被允许从SKScene投射到UIView(请记住,SKViewSKView的子类)。在Playgrounds中尝试以下操作:

UIView

你应该得到一些错误:

  

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

但是,您可以在let view = UIView() let skView = view as! SKView 中从UIView投射到SKView,因为GameViewController GameViewController自定义类已设置为view

enter image description here

我希望这有助于消除您的困惑。

答案 1 :(得分:0)

试试这个:

让sKView = self.view?.scene?.view

sKView?.presentScene(场景)

祝你好运, 亚辛