当前位置: 首页 > 知识库问答 >
问题:

GLFW 3:如何使用ScrollCallback(LWJGL 3)获得鼠标滚轮的增量

充昌勋
2023-03-14

我正在学习关于LWJGL和OpenGL的3D游戏开发教程。在本系列中,讲师使用LWJGL2,而我使用LWJGL3和GLFW。在某个章节中,他使用的是LWJGL的输入实现,仅在LWJGL 2中可用,因此我不得不使用GLFW的回调系统。我能够为按键输入、光标移动和鼠标按钮输入添加输入功能,但当我尝试添加滚动回调时,似乎滚动方向的偏移量只返回-1和1,添加时,(第三人称)相机会无限地前后平移,其目的是为了让相机的每一个滚动动作向前或向后移动一段距离。实际上,我希望得到每个滚动运动的增量值。之前,我一直在胡闹,试图看看是否可以设置延迟时间量的偏移值,然后将它们设置回0,但没有效果。我试着寻找答案,但我发现与我的问题无关。我可能很傻,但这是密码。

MouseScroll回调类:

import org.lwjgl.glfw.GLFWScrollCallback;

    public class MouseScroll extends GLFWScrollCallback {

        private static float XScroll;
        private static float YScroll;
        private static float DXScroll;
        private static float DYScroll;

        @Override
        public void invoke(long window, double xoffset, double yoffset) {
            XScroll = (float) xoffset;
            YScroll = (float) yoffset;
            // Don't know how to achieve this here
        }

        /* Returns raw offset values */
        public float getXScroll() {
            return XScroll;
        }

        public float getYScroll() {
            return YScroll;
        }

        /* Returns the rate of each scrolling movement */
        public float getDXScroll() {
            return DXScroll;
        }

        public float getDYScroll() {
            return DYScroll;
        }

    }

在Input类中获取YScroll的方法:

public static float getMouseYScroll() {
    return mouseScroll.getYScroll(); // mouseScroll is reference to MouseScroll callback
}

方法在摄影机中使用回调。爪哇:

private void calculateZoom() {
        float zoomLevel =  Input.getMouseYScroll() * 0.1f;
        distanceFromPlayer -= zoomLevel;
    }

摄像机中的更新方法。爪哇:

public void move() {
        calculateZoom();
        calculatePitch();
        calculateAngleAroundPlayer();
        float horizontalDistance = calculateHorizontalDistance();
        float verticalDistance = calculateVerticalDistance();
        calculateCameraPosition(horizontalDistance, verticalDistance);
        this.yaw = 180 - (player.getRotY() + angleAroundPlayer);
    } 

最后是摄像机。move(),每次循环迭代都会调用它

共有1个答案

濮阳原
2023-03-14

每当用户生成一些滚动操作(向上或向下,甚至向左或向右)时,就会调用GLFWScrollCallback。因此,您将XScroll/YScroll设置为-11,并将其保持不变,直到下一个滚动事件发生。您需要实现某种方法将其重置为零。你可能会做一些类似的事情

    public float getYScroll() {
        float value = YScroll;
        YScroll = 0.0f;
        return value;
    }

但是,只有在每帧仅调用一次getYScroll时,这才有效。目前还不清楚您希望如何处理此类事件(即,您是否希望将它们存储到消费之前-可能不是每一帧),但最有可能的是,您只需在每一帧末尾调用的MouseScroll中添加一些重设方法即可,因为您每一帧都查询滚轮,因此不会丢失任何事件。

 类似资料:
  • 问题内容: 在鼠标滚轮上滚动它执行水平滚动。 已编辑 好吧,firebug说他在用 问题答案: 看来他只是将mousewheel事件映射到滚动区域。在IE中,仅通过使用方法就非常容易-滚动水平条的量为垂直条通常滚动的量。其他浏览器不支持该方法,因此您必须随心所欲地滚动任意数量:

  • 问题内容: 我看到了启用或禁用鼠标滚轮滚动的方法。但是,有什么方法可以调整滚动速度?我认为这太慢了。不管我使窗口多大,每次单击滚动大约三个像素。我希望它远不止于此。 有任何想法吗? 问题答案: 您可以尝试以下方法:

  • 我有一个JScrollPane,它的内容窗格是一个JXList。当我在列表上使用鼠标滚轮时,列表一次执行三(3)项。这也适用于表,无论行高如何。我如何改变这一点,使-无论平台-列表和表的滚动距离正好是1项?设置块增量不会削减它,因为表中的某些行具有不同的高度。

  • 问题内容: 我有一个JScrollPane,其内容窗格是JXList。当我在列表上使用鼠标滚轮时,该列表一次执行三(3)个项目。无论行高如何,这也适用于表格。我如何更改此设置,以便无论平台如何,列表和表格的滚动距离都仅为1?设置块增量不会削减它,因为表中的某些行具有不同的高度。 问题答案: 出于纯粹的兴趣(有点无聊),我创建了一个工作示例: 真正的魔力是在custom中完成的,我们每次都将当前的“

  • 我的问题是: 我的解决方案是使用mousewheel/scroll事件处理程序来知道用户是否在移动,然后计算我是否在页面底部并隐藏或显示元素。。。 一切正常,但我有点担心 由于主线程正忙,“mousewheel”输入事件的处理延迟了123毫秒。将事件处理程序标记为“被动”以使页面更加响应。 这(我猜)是因为这个代码 跑太多次了。 那么,我怎样才能使这段代码更有效率呢 是否有办法在滚动后运行事件?

  • 问题内容: 有没有一种方法可以在jQuery中获取鼠标滚轮事件(而不是谈论事件)? 问题答案: