我正在学习关于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()
,每次循环迭代都会调用它
每当用户生成一些滚动操作(向上或向下,甚至向左或向右)时,就会调用GLFWScrollCallback。因此,您将XScroll
/YScroll
设置为-1
或1
,并将其保持不变,直到下一个滚动事件发生。您需要实现某种方法将其重置为零。你可能会做一些类似的事情
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中获取鼠标滚轮事件(而不是谈论事件)? 问题答案: