【问题标题】:Using GKStateMachine with multiple ways to get to a state使用 GKStateMachine 以多种方式进入状态
【发布时间】:2016-12-30 00:21:39
【问题描述】:

背景

我创建了一个 SpriteKit 应用程序,用于为锦标赛创建排行榜。我试图通过使用GKStateMachine 来删除一些用于处理状态的丑陋代码,从而使代码更加健壮。我也只是想试验状态机,以便学习如何在未来的项目中使用这个框架。对于我见过的所有示例(并且数量不多),它们都有非常简单的状态机图。我的稍微复杂一些。我只是想确保以预期的方式使用这些 API。

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

项目信息

在我设置排行榜的场景中,我选择contestant 图标并将它们放入排行榜。如果参赛人数不是 2 的幂,则需要先选择“再见”。

一旦选择了所有“再见”位置,排行榜就会动态地为必须在第 1 轮中面对面的参赛者创建位置。

一旦第一轮的所有参赛者都被选中,那么将寻求确认选择,然后从设置场景移动到排行榜场景。

这是我目前的状态(但这没有使用GKStateMachine。

【问题讨论】:

    标签: objective-c macos sprite-kit


    【解决方案1】:

    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 {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2013-06-26
      • 2015-04-17
      相关资源
      最近更新 更多