2015-11-08 103 views
5

如何獲取光標的位置?我查閱了GLFW的文檔,並且有一種方法glfwGetCursorPos(window, &xpos, &ypos),但是Java沒有指針,所以當我在Java中嘗試這種方法時,有DoubleBuffers作爲參數。現在,當我寫的東西是這樣的:LWJGL 3獲取光標位置

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

POSX爲空,我想不通爲什麼(是的,我在我的顯示類設置回調)。

回答

5

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

thx人一直在尋找這個年齡:p所以DoubleBuffer就像一個數組?如果我正確理解你的句子? –

+1

是的。不同之處在於,雖然數組由Java虛擬機管理,但緩衝區只是內存塊,就像您在C中使用它們一樣。您也只能將原始數據(int,double,char等)存儲在緩衝區中,而不是對象(至少不直接)。一個缺點是他們需要時間去習慣,如果你不正確地處理它們,你可能會使程序崩潰。但是,讀取和寫入數值比使用數組要快得多,所以如果您真的需要獲得每一點性能,它們都會很有用。 – javac