« よーやく、ぱにぽにだっしゅ見た | メイン | コマンド解析ロジック その2 »

コマンド解析ロジック

無敵格闘娘では必殺技コマンドの解析ロジックに、SFXVIでも使われていた伝統のキュー方式を使っています。
これは、キー入力をバッファ(キュー)に溜めて、フレーム毎にそのバッファを遡って必要な入力が存在するかどうかをチェックする方法です。

例えば波動拳コマンド(下、前下、前、ボタン)であれば、次のようになります。
1.ボタンが押されている?
2.過去12フレーム以内に前が押されている?
3.前が押された時点から過去12フレーム以内に前下が押されている?
4.前下が押された時点から過去12フレーム以内に下が押されている?
5.コマンド成立

利点としては、実装がとても平易であることが挙げられます。

が、キューに取り込んでいない情報は使えないという欠点があります。
例えば、「コマンド入力開始時に画面端にいること」が条件のコマンドがあったとすると、キャラの位置もキューに保存していなければいけません。「立ち途中に前+ボタン」のような鉄拳風のコマンドだったら立ち途中かどうか?という情報も保存しないといけません。

つまり条件が増えるたびに保存しなきゃいけない情報も増えるので最終的にキューのサイズがとんでもないことになる可能性があります。

現実問題としては、そんな悲観するような事態は起こらないでしょう。キー入力だけで事足りる場合が殆どですし。実際、今までずっとそれでやってきました。


が、前後ステップを実装しようと思うだけで、キュー方式では破綻の恐れが出てくるのです。
前ステップのコマンドを前・前とすると、前・前・前と入力したとき、タイミング次第では前ステップ2回と解釈されるのです。
どうってこと無さそうに感じるかもしれませんが、実際に動かしてみるとこれはかなりストレスがたまります。

もちろん回避方法はありますが、例外処理的なものになってしまいます。
破綻しそうな部分にいちいち例外処理を入れていくのは対症療法的です。

キューを使わない方法で実装すべきだと、常々思っていました。
いいアルゴリズムはないかと色々考えて調べてみたりしたんですがさっぱりわかりません。ググるとオートマトンにぶちあたるんですが、これをどう使えばいいのか・・・?


でも、ふとしたことから実装方法が思いつきました。
実装してテストしているところですが、なんか上手く動いているっぽい?

長くなってきたので、次のエントリでアルゴリズムについて簡単に触れてみたいと思います。