【问题标题】:Correctly presenting new scene in swift spritekit在 swift spritekit 中正确呈现新场景
【发布时间】:2015-06-01 20:54:25
【问题描述】:

我正在将 spritekit 与 swift 一起使用,我只是想呈现一个新场景……但出了点问题并抛出错误。我很确定这是正确的语法,这真的让我陷入了循环。

线

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

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

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

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

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

    如果有人按下它,你可以很确定你的SKScene 已经出现(因此view 不是nil) - 因此你可以强制解开view,如下所示:

    let scene = PlayScene(size: self.size)
    scene.scaleMode = .AspectFill
    view!.presentScene(scene)
    

    此外,您不需要再次配置SKView (skView.ignoresSiblingOrder = true),因为这可能已经在GameViewController 中完成。


    编辑:

    let skView = self.view as! SKView 行可能来自GameViewControllerUIViewController 的子类)。如果您查看 UIViewControllerSKScene 的文档,您会发现它们都有 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 没有呈现SKScene 所需的方法。 (有关选角的更多信息,我建议您查看The Swift Programming Language: Type Casting


    通常不允许您从UIView 转换为SKView(请记住SKViewUIView 的子类)。在 Playgrounds 中尝试以下操作:

    let view = UIView()
    let skView = view as! SKView
    

    你应该得到一个类似于以下内容的错误:

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

    但是,您可以在GameViewController 中将UIView 转换为SKView,因为GameViewControllerview自定义类 已设置为SKView: p>

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

    【讨论】:

    • 谢谢!我没有看到这一点的原因是我并不完全理解 let skView = self.view as SKView 这行的意义......你能解释一下为什么它甚至建议首先出现(在我的另一个谷歌搜索中),为什么你不需要在这里包含它?
    【解决方案2】:

    试试这个:

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

    sKView?.presentScene(场景)

    最好的问候, 亚辛

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多