使用状态机时如何更新 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 会执行它的操作,完成后会进入另一个状态。但是,在此之前我需要一个 callbackview 这样我就可以像这样从棋盘上移除在战斗中丢失的单位:

self.removeChildren(in: nodesOutOfAction)

但是无法将 nodesstateMachine 发送出去,因为无法添加 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: ...)
    }
}

使用此逻辑,您可以将内部的许多逻辑与状态分离。