package gameEngine.input;
import java.util.ArrayList;
import java.util.List;
import static org.lwjgl.glfw.GLFW.*;
public class KeyInput {
private static KeyInput instance;
private boolean keyPressed[] = new boolean[GLFW_KEY_LAST + 1]; // 押されている状態を保持
private boolean keyDown[] = new boolean[GLFW_KEY_LAST + 1]; // 押された瞬間を検知
private boolean keyUp[] = new boolean[GLFW_KEY_LAST + 1]; // 離された瞬間を検知
private KeyInput() {
}
public static KeyInput get() {
if (KeyInput.instance == null) {
KeyInput.instance = new KeyInput();
}
return KeyInput.instance;
}
public static void keyCallback(long window, int key, int scancode, int action, int mods) {
if (key <= GLFW_KEY_LAST && key >= 0) {
KeyInput input = get();
if (action == GLFW_PRESS) {
if (!input.keyPressed[key]) {
input.keyDown[key] = true; // 押された瞬間
}
input.keyPressed[key] = true;
} else if (action == GLFW_RELEASE) {
input.keyPressed[key] = false;
input.keyUp[key] = true; // 離された瞬間
}
}
}
// フレームの終わりでリセットするメソッド
public static void endFrame() {
for (int i = 0; i < get().keyDown.length; i++) {
get().keyDown[i] = false;
get().keyUp[i] = false;
}
}
protected static boolean isKeyDown(int keyCode) {
if (keyCode <= GLFW_KEY_LAST && keyCode >= 0) {
boolean result = get().keyDown[keyCode];
get().keyDown[keyCode] = false; // 一度だけ検知するため、クリア
return result;
}
return false;
}
protected static boolean isKeyPressed(int keyCode) {
if (keyCode <= GLFW_KEY_LAST && keyCode >= 0) {
return get().keyPressed[keyCode];
}
return false;
}
protected static boolean isKeyUp(int keyCode) {
if (keyCode <= GLFW_KEY_LAST && keyCode >= 0) {
boolean result = get().keyUp[keyCode];
get().keyUp[keyCode] = false; // 一度だけ検知するため、クリア
return result;
}
return false;
}
public static List<Integer> getPressedKeys() {
List<Integer> pressedKeys = new ArrayList<>();
for (int i = 0; i < get().keyPressed.length; i++) {
if (get().keyPressed[i]) {
pressedKeys.add(i); // 押されているキーコードを追加
}
}
return pressedKeys;
}
}