如何使用 GKStateMachine 的状态传递参数

How to pass parameters using GKStateMachine's states

在进入状态时,我想通过如下状态传递参数:

playerStateMachine.enter(pauseState.self, ["score":123, "rank":1])

所以我可以在 didEnter 方法中获取如下值:

class pauseState: GKState {
    var userinfo:[String:Any]?

    init(player: SSGameDelegate) {
        super.init(player: player)
    }

    override func didEnter(from previousState: GKState?) {
        super.didEnter(from: previousState)
       //Access input value here
       print(userinfo["score"])
       print(userinfo["rank"])

    }

}

你不能这样传递参数。在你目前的状态下,有一个功能。

func willExit(to nextState: GKState)

你可以把参数传过去nextState.userinfo[score] = 111

如果您跟踪状态机状态,则可以在进入状态之前设置参数。我不完全确定这是线程安全的,我会在进一步测试使用情况时进行更新。

let alienWaitState = AlienWaitState(game: self)
let alienFlyingState = AlienFlyingState(game: self)

aliensStateMachine = GKStateMachine(states: [
  alienWaitState,
  alienFlyingState,
  AlienAnimateOffState(game: self),
  AlienDeadRemovalState(game: self)
])

本例alienState参数"associatedAlienName"可以在进入状态前设置

alienWaitState.associatedAlienName = newAlien.name
aliensStateMachine.enter(AlienWaitState.self)

A​​lienState class, alienWaitState 是一个子class

class AlienState: GKState {  
    weak var game:GameScene?
    var associatedAlienName:String?  
    ....