【问题标题】:JavaFX First Person Centering MouseJavaFX 第一人称居中鼠标
【发布时间】:2016-09-03 21:57:19
【问题描述】:

我正在尝试学习如何使用 javafx 进行 3D 编程。我的目标是将光标锁定在中心或将其移动到中心以进行第一人称视图。

我创建了一个鼠标移动事件并将光标移动到屏幕中间,然后根据我将鼠标移动到的位置更改相机。问题在于,每当将光标移回中心时,事件就会再次触发,从而反转摄像机角度的变化。任何人都知道一种方法,因此当它将光标移回中心时不会影响相机角度?

    scene.setOnMouseMoved(e -> {
        int screenWidth = (int) Screen.getPrimary().getBounds().getWidth();
        int screenHeight = (int) Screen.getPrimary().getBounds().getHeight();
        moveCursor(screenWidth / 2, screenHeight / 2);
        double dx = mouseX - e.getSceneX();
        double dy = mouseY - e.getSceneY();
        mouseX = e.getSceneX();
        mouseY = e.getSceneY();
        camAngleX += dx / 10;
        camAngleY -= dy / 10;
    });

这是添加布尔检查后... 我在其他地方定义了“ignoreMouseMove”。

    scene.setOnMouseMoved(e -> {
        if (ignoreMouseMove) {
            ignoreMouseMove = false;
        } else {
            double cx = primaryStage.getX() + scene.getX() + sceneX / 2;
            double cy = primaryStage.getY() + scene.getY() + sceneY / 2;
            double dx = mouseX - e.getSceneX();
            double dy = mouseY - e.getSceneY();
            mouseX = e.getSceneX();
            mouseY = e.getSceneY();
            camAngleX += dx / 10;
            camAngleY -= dy / 10;
            ignoreMouseMove = true;
            moveMouse(cx, cy);
        }
    }

【问题讨论】:

    标签: javafx


    【解决方案1】:

    您只需要一个布尔检查,例如:

    boolean ignoreMouseMove = false;
    
    scene.setOnMouseMoved(e -> {
        if(ignoreMouseMove) {
            ignoreMouseMove = false;
        } else {
            int screenWidth = (int) Screen.getPrimary().getBounds().getWidth();
            int screenHeight = (int) Screen.getPrimary().getBounds().getHeight();
            ignoreMouseMove = true;
            moveCursor(screenWidth / 2, screenHeight / 2);
            double dx = mouseX - e.getSceneX();
            double dy = mouseY - e.getSceneY();
            mouseX = e.getSceneX();
            mouseY = e.getSceneY();
            camAngleX += dx / 10;
            camAngleY -= dy / 10;
        }
    });
    

    如果它对你有帮助的话,我几周前自己做了一个有效的实现:

    Robot mouseMover = new Robot(); //defined somewhere else
    
    scene.setOnMouseMoved(event -> {
        if(ignoreMouseEvent) {
            ignoreMouseEvent = false;
            return;
        }
    
        mouseDeltaX += Math.round(event.getScreenX() - (stage.getX() + (stage.getWidth() / 2.0))) / 5.0;
        mouseDeltaY += -Math.round((event.getScreenY() - (stage.getY() + (stage.getHeight() / 2.0)))) / 5.0;
    
        ignoreMouseEvent = true;
        mouseMover.mouseMove((int) (stage.getX() + (stage.getWidth() / 2.0)), (int) (stage.getY() + (stage.getHeight() / 2.0)));
    });
    

    【讨论】:

    • 我像你说的那样添加了布尔检查,但它仍然不起作用
    • 所以你仍然得到mouseEvents的行为,递归调用自己无限的时间?
    • 我用自己实现的示例更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多