[PR]子育てママさんへ:3年毎に15万円うけとれる医療保険?
ゲームで使えそうな状態遷移クラスを作ろう
あぁ,もう久々・・・・
ホムペほったらかしにして,何ヶ月かしら・・・
つーか,掲示板終わってるし・・・(01/08/29 現在)
フリーでBBS借りれるところだったんだけど,広告も何も出さないところだったから赤字でサービス中止になっちゃったらしいです.(やっぱりね)
むぅ・・・掲示板再設置しようかな…でも,どーせ誰も書かないからいいや! ほっとこー!!・・・・(TдT)
珍しく,愚痴から始まらない(?)今回の日記! いいね.いよいよNaoも人間的に成長したね!!
そういや,「最近,全然ゲーム作ってないみたいね,飽きたの?」と友人に言われた.
そりゃ,こんだけホムペほっときゃそう思われるわ・・・.ちゃんと作ってたっつーの!
もろもろの事情から公開できないだけ!(画像をパクってるとか)
しかも,ディレクトリごとゴッソリ消えたし・・・(最近調子悪い)
さて,今回はせっかく高い本を買ったら,参考にしてみよー.
この本,「GAME PROGRAMMING GEMS」といって,600ページ近くあって,12000円もする!!
しばらく飲み屋もいけないにゃー・・・
んで,この本の中にあった,FSM(有限状態マシン)のところがちょっと気になった.
有限状態マシンっていうのは,「いくつかの(有限の)状態があって,その状態に応じた動作が定義されており,
何かしらの入力(きっかけ)とかで,別の状態に遷移する」って感じのものです.
ゲーム本体のステート管理とか,キャラの状態制御とかいろいろ使えそうやね.
でもちょっと使いにくそうだったので,自分なりにいじってみた.
[仕様]
1.ステート登録機能
ステート番号と,そのステートの初期化関数のポインタ,通常動作関数のポインタ,後始末関数のポインタ,
をセットで登録する.
2.ステート遷移条件登録機能
ステート番号と,そのステートで発生する状態遷移の条件を判定する関数のポインタ,遷移先の状態ID,
をセットで登録する.
3.現在のステートの実行機能
現在のステートに対応する1でセットした「通常動作」を自動的に行う.
4.ステート遷移チェック機能
1で登録していた遷移条件関数を自動的に実行し,ステート遷移が発生する場合は,次のステートを返す.
5.ステート遷移機能
遷移したいステートを入力すると,現在のステートの後始末を行い,その後,次のステートの初期化を実行し,
ステートを変更する.
とまぁ,こんな機能をもったクラスを作成して使います.
このクラスを FSMClass とすると,具体的には,こんな感じ.
[初期化]:ゲーム開始時とかキャラ作成時に実行すればいい.
GameStart()
{
FSMClass fsm ; // 作成
fsm.AddState( STATE1, init1, proc1, uninit1 );
fsm.AddTrigger( STATE1, trig1, STATE2 ); // trig1がTRUEならSTATE2へ遷移
fsm.AddTrigger( STATE1, trig2, STATE3 ); // trig2がTRUEならSTATE3へ遷移
fsm.AddTrigger( STATE1, trig1, STATE3 );
fsm.AddState( STATE2, init2, proc2, NULL ); // NULLのときは何も実行されない
fsm.AddTrigger( STATE2, trig4, STATE3 );
fsm.AddState( STATE3, init3, proc3, uninit3 );
fsm.AddTrigger( STATE3, trig1, STATE1 );
}
[実行時]:毎フレーム呼ばれるところ.
MainLoop()
{
int state ;
fsm.DoState(); // 現在のステートの動作関数が呼ばれる.
if ( fsm.Trigger( &state ) ) // ステート遷移があったか?
{
fsm.ChangeState( state ); // このステートに遷移する.
}
}
とコレだけかいておけば,最初に登録したステートがかってに呼び出されるので,
プログラムが結構簡単になりますな.
うーん,しかし,この仕様は失敗かもにゃー・・・
なにしろ,関数のポインタを渡さないといけないから,ハードコーディングしないといけねぃ.
つまり,スクリプト化できねー!!
むぅ・・・やっぱりなんかの変数パラメータだけで制御するほうが良かったかにゃー・・・
スクリプト化できねーと,ステートが増えたときに無駄に初期化部分のプログラムが長くなりそうでいやだしぃ!!
なんかいい方法ないですかね?
<< Back to Diary...