[英]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
再次配置SKView
( skView.ignoresSiblingOrder = true
),因为这可能已经在GameViewController
完成了。
编辑:
该行let skView = self.view as! SKView
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?
// ...
}
但是它们的类型不同意味着您使用它们的方式不同。 在SKScene
的案例中,请参见上文关于展开的内容。 对于UIViewController
,您需要使用以下行转换为SKView
:
let skView = self.view as! SKView
因为UIView
没有展示SKScene
所需的方法。 (有关转换的更多信息,我建议你看看Swift编程语言:类型转换 )
通常你不会被允许从UIView
为SKView
(请记住, SKView
是UIView
的子类)。 在Playgrounds中尝试以下操作:
let view = UIView()
let skView = view as! SKView
你应该得到一个错误:
无法将'UIView'(0x1041d0eb0)类型的值转换为'SKView'(0x10da10718)
但是你可以从施放UIView
到SKView
在GameViewController
因为自定义类 GameViewController
的view
已被设置为SKView
:
我希望这有助于消除你的困惑。
尝试这个 :
让sKView = self.view?.scene?.view
sKView?.presentScene(场景)
最好的问候,Yassine
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.