Java LWJGL 3获取光标位置

Java LWJGL 3获取光标位置,java,position,cursor,lwjgl,glfw,Java,Position,Cursor,Lwjgl,Glfw,如何获取光标的位置?我查看了GLFW的文档,发现有一个方法glfwGetCursorPos(window,&xpos,&ypos),但是Java没有指针,所以当我在Java中尝试此方法时,有双缓冲区作为参数。现在当我写这样的东西时: public static double getCursorPosX(long windowID){ DoubleBuffer posX = null; DoubleBuffer posY = null; glfwGetCursorPos(w

如何获取光标的位置?我查看了GLFW的文档,发现有一个方法
glfwGetCursorPos(window,&xpos,&ypos)
,但是Java没有指针,所以当我在Java中尝试此方法时,有双缓冲区作为参数。现在当我写这样的东西时:

public static double getCursorPosX(long windowID){
    DoubleBuffer posX = null;
    DoubleBuffer posY = null;
    glfwGetCursorPos(windowID, posX, posY);
    return posX != null ? posX.get() : 0;
}

posX为null,我不知道为什么(是的,我正在display类中设置回调)。

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等。在这种情况下,我们需要一个可以存储double的缓冲区。我们传递给方法的数字(
1
)是缓冲区应该能够存储的值的数量。我们可以使用更大的缓冲区来存储多个值,就像在一个数组中一样,但这里我们只需要一个值

get(index)
方法返回给定索引处的值。我们只想读取第一个值,因此指定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处留下一个垃圾(read:random)值。如果你想得到两个坐标,你必须为每个坐标创建一个单独的缓冲区

DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);

thx人搜索这个已经很久了:p所以DoubleBuffer有点像数组?如果我没听错你的句子?是的。区别在于,当数组由Java虚拟机管理时,缓冲区就像在C中使用的内存块一样。您也只能在缓冲区中存储原语(int、double、char等),而不能存储对象(至少不能直接存储)。一个缺点是它们需要时间来适应,如果处理不当,可能会使程序崩溃。但是,读取和写入值要比使用数组快得多,因此,如果您真的需要获得每一点性能,那么这些值非常有用。