使用状态机时如何更新 UI
How do you update your UI when using a state machine
我正在使用 gamePlayKit
中的 swifts
stateMachine
。效果很好,但有一件事我不明白: stateMachine
似乎是它自己的孤岛;据我所知,无法传入 arguments
或获取 callbacks
。这引发了诸如如何更新 UI?
之类的问题
假设我进入战斗状态:
stateMachine.enter(CombatState.self)
无法传入 argument
。好的。但随后 CombatState 会执行它的操作,完成后会进入另一个状态。但是,在此之前我需要一个 callback
到 view
这样我就可以像这样从棋盘上移除在战斗中丢失的单位:
self.removeChildren(in: nodesOutOfAction)
但是无法将 nodes
从 stateMachine
发送出去,因为无法添加 completion handler
。那么你如何解决这个问题呢?对我来说 stateMacine
毫无意义,因为它无法更新 UI.
可以像这样访问 properties
状态:
stateMachine.enter(CombatState.self)
self.removeChildren(in: combatState.nodesToRemove)
但这并不安全,对吧?尽管如此,由于这是我所知道的唯一选择,这就是我解决它的方法。
我完全建议您查看 DemoBots project from Apple。
您应该在 State Initializer
上传递实体引用
例如
class CombatState: GKState {
unowned var gameScene: GameScene
required init(gameScene: GameScene) {
self.gameScene = gameScene
}
override func didEnter(from previousState: GKState?) {
gameScene.removeChildren(in: ...)
}
}
使用此逻辑,您可以将内部的许多逻辑与状态分离。
我正在使用 gamePlayKit
中的 swifts
stateMachine
。效果很好,但有一件事我不明白: stateMachine
似乎是它自己的孤岛;据我所知,无法传入 arguments
或获取 callbacks
。这引发了诸如如何更新 UI?
假设我进入战斗状态:
stateMachine.enter(CombatState.self)
无法传入 argument
。好的。但随后 CombatState 会执行它的操作,完成后会进入另一个状态。但是,在此之前我需要一个 callback
到 view
这样我就可以像这样从棋盘上移除在战斗中丢失的单位:
self.removeChildren(in: nodesOutOfAction)
但是无法将 nodes
从 stateMachine
发送出去,因为无法添加 completion handler
。那么你如何解决这个问题呢?对我来说 stateMacine
毫无意义,因为它无法更新 UI.
可以像这样访问 properties
状态:
stateMachine.enter(CombatState.self)
self.removeChildren(in: combatState.nodesToRemove)
但这并不安全,对吧?尽管如此,由于这是我所知道的唯一选择,这就是我解决它的方法。
我完全建议您查看 DemoBots project from Apple。
您应该在 State Initializer
例如
class CombatState: GKState {
unowned var gameScene: GameScene
required init(gameScene: GameScene) {
self.gameScene = gameScene
}
override func didEnter(from previousState: GKState?) {
gameScene.removeChildren(in: ...)
}
}
使用此逻辑,您可以将内部的许多逻辑与状态分离。