回答:
基本的にはできません。キーの組み合わせには順序が必要であり、順序にはイベントが必要です。
あなたができることは、各フレームのキーの状態を比較し、その違いから事後のキーアップ/キーダウンイベントを生成することで、ポーリングをイベントに変えることです。「ネイティブ」イベントシステムが提供するタイムスタンプやその他のフレーム内の順序付けを失うため、信頼性は低くなりますが、フレームごとに少なくとも1つのキーを検出して順序付けすることができます。
これらの順序付けられたイベントを取得したら、有限状態マシンまたはその他のツールを使用して、それらを移動リストと照合し、正しいものを実行できます。
1つの方法は、現在および以前の入力状態を保存し、入力をポーリングするたびにそれらを比較することです。
押すことができるキーごとに、キーが最後にダウン状態からアップ状態に切り替わったときのタイムスタンプを持つオブジェクトを保存します。
すべてのポーリングでこれを実行して、これらのオブジェクトを更新します。
void update(){
some_key_has_been_pressed = false;
foreach(key in keys){
if(previous_input[key].Down && current_input[key].Up){
keys[key].up_timestamp = current_time();
}
if(current_input[key].Down){
keys[key].down_timestamp = current_time();
some_key_has_been_pressed = true;
}
}
}
これで、コンボをのコンテンツに対してパターンマッチングできますkeys
。
各コンボのコンボオブジェクトを用意し、各ポーリングで各コンボオブジェクトのupdate()を呼び出します。
コンボオブジェクトのupdate()メソッドは、コンボにパターンマッチし、このポーリングでコンボに必要なすべての条件が満たされているかどうかを確認します。つまり、これまでのコンボのすべてのキーのタイムスタンプは順調であり、コンボを壊す他のキーはこのフレームで押されていません。一致する条件ごとに、コンボオブジェクトのカウンターをインクリメントして、チェックする次の条件に移動します。コンボですべての条件が満たされたら、コンボが実行するメソッドを呼び出します。場合some_key_has_been_pressed == true
しかし、コンボのために、次の条件であるキーが押されていない場合、0にコンボの満足条件カウンタをリセットします。
上記は、実装が簡単で、保守が容易で、効率的で、高度にモジュール化されているため、私が好む方法です。
ただし、別の優れた方法については、C#で記述されたXNA入力シーケンスサンプルを確認してください。ロジックは、使用している言語に転送できる可能性があります。
if(current_input[key].down){
は、キーがprevious_input
状態にあるかどうかも確認しませんか?書かれているように、私はそれが保持されたキーを継続的に更新すると思いますdown_timestamp
。
最後のXキーイベントのスタックを作成し、キーイベントごとにキーとプレス/リリースの時間でオブジェクトを追加し、スタックの最後のメンバーが特別なパターンに一致するかどうか、およびそれらのキーが十分に速く押されたかどうかを確認します組み合わせとして数えます。最後に、最も古いオブジェクトをスタックから削除します。