注:API制限(SFML)のためにコールバックを行うのではなく、ポーリングする必要があります。「まともな」タイトルがないこともおizeび申し上げます。
ここで2つの質問があると思います。受け取った入力を登録する方法と、それをどうするか。
入力の処理
たとえば、「A」キーが押されたことを登録したという事実と、そこからそれを行う方法について話します。
私は次のようなキーボード全体の配列を見てきました:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
しかし、これは非効率的です。たとえば、「A」キーを「左に移動するプレーヤー」に結合するだけでなく、毎秒30〜60回すべてのキーをチェックします。
次に、必要なキーを探すだけの別のシステムを試しました。
std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'.
input->BindKey(Keys::PlayerLeft, KeyCode::A); //so now you can check if PlayerLeft, rather than if A.
ただし、これに関する問題は、たとえば、すべてのキーをバインドすることなく、名前を入力できないことです。
次に、2番目の問題がありますが、次の問題の良い解決策を考えることはできません。
入力を送信する
これで、Aキーが押されたか、playerLeftがtrueであることがわかりました。しかし、ここからどうやって行くのですか?
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
これをチェックすることで、入力がエンティティに大きく結合されることを考えました
が、かなり面倒です。プレーヤーは、更新されたときに独自の動きを処理することを好みます。ある種のイベントシステムが機能すると思っていましたが、どうすればよいかわかりません。(信号とスロットはこの種の作業に適していると聞きましたが、明らかに非常に遅く、どのように適合するかわかりません)。
ありがとう。