2015-11-08 6 views
5

Wie bekomme ich die Position eines Cursors? Ich habe in der Dokumentation von GLFW nachgesehen, und es gibt eine Methode glfwGetCursorPos(window, &xpos, &ypos), aber Java hat keine Zeiger. Wenn ich diese Methode in Java ausprobierte, gab es DoubleBuffer als Argumente. Nun, wenn ich schreibe etwas wie folgt aus:LWJGL 3 Cursorposition

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

posX null ist, und ich kann nicht herausfinden, warum (ja, ich bin Einstellung der Rückruf in meiner Anzeige Klasse nach oben).

Antwort

5

Java unterstützt Zeiger nicht direkt, daher verwendet LWJGL Puffer als Workaround. Diese umbrechen einfach eine Speicheradresse, die durch Methoden auf dem Objekt gelesen und geschrieben werden kann. Dadurch können Sie Puffer an Funktionen übergeben, die Werte in sie schreiben, so dass Sie diese Werte lesen können.

Der entscheidende Punkt hier ist, dass Sie tatsächlich vorher einen Puffer erstellen müssen, um den Wert zu speichern.

public static double getCursorPosX(long windowID) { 
    DoubleBuffer posX = BufferUtils.createDoubleBuffer(1); 
    glfwGetCursorPos(windowID, posX, null); 
    return posX.get(0); 
} 

BufferUtils.createDoubleBuffer(length) ist eine Dienstprogrammfunktion, die einen Puffer erstellt. Es gibt verschiedene Puffer für verschiedene Primitive, wie int, long, char, float, double usw. In diesem Fall benötigen wir einen Puffer, der doubles speichern kann. Die Nummer (1), die wir an die Methode übergeben, ist die Anzahl der Werte, die der Puffer speichern soll. Wir können einen Puffer mit einer größeren Größe verwenden, um mehrere Werte wie in einem Array zu speichern, aber hier wollen wir nur einen einzelnen Wert.

Die Methode get(index) gibt den Wert am angegebenen Index zurück. Wir wollen nur den ersten Wert lesen, also geben wir 0 an. Sie können auch put(index, value) verwenden, um Werte in einem Puffer zu speichern.

Hinweis: Es könnte verlockend sein, so etwas wie die folgenden tun, wenn Sie beide x und y-Werte erhalten möchten:

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

Dies wird jedoch nicht wie vorgesehen: Es wird die y schreiben Wert zu Index 0 und belassen Sie einen Wert für Müll (gelesen: zufällig) bei Index 1. Wenn Sie beide Koordinaten erhalten möchten, müssen Sie für jeden einen separaten Puffer erstellen.

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 Mann seit Jahren nach diesem gesucht: p so DoubleBuffer ist so etwas wie ein Array? wenn ich deinen Satz richtig verstanden habe? –

+1

Ja. Der Unterschied besteht darin, dass während Arrays von der Java Virtual Machine verwaltet werden, Puffer nur Speicherblöcke sind, wie Sie sie in C verwenden würden. Sie können auch nur Primitive (int, double, char usw.) in Puffern speichern, keine Objekte (mindestens nicht direkt). Ein Nachteil ist, dass sie Zeit brauchen, um sich daran zu gewöhnen, und wenn Sie sie falsch behandeln, werden Sie wahrscheinlich das Programm abstürzen. Das Lesen und Schreiben von Werten ist jedoch viel schneller als mit Arrays, also sind sie nützlich, wenn Sie wirklich jede Leistung benötigen, die Sie bekommen können. – javac