如何使用 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)
AlienState class, alienWaitState 是一个子class
class AlienState: GKState {
weak var game:GameScene?
var associatedAlienName:String?
....
在进入状态时,我想通过如下状态传递参数:
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)
AlienState class, alienWaitState 是一个子class
class AlienState: GKState {
weak var game:GameScene?
var associatedAlienName:String?
....