我有一个非常具体的问题。我曾经使用默认代码从 View Controller 呈现我的游戏场景。但是,我添加了另一个 SKScene,现在使用以下代码展示我的游戏场景:
//In an SKScene (not Game scene)
let scene = GameScene()
let skView = self.view!
skView.ignoresSiblingOrder = true
scene.scaleMode = .aspectFit
let push = SKTransition.push(with: SKTransitionDirection.right, duration: 0.4)
skView.presentScene(scene, transition: push)
我的问题是我的游戏场景似乎不再像运行代码行时那样识别我的 SKS 文件:
//in gamescene
sprite = self.childNode(withName: "sprite") as! SKLabelNode
展开时没有找到任何东西。 当我使用代码从 GameViewController 展示我的 SKScene 时:
if let scene = GKScene(fileNamed: "GameScene") {
// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! GameScene? {
// Copy gameplay related content over to the scene
sceneNode.entities = scene.entities
sceneNode.graphs = scene.graphs
// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFit
// Present the scene
if let view = self.view as! SKView? {
view.presentScene(sceneNode)
view.ignoresSiblingOrder = true
}
}
}
一切正常。我究竟做错了什么?提前致谢。
最佳答案
我认为当您从 SKScene
而不是从 UIViewController
呈现时崩溃的原因有两个。
- 您正在创建 2 个不同的类,它们可能具有不同的代码。当您从
SKScene
呈现时,您创建了一个类型为GameScene
的对象,但是当您从UIViewController
呈现时,您创建了一个类型为的对象>GKScene
. - 当您创建
GameScene
类型的对象时,您使用的初始化器没有考虑附加的 SKS 文件。但是,当您创建GKScene
类型的对象时,您会这样做。
因此,我将第一段代码编辑为:
//In an SKScene (not Game scene)
if let sceneContainer = GKScene(fileNamed: "GameScene") {
let skView = self.view!
skView.ignoresSiblingOrder = true
//Something comparable to the following line. I don't have a project set up, but let the compiler run you through the exact syntax.
let scene = sceneContainer.rootNode as! GameScene?
scene?.scaleMode = .aspectFit
let push = SKTransition.push(with: SKTransitionDirection.right, duration: 0.4)
skView.presentScene(scene!, transition: push)
}
可以找到从 GKScene
获取 SKScene
的文档 here .
关于swift - 从另一个无法从 SKS 文件加载的 SKScene 呈现的 SKScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43241064/