FlxFSM

API Reference > flixel.addons.util > FlxFSM

FlxFSM<T>

一般的なFSM(有限状態機械)を実装したクラスです。



フィールド

owner:T : FlxFSMを所有しているクラス

state:FlxFSMState<T> : 現在実行中のステート

stateClass:Class<FlxFSMState<T>> : 現在実行中のステートのクラスの型

age:Float : 現在のステートを開始してからの経過時間

name:String : このFSMの名前

スタックを利用するときのロック・アンロック時に使用します

type:Int : バイナリフラグ

スタックを利用するときのロック・アンロックフラグとして使用します

stack:FlxFSMStack<T> : FSMのスタック

transitions:FlxFSMTransitionTable?<T> : 状態遷移のテーブル

pools:StatePool?<T> : FlxFSMStateのインスタンスのプール

メソッド

new() : コンストラクタ

  • 引数
    • ?owner:T : FlxFSMを所有しているクラス
    • ?state:FlxFSMState<T> : ???

update() : アクティブなFlxFSMStateを更新

  • 引数
    • elapsed:Float : 経過時間

----

FlxFSMState

FSMのステートを実装するクラスです。

メソッド

enter() : ステートを開始するときに呼び出されます

  • 引数
    • owner:T : FlxFSMを管理しているクラス
    • fsm:FlxFSM<T> : このステートが所属しているFlxFSM
      ステートを別のものに切り替えるために使います
  • 戻り値:Void

update() : ステート実行中に常に呼び出されます

  • 引数
    • elapsed:Float : 経過時間
    • owner:T : FlxFSMを所有しているクラス
    • fsm:FlxFSM<T> : このステートが所属しているFlxFSM
      ステートを別のものに切り替えるために使います
  • 戻り値:Void

exit() : ステート終了時に呼び出されます

  • 引数
    • owner:T : FlxFSMを所有しているクラス
  • 戻り値:Void

destroy() : 破棄

  • 戻り値:Void

----

使い方

基本的な使い方の手順は以下のとおりです

  1. FlxFSMを管理するクラスを作成
  2. 管理クラスのコンストラクタで FlxFSMのインスタンスを作成してフィールドに保持する
  3. FlxFSM.transitions.add() で、遷移元のクラスと遷移先のクラス、遷移条件を追加する

サンプルコード

001.png
  • 立ち状態からジャンプボタンを押すと、ジャンプできる
  • ジャンプ状態から突進攻撃(ダイビングアタック)できる
  • 地面に着地すると立ち状態になる

という状態遷移を FlxFSM で実装する例です。

class Player extends FlxSprite {

  var _fsm:FlxFSM<Player>;

  /**
   * コンストラクタ
   */
  public function new() {
    super();

    _fsm = new FlxFSM<Player>(this);
    _fsm.transitions
      .add(Standby, Jump,    Conditions.isJump)    // 立ち状態 -> ジャンプ
      .add(Jump,    Standby, Conditions.isLanding) // ジャンプ -> 立ち状態
      .add(Jump,    Diving,  Conditions.isDiving)  // ジャンプ -> 突進攻撃
      .add(Diving,  Standby, Conditions.isLanding) // 突進攻撃 -> 立ち状態
      .start(Standby); // 立ち状態から開始
    _fsm.stateClass = Standby; // 立ち状態から開始 (※この設定も必要)
  }
}

// 遷移条件
private class Conditions {
  public static function isJump(owner:Player):Bool {
    // ジャンプしたかどうか
    return owner.isJump();
  }
  public static function isDiving(owner:Player):Bool {
    // 突進攻撃をしたかどうか
    return owner.isDiving();
  }
  public static function isLanding(owner:Player):Bool {
    // 着地したかどうか
    return owner.isLanding();
  }
}

// 立ち状態
private class Standby extends FlxFSMState<Player> {
  override public function enter(owner:Player, fsm:FlxFSM<Player>):Void {
    trace("立ち状態開始");
  }
  override public function update(elapsed:Float, owner:Player, fsm:FlxFSM<Player>):Void {
    trace("立ち状態中...");
  }
  override public function exit(owner:Player):Void {
    trace("立ち状態終了");
  }
}

// ジャンプ状態
private class Standby extends FlxFSMState<Player> {
  override public function enter(owner:Player, fsm:FlxFSM<Player>):Void {
    trace("ジャンプ状態開始");
  }
}

// 突進攻撃状態
private class Diving extends FlxFSMState<Player> {
  override public function enter(owner:Player, fsm:FlxFSM<Player>):Void {
    trace("突進攻撃開始");
  }
}