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("突進攻撃開始");
}
}
}}