我正在使用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)
}
}
}
答案 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! SKView
(GameViewController
的子类)。如果您查看UIViewController
和SKScene
的文档,您会发现它们都有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
(请记住,SKView
是SKView
的子类)。在Playgrounds中尝试以下操作:
UIView
你应该得到一些错误:
无法将'UIView'(0x1041d0eb0)类型的值转换为'SKView' (0x10da10718)
但是,您可以在let view = UIView()
let skView = view as! SKView
中从UIView
投射到SKView
,因为GameViewController
GameViewController
的自定义类已设置为view
:
我希望这有助于消除您的困惑。
答案 1 :(得分:0)
试试这个:
让sKView = self.view?.scene?.view
sKView?.presentScene(场景)
祝你好运, 亚辛