繁体   English   中英

在swift spritekit中正确呈现新场景

[英]Correctly presenting new scene in swift spritekit

我正在使用带有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)
            }
        }
    }

问题是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再次配置SKViewskView.ignoresSiblingOrder = true ),因为这可能已经在GameViewController完成了。


编辑:

该行let skView = self.view as! SKView let skView = self.view as! SKView是可能GameViewController (的子类UIViewController )。 如果你看一下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所需的方法。 (有关转换的更多信息,我建议你看看Swift编程语言:类型转换


通常你不会被允许从UIViewSKView (请记住, SKViewUIView的子类)。 在Playgrounds中尝试以下操作:

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

你应该得到一个错误:

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

但是你可以从施放UIViewSKViewGameViewController因为自定义类 GameViewControllerview已被设置为SKView

在此输入图像描述

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

尝试这个 :

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

sKView?.presentScene(场景)

最好的问候,Yassine

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM