LWJGL 3 获取鼠标位置

6

如何获取光标的位置?我查看了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为空,我无法确定原因(是的,我在我的显示类中设置了回调)。

1个回答

9

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处留下垃圾(即随机)值。如果您想获得两个坐标,则必须为每个坐标创建单独的缓冲区。
DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);

谢谢,我已经找了好久了:p 所以DoubleBuffer是类似于数组的东西?如果我理解你的话是这样的吗? - Samuel Kodytek
1
是的。不同之处在于,虽然数组由Java虚拟机管理,但缓冲区只是像在C中使用它们一样的内存块。您还可以仅在缓冲区中存储基元(int,double,char等),而不能存储对象(至少不能直接存储)。一个缺点是它们需要时间来适应,如果处理不当,可能会导致程序崩溃。但是,读取和写入值比使用数组快得多,因此如果您确实需要获得每一位性能,则它们非常有用。 - javac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接