FlxFSM
API Reference > flixel.addons.util > FlxFSM
FlxFSM<T>
一般的なFSM(有限状態機械)を実装したクラスです。
- FlxFSM<T>
- フィールド
- 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のインスタンスのプール
- メソッド
- ----
- FlxFSMState
- メソッド
- ----
- 使い方
フィールド
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
----
使い方
基本的な使い方の手順は以下のとおりです
- FlxFSMを管理するクラスを作成
- 管理クラスのコンストラクタで FlxFSMのインスタンスを作成してフィールドに保持する
- FlxFSM.transitions.add() で、遷移元のクラスと遷移先のクラス、遷移条件を追加する
サンプルコード
- 立ち状態からジャンプボタンを押すと、ジャンプできる
- ジャンプ状態から突進攻撃(ダイビングアタック)できる
- 地面に着地すると立ち状態になる
という状態遷移を 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("突進攻撃開始"); } }