【LWJGL3】キー、マウス入力 #2

Java

次はキー、マウス入力となります。

キーの入力

// キーが押されているか
public boolean isKeyDown(int key) {
    return GLFW.glfwGetKey(window, key) == 1;
}

// キーが押されたか
public boolean isKeyPressed(int key) {
    return isKeyDown(key) && !lastKeys[key];
}

// キーが離されたか
public boolean isKeyReleased(int key) {
    return !isKeyDown(key) && lastKeys[key];
}

上記のコードをWindowクラスに追加してください。
GLFW.glfwGetKeyでは引数に指定されたキーが押されているか確認できます。1が返されると押されているということになるみたいですね。

マウスの入力

// マウスが押されているか
public boolean isMouseDown(int button) {
    return GLFW.glfwGetMouseButton(window, button) == 1;
}

// マウスが押されたか
public boolean isMousePressed(int button) {
    return isMouseDown(button) && !lastMouseButtons[button];
}

// マウスが離されたか
public boolean isMouseReleased(int button) {
    return !isMouseDown(button) && lastMouseButtons[button];
}

こちらもWindowクラスに付け足してください。
上の項目の仕様と同じみたいです。

// 最後に押されたキー
public boolean[] lastKeys = new boolean[GLFW.GLFW_KEY_LAST];

// 最後に押されたマウスボタン
public boolean[] lastMouseButtons = new boolean[GLFW.GLFW_MOUSE_BUTTON_LAST];

上記の配列は上らへんに追記しておいてください。
これがないと最後に押されたキーを記録できません。

public void update() {
    for (int i = 0; i < GLFW.GLFW_KEY_LAST; i++)
        lastKeys[i] = isKeyDown(i);
    for (int i = 0; i < GLFW.GLFW_MOUSE_BUTTON_LAST; i++)
        lastMouseButtons[i] = isMouseDown(i);

    // マウスなど入力されたイベントを記録する
    GLFW.glfwPollEvents();
}

update関数にlastKeys, lastMouseButtonsへ最後に押されたキーを保存する処理を追加します。

マウスカーソルの座標

// マウスカーソルのX座標を取得
public double getMouseX() {
    DoubleBuffer buffer = BufferUtils.createDoubleBuffer(1);
    GLFW.glfwGetCursorPos(window, buffer, null);
    return buffer.get(0);
}

// マウスカーソルのY座標を取得
public double getMouseY() {
    DoubleBuffer buffer = BufferUtils.createDoubleBuffer(1);
    GLFW.glfwGetCursorPos(window, null, buffer);
    return buffer.get(0);
}

※DoubleBufferはダブルバッファリングではありません。
Double型のバッファにglfwGetCursorPos関数がマウスカーソルの位置を書き込むみたいですね。

動作確認

public static void main(String[] args) {
    Window window = new Window();

    // ウィンドウの初期化
    window.init();

    // 閉じるまでループ
    while (!window.isClosed()) {

        // イベントの更新
        window.update();

        if (window.isKeyPressed(GLFW.GLFW_KEY_A)) {
            System.out.println("Pressed A");
        }
        if (window.isKeyReleased(GLFW.GLFW_KEY_A)) {
            System.out.println("Released A");
        }
        if (window.isMousePressed(GLFW.GLFW_MOUSE_BUTTON_LEFT)) {
            System.out.println("Pressed Left");
            System.out.println("CursorPos: (" + window.getMouseX() + ", " + window.getMouseY() + ")");
        }
        if (window.isMouseReleased(GLFW.GLFW_MOUSE_BUTTON_LEFT)) {
            System.out.println("Released Left");
        }

        // バッファの更新
        window.swapBuffers();

    }
}

タイトルとURLをコピーしました