背景
我创建了一个SpriteKit应用程序,可以为锦标赛创建排行榜。我试图通过使用GKStateMachine
删除一些处理状态的丑陋代码来使代码更加健壮。我还想尝试使用状态机,以便学习如何将此框架用于未来的项目。对于我所见过的所有例子(并且没有多少),他们拥有非常简单的状态机图。我的稍微复杂一些。我只是想确保我们以预期的方式使用这些API。
问题:在我看过的例子中,- didEnterWithPreviousState:
中从未有任何if语句,这意味着我猜它假设只有一种方法可以到达每个州。您是否会使用- didEnterWithPreviousState:
中的if语句来决定如何处理可能进入州的多种方式?
项目信息
在我设置排行榜的场景中,我选择contestant
图标并将其放入排行榜。如果参赛者的数量不是2的权力,那么" byes"需要先选择。
一旦所有的" byes"已经选择了位置,排行榜动态地为参赛者创建了一个位置,这些参赛者将不得不面对第一轮。
一旦选定了所有第1轮选手,将会寻求确认选项,然后从设置场景移动到排行榜场景。
这是我当前状态的样子(但没有使用GKStateMachine
。
答案 0 :(得分:2)
switch
和if
语句是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 {
}
}