Newer
Older
AlgebraicDataflowArchitectureModel / GameEngine / src / main / java / gameEngine / input / KeyInput.java
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;
    }
}