(Apple)使用SKScene实现GameplayKit State Machine

时间:2017-02-11 20:56:16

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

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

让我们说我想要3个州。菜单,游戏和游戏结束 - 所有这些都显示SKScene的内容。 GameScene类扩展了SKScene。因此,将GameScene变成状态机是不可能的,因为我们只能扩展一个类。

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

1 个答案:

答案 0 :(得分: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)
    }
}