0

基本的に、呼び出すことができるメソッドを持つ静的な入力クラスを作成しました。これは次のとおりです。

public static boolean GetKeyDown(int keyCode) {
    while(Keyboard.next()) {
        Keyboard.enableRepeatEvents(false);
        if (Keyboard.getEventKeyState()) {
            if (Keyboard.getEventKey() == keyCode) {
                return true;
            } else {
                return false;
            }
        }
    }
    return false;
}

そして、私のゲーム更新ループでは、単一の while ループを作成する代わりに、これを使用したいと考えていました。

if(Input.GetKeyDown(KeyCode.S)) {
    //Something happens
}
if(Input.GetKeyDown(KeyCode.R)) {
    //Something happens
}
//etc..

しかし、最初にロードされたものだけが機能するようです。この場合は「S」です。他のものも使用できるようにする方法はありますか?

4

1 に答える 1

3

これは、GetKeyDown()メソッドで を呼び出すためです。そのメソッドを呼び出すと、から現在のキーの がKeyboard.next()削除され、呼び出すと のみがイベントで補充されます。EventKeyboardDisplay.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 に設定して、前のフレームのキー押下をクリアする必要があります。

于 2013-11-07T10:28:46.163 に答える