单个GKScene,BaseGame类与多个子类共享

时间:2017-12-14 15:34:23

标签: ios swift xcode sprite-kit skscene

我有一个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 setting

这就是我的SKS文件的设置方式。我想避免每个BaseGameScene子类有1个SKS,因为它们都是相同的,它将成为一个PITA来维护;)

我想知道我的问题是关于继承(在这种情况下,我试图将一个超类加入一个子类,你不能在OO中真正做到)与某种抽象接口相比?

1 个答案:

答案 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我们只需要获取方法头,我们通常只是猜测它是如何工作的!