使用GKStateMachine以多种方式进入状态

时间:2016-12-30 00:21:39

标签: objective-c macos sprite-kit

背景

我创建了一个SpriteKit应用程序,可以为锦标赛创建排行榜。我试图通过使用GKStateMachine删除一些处理状态的丑陋代码来使代码更加健壮。我还想尝试使用状态机,以便学习如何将此框架用于未来的项目。对于我所见过的所有例子(并且没有多少),他们拥有非常简单的状态机图。我的稍微复杂一些。我只是想确保我们以预期的方式使用这些API。

问题:在我看过的例子中,- didEnterWithPreviousState:中从未有任何if语句,这意味着我猜它假设只有一种方法可以到达每个州。您是否会使用- didEnterWithPreviousState:中的if语句来决定如何处理可能进入州的多种方式?

项目信息

在我设置排行榜的场景中,我选择contestant图标并将其放入排行榜。如果参赛者的数量不是2的权力,那么" byes"需要先选择。

enter image description here

一旦所有的" byes"已经选择了位置,排行榜动态地为参赛者创建了一个位置,这些参赛者将不得不面对第一轮。

enter image description here

一旦选定了所有第1轮选手,将会寻求确认选项,然后从设置场景移动到排行榜场景。

enter image description here

这是我当前状态的样子(但没有使用GKStateMachine

enter image description here

1 个答案:

答案 0 :(得分:2)

switchif语句是GKState类中的常见模式。您可以根据需要添加任意数量的案例。

// Objective-C
- (BOOL)isValidNextState:(Class)stateClass {
    return stateClass == [NormalState class] || stateClass == [AbnormalState class];
}

- (void)didEnterWithPreviousState:(GKState *)previousState {
    if (previousState == [NormalState class]) {

    } else if (previousState == [AbnormalState class])  {

    }
}

// Swift
override func isValidNextState(stateClass: AnyClass) -> Bool {
    switch stateClass {
    case is NormalState.Type:
        return true

    default:
        return false
    }
}

override func didEnterWithPreviousState(previousState: GKState?) {
    if let _ = previousState as? NormalState {

    }
}