FlxFSM の変更点


[[API Reference]] > [[flixel.addons.util]] > FlxFSM

* FlxFSM<T> [#hfe309d5]
一般的なFSM(有限状態機械)を実装したクラスです。

----
#contents
----
* フィールド [#j1a92b5f]
** owner:T : FlxFSMを所有しているクラス [#xf03145e]
** state:FlxFSMState<T> : 現在実行中のステート [#n346882e]
** stateClass:Class<FlxFSMState<T>> : 現在実行中のステートのクラスの型 [#la995dfe]
** age:Float : 現在のステートを開始してからの経過時間 [#b63ac7ab]
** name:String : このFSMの名前 [#w40f359d]
 スタックを利用するときのロック・アンロック時に使用します
** type:Int : バイナリフラグ [#c1facb78]
 スタックを利用するときのロック・アンロックフラグとして使用します
** stack:FlxFSMStack<T> : FSMのスタック [#ecd0e37d]
** transitions:FlxFSMTransitionTable<T> : 状態遷移のテーブル [#bb691ee4]
** pools:StatePool<T> : FlxFSMStateのインスタンスのプール [#i40f3422]

* メソッド [#tcfab45d]
** new() : コンストラクタ [#nfe06686]
- 引数
-- ?owner:T : FlxFSMを所有しているクラス
-- ?state:FlxFSMState<T> : ???

** update() : アクティブなFlxFSMStateを更新 [#c7d11ce4]
- 引数
-- elapsed:Float : 経過時間

* ---- [#j8201518]
* FlxFSMState [#j03554e8]
FSMのステートを実装するクラスです。
* メソッド [#t9079c01]
** enter() : ステートを開始するときに呼び出されます [#r1019b1b]
- 引数
-- owner:T : FlxFSMを管理しているクラス
-- fsm:FlxFSM<T> : このステートが所属しているFlxFSM
 ステートを別のものに切り替えるために使います
- 戻り値:Void

** update() : ステート実行中に常に呼び出されます [#o1f54f6b]
- 引数
-- elapsed:Float : 経過時間
-- owner:T : FlxFSMを所有しているクラス
-- fsm:FlxFSM<T> : このステートが所属しているFlxFSM
 ステートを別のものに切り替えるために使います
- 戻り値:Void

** exit() : ステート終了時に呼び出されます [#k7ad297f]
- 引数
-- owner:T : FlxFSMを所有しているクラス
- 戻り値:Void

** destroy() : 破棄 [#saf9478c]
- 戻り値:Void


----
* ---- [#n817b578]
* 使い方 [#i6830c4d]
基本的な使い方の手順は以下のとおりです

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

** サンプルコード [#xa98c0d3]

#ref(001.png);

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

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

#geshi(ActionScript3){{
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.isJump();
    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("突進攻撃開始");
  }
}


}}