LWJGL 3获取光标位置

时间:2015-11-08 09:26:36

标签: java position cursor lwjgl glfw

如何获取光标的位置?我查看了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为null,我无法弄清楚为什么(是的,我在我的显示类中设置了回调)。

1 个答案:

答案 0 :(得分:7)

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)方法返回给定索引处的值。我们只想读取第一个值,因此我们指定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);