【问题标题】:(Apple) GameplayKit State Machine implementation with SKScene(Apple) 使用 SKScene 实现 GameplayKit 状态机
【发布时间】:2017-02-11 20:56:16
【问题描述】:

我已经阅读了 GameplayKit 状态机和 documentation 明确提到游戏 UI 作为使用示例。我完全理解这个概念,但我不确定如何在使用 SpriteKit 时实现它。

假设我想要 3 个状态。菜单、游戏玩法和游戏结束 - 所有这些都向 SKScene 显示内容。 GameScene 类扩展了 SKScene。所以不可能把 GameScene 变成一个状态机,因为我们只能扩展一个类。

GameScene 是否应该有一个引用 SKScene 的状态机变量,还是有更好的解决方案?早些时候我使用了状态机协议,这很容易,但我想尝试一下 GameplayKit 的功能。

【问题讨论】:

    标签: ios sprite-kit state-machine gameplay-kit


    【解决方案1】:

    你在正确的轨道上。在 GameScene 中添加状态机变量并初始化其起始状态。

    import SpriteKit
    import GameplayKit
    
    class GameScene: SKScene {
        var stateMachine: GKStateMachine!
    
        override func didMove(to view: SKView) {
            self.stateMachine = GKStateMachine(states: [
                StartState(scene: self),
                PlayingState(scene: self),
                PausedState(scene: self),
            GameOverState(scene: self)
            ])
    
            self.stateMachine.enter(StartState.self)
        }
    
        override func update(_ currentTime: TimeInterval) {
            self.stateMachine.update(deltaTime: currentTime)
        }
    }
    

    然后初始化状态,以便它们接受 GameScene 作为输入参数。

    import SpriteKit
    import GameplayKit
    
    class StartState: GKState {
        var scene: GameScene!
    
        init(scene: GameScene){
            super.init()
    
            self.scene = scene
        }
    
        override func isValidNextState(_ stateClass: Swift.AnyClass) -> Bool {
            return stateClass == PlayingState.self
        }
    
        override func updateWithDeltaTime(seconds: TimeInterval) {
            self.stateMachine?.enterState(PlayingState.self)
        }
    }
    

    【讨论】:

    • 我发现this article 很好地解释了GKStateMachine,并详细介绍了将逻辑放入每个状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2011-03-31
    • 2010-11-14
    • 1970-01-01
    • 2012-06-26
    • 2022-11-20
    相关资源
    最近更新 更多