2015-11-08 9 views
5

मुझे कर्सर की स्थिति कैसे प्राप्त हो सकती है? मैंने जीएलएफडब्ल्यू के प्रलेखन में देखा, और एक विधि glfwGetCursorPos(window, &xpos, &ypos) है लेकिन जावा में पॉइंटर्स नहीं हैं इसलिए जब मैंने जावा में इस विधि को आजमाया तो तर्क के रूप में डबलबफर थे। अब जब मैं कुछ इस तरह लिखना: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

जावा सीधे पॉइंटर्स का समर्थन नहीं करता है, इसलिए एलडब्ल्यूजेजीएल बफर को वर्कअराउंड के रूप में उपयोग करता है। ये सिर्फ एक स्मृति पता लपेटते हैं जिसे ऑब्जेक्ट पर विधियों के माध्यम से पढ़ा और लिखा जा सकता है। यह आपको उन कार्यों में बफर पास करने की अनुमति देता है जो उनमें मूल्य लिखते हैं, ताकि आप इन मानों को पढ़ सकें।

यहां मुख्य बिंदु यह है कि आपको वास्तव में मूल्य संग्रह करने के लिए पहले एक बफर बनाना होगा।

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) का भी उपयोग कर सकते हैं।

नोट:

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

हालांकि, इस उद्देश्य के अनुसार कार्य नहीं करेगा:: यह तुम दोनों x और y मूल्यों को प्राप्त करना चाहते हैं तो निम्नलिखित की तरह कुछ करने के लिए आकर्षक हो सकता है यह 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 आदमी उम्र के लिए यह खोज रहा है: पी तो डबलबफर एक ऐरे की तरह कुछ है? अगर मैं आपकी सजा सही ढंग से समझ गया? –

+1

हां। अंतर यह है कि जबकि जावा वर्चुअल मशीन द्वारा सरणी प्रबंधित की जाती है, बफर केवल स्मृति ब्लॉक होते हैं जैसे आप उन्हें सी में उपयोग करेंगे। आप केवल प्राइमेटिव (int, double, char, आदि) को बफर में स्टोर कर सकते हैं, कोई ऑब्जेक्ट नहीं (कम से कम प्रत्यक्ष नहीं)। एक दोष यह है कि उन्हें उपयोग करने के लिए समय लगता है और यदि आप उन्हें गलत तरीके से संभालते हैं तो आप शायद प्रोग्राम को क्रैश करेंगे। हालांकि, मूल्यों को पढ़ने और लिखना सरणी के मुकाबले बहुत तेज़ है, इसलिए यदि आप वास्तव में प्रदर्शन के हर बिट की ज़रूरत होती है तो वे उपयोगी होते हैं। – javac

संबंधित मुद्दे