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);