我正在使用 swift 4.2 制作 SpriteKit 框架,并希望包含一些用于场景和动作的 .sks 文件。我尝试使用以下代码从包中加载场景:
class func newGameScene() -> GameScene {
guard let gameScenePath = Bundle(for: self).path(forResource: "GameScene", ofType: "sks") else { assert(false) }
guard let gameSceneData = FileManager.default.contents(atPath: gameScenePath) else { assert(false) }
let gameSceneCoder = NSKeyedUnarchiver(forReadingWith: gameSceneData)
guard let scene = GameScene(coder: gameSceneCoder) else { assert(false) }
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
return scene
}
我加载场景并呈现它。 (此代码主要来自 Apple 的 SpriteKit 模板,因为我正在测试此问题。)
guard let view = view else {
return nil
}
let scene = GameScene.newGameScene()
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
return nil
在本例中,GameScene.sks 和代码与 Apple 模板相同。此代码和 .sks 资产位于动态框架中并导入到另一个项目中。
当框架将场景加载到我传递的视图中时,它显示 fps 和节点数,但不显示“Hello,World!”文本。
在下面的代码中,也是从模板复制的,断点表明当鼠标按下时不会调用这些代码。
#if os(OSX)
// Mouse-based event handling
extension GameScene {
override func mouseDown(with event: NSEvent) {
if let label = self.label {
label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
}
self.makeSpinny(at: event.location(in: self), color: SKColor.green)
}
override func mouseDragged(with event: NSEvent) {
self.makeSpinny(at: event.location(in: self), color: SKColor.blue)
}
override func mouseUp(with event: NSEvent) {
self.makeSpinny(at: event.location(in: self), color: SKColor.red)
}
}
#endif
我知道这一定与 SpriteKit 加载场景的方式有关,但找不到解决方案。我必须使用 NSKeyedUnarchiver 因为 SpriteKit 内置文件初始值设定项:
GameScene(fileNamed: "GameScene")
仅从主包加载。
现在,在上面我假设可以使用编码器加载该文件,但 Tomato 指出 sks 很可能不是使用编码器保存的。在这种情况下,可能无法使用苹果提供的 api 从 sprite-kit 中的另一个包加载 sks 文件。答案可能不包括编码员。