これは、GetKeyDown()
メソッドで を呼び出すためです。そのメソッドを呼び出すと、から現在のキーの がKeyboard.next()
削除され、呼び出すと のみがイベントで補充されます。Event
Keyboard
Display.update();
注: このメソッドは、オペレーティング システムに新しいイベントを照会しません。そのためには、Display.processMessages() (または Display.update()) を最初に呼び出す必要があります。
出典: LWJGL ドキュメント
あなたは出来る
代わりに、Keyboard.isKeyDown(int key)メソッドを使用して、目的を達成できます。
ただし、以下に応じて true/false を返します。
戻り値: 最後の poll() に従ってキーが押されている場合は true
しかし、それは方法に依存しているため、それでも問題は完全には解決されませんpoll()
。
問題を解決する
すでに行ったように、クラスで使用するいくつかのカスタム メソッドを作成することで問題を解決できますがKeyboard
、キーボード イベントはメソッドを呼び出したときにのみ更新されますDisplay.update();
。
どの関数を作成するかについては、すでに正しい考えを持っていますが、それらを 2 つの異なる方法に分割する必要があります。キーボードを更新するたびに 1 回呼び出す 2 番目のメソッドが必要です。
public class MyKeyboard {
/*
* Remember that the index where we store the value,
* is the index of the key. Thereby one key might have
* an index of 400, then your array need to have at least
* the same size, to be able to store it.
*/
public static boolean[] keys = new boolean[100]; // 100 is the amount of keys to remember!
public static void update() {
while(Keyboard.next()) {
if (Keyboard.getEventKey() < keys.length) {
keys[Keyboard.getEventKey()] = Keyboard.getEventKeyState();
}
}
}
public static boolean isKeyDown(int key) {
if ((key > 0) && (key < keys.length)) {
return keys[key];
}
return false;
}
}
メソッドの名前を に変更したので、メソッドをMyKeyboard.update()
1 回だけ呼び出すことを忘れないでください。Display.update()
GetKeyDown()
isKeyDown()
上記のコードは、IDE などを使用せずに、この回答内で作成されました。したがって、何か問題がある場合はお詫びしますが、コメントして修正します。
この方法で発生する 1 つの問題は、再チェックの欠如です。Keyboard.next()
現在のフレームで発生した入力のみをチェックするため。一度押されたボタンは、再度押されるまで「押された」状態が続きます。このソリューションを実装しようとしているときに、この問題に遭遇しました。この新しい問題に対する答えは次のとおりです。
public static void update() {
for(int i = 0; i < keys.length; i++) {
keys[i] = false;
}
while(Keyboard.next()) {
keys[Keyboard.getEventKey()] = Keyboard.getEventKeyState();
}
}
すべてを false に設定して、前のフレームのキー押下をクリアする必要があります。