2016-12-30 17 views
1

背景
状態に私はトーナメントのためにリーダーボードを作成SpriteKitベースのアプリを作成しました

を取得するための複数の方法でGKStateMachineを使用します。 GKStateMachineを使用してコードをもっと頑強にして、状態を処理するための醜いコードを削除しようとしています。私はまた、ステートマシンを実験したいので、このフレームワークを将来のプロジェクトに使用する方法を学びます。私が見たすべての例(そしてたくさんありません)では、彼らはかなり単純なステートマシンダイアグラムを持っていました。私のほうがやや複雑です。これらのAPIを意図した方法で使用していることを確認したいだけです。

質問:私が見た例では、- didEnterWithPreviousState:にはifステートメントが含まれていないので、各ステートに到達する方法は1つしかないと推測されます。 - didEnterWithPreviousState:のステートメントを使用して、状態の入力方法を複数の方法で処理する方法を決定しますか?私はcontestantアイコンを選択し、リーダーボードにそれらを配置することだリーダーボードを設定するシーンで

プロジェクト情報

。参加者の数が2の累乗でない場合は、まず「byes」を選択する必要があります。

enter image description here

一旦全ての「不戦勝」位置の動的にリーダーボードを選択されたラウンド1一度

enter image description here

ために互いに対向しなければならない競技者用のスロットを作成しますラウンド1のすべての選手が選択された後、選手は選択肢の確認を求め、セットアップシーンからリーダーボードシーンに移動します。

enter image description here

は、ここに私の現在の状態が(ように見えるが、これはGKStateMachineを使用せずにあるものだ。

enter image description here

答えて

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 { 

    } 
} 
関連する問題