次はキー、マウス入力となります。
キーの入力
// キーが押されているか 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(); } }