Newer
Older
AlgebraicDataflowArchitectureModel / GameEngine / src / main / java / gameEngine / input / MouseInput.java
package gameEngine.input;

import static org.lwjgl.glfw.GLFW.GLFW_PRESS;
import static org.lwjgl.glfw.GLFW.GLFW_RELEASE;

public class MouseInput {
    private static MouseInput instance;
    private double scrollX,scrollY;
    private double xPos,yPos,lastX,lastY;
    private boolean mouseButtonPressed[] = new boolean[3];   // 現在押されているか
    private boolean mouseButtonDown[] = new boolean[3];      // 押された瞬間
    private boolean mouseButtonUp[] = new boolean[3];        // 離された瞬間
    private boolean isDragging;

    private MouseInput(){
        this.scrollX = 0.0;
        this.scrollY = 0.0;
        this.xPos = 0.0;
        this.yPos = 0.0;
        this.lastX = 0.0;
        this.lastY = 0.0;
    }

    public static MouseInput get(){
        if(MouseInput.instance == null){
            MouseInput.instance = new MouseInput();
        }
            return  MouseInput.instance;
        }

    public static void mousePosCallback(long windoow, double xpos, double ypos){
        get().lastX = get().xPos;
        get().lastY = get().yPos;
        get().xPos = xpos;
        get().yPos = ypos;
        get().isDragging = get().mouseButtonPressed[0] || get().mouseButtonPressed[1] || get().mouseButtonPressed[2];
    }

    public static void mouseButtonCallback(long window, int button, int action, int mods) {
        MouseInput listener = get();
        if (button < listener.mouseButtonPressed.length) {
            if (action == GLFW_PRESS) {
                if (!listener.mouseButtonPressed[button]) {
                    listener.mouseButtonDown[button] = true;  // 押された瞬間を記録
                }
                listener.mouseButtonPressed[button] = true;    // 押され続けている状態
            } else if (action == GLFW_RELEASE) {
                listener.mouseButtonPressed[button] = false;
                listener.mouseButtonUp[button] = true;        // 離された瞬間を記録
                listener.isDragging = false;
            }
        }
    }
    public static void mouseScrollCallBack(long window, double xOffset, double yOffset){
        get().scrollX = xOffset;
        get().scrollY = yOffset;
    }

    public static void endFrame(){
        get().scrollX = 0;
        get().scrollY = 0;
        get().lastX = get().xPos;
        get().lastY = get().yPos;
    }

    public static float getX(){
        return (float)get().xPos;
    }
    public static float getY(){
        return (float)get().yPos;
    }
    public static float getDx(){
        return (float)(get().lastX - get().xPos);
    }

    public static float getDy(){
        return (float)(get().lastY - get().yPos);
    }

    public static float getScrollX(){
        return (float)get().scrollX;
    }
    public static float getScrollY(){
        return (float)get().scrollY;
    }
    public static boolean isDragging(){
        return get().isDragging;
    }

    protected static boolean isMouseButtonDown(int button) {
        if (button < get().mouseButtonDown.length) {
            boolean result = get().mouseButtonDown[button];
            get().mouseButtonDown[button] = false;  // 一度だけ検知するためにリセット
            return result;
        }
        return false;
    }

    protected static boolean isMouseButtonPressed(int button) {
        if (button < get().mouseButtonPressed.length) {
            return get().mouseButtonPressed[button];
        }
        return false;
    }

    protected static boolean isMouseButtonUp(int button) {
        if (button < get().mouseButtonUp.length) {
            boolean result = get().mouseButtonUp[button];
            get().mouseButtonUp[button] = false;  // 一度だけ検知するためにリセット
            return result;
        }
        return false;
    }
}