対戦格闘の仕組みを考えた。

職場の近くに中古パソコン屋ができたので、ちょっとよってみた。これがレッツノートかと感心しつつ、手ぶらで帰るのもアレなので、パッドなるものを買ってみた。*1
で、ためすすがめつして考えた。対戦格闘って作れるよなあ、これで。相手いないけどさ。

確認

まずは、使える道具を確認する。
最も低レベルなパッドインターフェイスは、今現在の状態を取得することができる。
つまり、方向キーのx軸y軸(z軸)それぞれについて倒れているか否か、倒れているならばその方向、それと、どのキーが押されているか。
NScripter単体ではできないけれども、君影草工房のGetKeyでパッドのこれを取得できる。
で、言うまでもないけれども、これだけでは足りない。
方向キーのどれかが押されていたとして、それがダッシュなのか走るなのか、そういうことの区別もできない。入力されたキーの内容を、ある程度のスパンで記録し、その記録からコマンドを読み取るプログラミングが必要になる。

そもそもコマンドとは?

よく言われるのが、方向キーをキーボードのテンキーに見立てて数字で定義するタイプ。
たとえば、「右向きの時、236Pで波動拳」とかだ。
しかしこの定義をそのままプログラムに組み込むことはできない。粗すぎるのだ。
まず、前提として、「コン」と「入れっぱなし」の違いを定義しなければならない。
たとえば、ダッシュとかバックダッシュによく使われる表現が、「レバーを軽くココンと入れる」とかそういうのだ。だいたい、レバーを入れて、その方向からずれる(ニュートラルに戻すを含む)までの時間が、13フレームから20フレームくらいなら、「コン」のうちになり、それ以上だと「入れっぱなし」になる。それに加えて、60フレーム以上入れていたら「溜め」成立とか。
そこで、最初の波動拳の例に戻って厳密に再定義してみると。

  • 236の全てがコン。Pは単なるボタンダウン(中には溜め技もあるけれども)
  • 236Pのそれぞれの間に、ニュートラルがあってもよいが、このニュートラル状態も「コン」と同じスパン内でなければならない。
  • 236Pの間に別の14789やKが入ると、成立しない。

また、バーチャの投げやザンギのダブルラリアットのようなキー同時押しについても、5フレームまでのずれは許容する、みたいな定義が必要だろう。
で、格闘ゲームはシューティングと同様に処理スピード命なので、高速で判定できる方法とデータ構造を気が済むまで考えなければなりません、と。