LWJGL 3 获取光标位置
LWJGL 3 get cursor position
如何获取光标的位置?我查看了 GLFW 的文档,有一个方法 glfwGetCursorPos(window, &xpos, &ypos)
但是 Java 没有指针,所以当我在 Java 中尝试这个方法时,有 DoubleBuffers 作为参数。现在当我写这样的东西时:
public static double getCursorPosX(long windowID){
DoubleBuffer posX = null;
DoubleBuffer posY = null;
glfwGetCursorPos(windowID, posX, posY);
return posX != null ? posX.get() : 0;
}
posX 为空,我不明白为什么(是的,我正在我的显示器中设置回调 class)。
Java 不直接支持指针,因此 LWJGL 使用缓冲区作为解决方法。这些只是包装一个内存地址,可以通过对象上的方法读取和写入该内存地址。这允许您将缓冲区传递给将值写入其中的函数,这样您就可以读取这些值。
这里的关键点是你实际上必须事先创建一个缓冲区来存储值。
public static double getCursorPosX(long windowID) {
DoubleBuffer posX = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, posX, null);
return posX.get(0);
}
BufferUtils.createDoubleBuffer(length)
是创建缓冲区的实用函数。不同的基元有不同的缓冲区,如 int、long、char、float、double 等。在这种情况下,我们需要一个可以存储双精度数的缓冲区。我们传递给方法的数字 (1
) 是缓冲区应该能够存储的值的数量。我们可以使用更大的缓冲区来存储多个值,例如在数组中,但这里我们只想要一个值。
get(index)
方法 returns 给定索引处的值。我们只想读取第一个值,所以我们指定 0。您也可以使用 put(index, value)
将值存储在缓冲区中。
注意:如果您想同时获得 x 和 y 值,可能很想做类似以下的事情:
DoubleBuffer coords = BufferUtils.createDoubleBuffer(2);
glfwGetCursorPos(windowID, coords, coords);
double x = coords.get(0);
double y = coords.get(1);
但是,这不会按预期工作:它将 y 值写入索引 0 并在索引 1 处留下一个垃圾(读取:随机)值。如果你想获得两个坐标,你必须创建一个每个单独的缓冲区。
DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);
如何获取光标的位置?我查看了 GLFW 的文档,有一个方法 glfwGetCursorPos(window, &xpos, &ypos)
但是 Java 没有指针,所以当我在 Java 中尝试这个方法时,有 DoubleBuffers 作为参数。现在当我写这样的东西时:
public static double getCursorPosX(long windowID){
DoubleBuffer posX = null;
DoubleBuffer posY = null;
glfwGetCursorPos(windowID, posX, posY);
return posX != null ? posX.get() : 0;
}
posX 为空,我不明白为什么(是的,我正在我的显示器中设置回调 class)。
Java 不直接支持指针,因此 LWJGL 使用缓冲区作为解决方法。这些只是包装一个内存地址,可以通过对象上的方法读取和写入该内存地址。这允许您将缓冲区传递给将值写入其中的函数,这样您就可以读取这些值。
这里的关键点是你实际上必须事先创建一个缓冲区来存储值。
public static double getCursorPosX(long windowID) {
DoubleBuffer posX = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, posX, null);
return posX.get(0);
}
BufferUtils.createDoubleBuffer(length)
是创建缓冲区的实用函数。不同的基元有不同的缓冲区,如 int、long、char、float、double 等。在这种情况下,我们需要一个可以存储双精度数的缓冲区。我们传递给方法的数字 (1
) 是缓冲区应该能够存储的值的数量。我们可以使用更大的缓冲区来存储多个值,例如在数组中,但这里我们只想要一个值。
get(index)
方法 returns 给定索引处的值。我们只想读取第一个值,所以我们指定 0。您也可以使用 put(index, value)
将值存储在缓冲区中。
注意:如果您想同时获得 x 和 y 值,可能很想做类似以下的事情:
DoubleBuffer coords = BufferUtils.createDoubleBuffer(2);
glfwGetCursorPos(windowID, coords, coords);
double x = coords.get(0);
double y = coords.get(1);
但是,这不会按预期工作:它将 y 值写入索引 0 并在索引 1 处留下一个垃圾(读取:随机)值。如果你想获得两个坐标,你必须创建一个每个单独的缓冲区。
DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);