我有一个SpriteKit场景文件,1个SKScene BaseGameClass
,其中包含我游戏的所有常用逻辑和2个BaseGameClass
子类,用于不同的游戏模式。
两个子类基本上都是相同的游戏,但具有不同的规则/最终游戏状态等。
在我的主菜单场景中,我这样做:
switch node.name ?? "" {
case "lblQuickGame":
if let scene = GKScene(fileNamed: "GameScene") {
// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! QuickGameScene? {
// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFill
sceneNode.initializeGame(
gameSeed: .random(),
level: 1
)
self.view?.presentScene(sceneNode, transition: MenuScene.customSceneTransition())
}
}
...
...
我遇到的问题是游戏因此错误而崩溃
Could not cast value of type 'SKScene' (0x107e0a1e0) to 'xxxx.QuickGameScene'
这是抱怨我投出scene.rootNode
的位置。
是否可以拥有单个SKS文件,但允许为根节点加载不同的子类?!
更新
这就是我的SKS文件的设置方式。我想避免每个BaseGameScene子类有1个SKS,因为它们都是相同的,它将成为一个PITA来维护;)
我想知道我的问题是关于继承(在这种情况下,我试图将一个超类加入一个子类,你不能在OO中真正做到)与某种抽象接口相比?
答案 0 :(得分:0)
我想我已经明白了! MainMenu场景不需要做GKScene的东西,它可以直接使用适当的类加载GameScene文件并呈现该场景。另外,我必须从我的SKS文件中删除任何自定义类值。
func touchDown(atPoint pos : CGPoint) {
let node = self.atPoint(pos)
guard let view = self.view else {
NSLog("No View Found")
return
}
switch node.name ?? "" {
case "lblTimeTrail":
guard let scene = TimeTrailGameScene(fileNamed: "GameScene") else {
NSLog("GameScene not Found")
return
}
scene.scaleMode = .aspectFill
scene.initializeGame(
gameSeed: .random(),
level: 1
)
view.presentScene(scene, transition: MenuScene.customSceneTransition())
case "lblQuickGame":
guard let scene = QuickGameScene(fileNamed: "GameScene") else {
NSLog("GameScene not Found")
return
}
scene.scaleMode = .aspectFill
scene.initializeGame(
gameSeed: .init(a: .cow, b: .snake, c: .goose),
level: 1
)
view.presentScene(scene, transition: MenuScene.customSceneTransition())
default:
NSLog("Unknown node: %@", node)
}
}
注意:我可以使这段代码更加优雅。让它工作,然后让它更快/更好;)
GKScene(fileNamed: ..., rootNode: ...)
路线是死路一条。这是一种完全没有记录的方法。
在这样的时刻我错过了使用像Cocos2D这样的开源框架......至少我可以深入研究代码并理解某些东西的运作方式;使用SpriteKit我们只需要获取方法头,我们通常只是猜测它是如何工作的!