20220728160 の変更点
#author("2024-01-06T11:48:52+09:00","default:pitablog","pitablog")
#author("2024-01-06T11:49:03+09:00","default:pitablog","pitablog")
#include(include/oldblog,notitle)
CENTER:&ref(https://blog.pitan76.net/wp-content/uploads/2022/07/LWJGL32.png);
----
* 【LWJGL3】キー、マウス入力 #2 [#title]
#splitbody{{
LEFT:
&tag(情報技術,プログラミング,Java,LWJGL,LWJGL3);
#split
RIGHT:&size(13){投稿日: 2022-07-28 (木)};
}}
#bcontents
次はキー、マウス入力となります。
* キーの入力 [#qe0e6601]
// キーが押されているか
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が返されると押されているということになるみたいですね。
* マウスの入力 [#y241ccbb]
// マウスが押されているか
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へ最後に押されたキーを保存する処理を追加します。
* マウスカーソルの座標 [#w512fc1e]
// マウスカーソルの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関数がマウスカーソルの位置を書き込むみたいですね。
* 動作確認 [#b093801d]
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();
}
}
&ref(https://blog.pitan76.net/wp-content/uploads/2022/07/Pasted-18.png,);
** コメント [#comment]
#pctrlcmt
&size(10){キーワード: 描画ライブラリ, アプリ開発, アプリケーション, 描画処理, グラフィック};