LibGDX में रिज़ॉल्यूशन इंडिपेंडेंस


22

मैं अपना libGDX गेम रिज़ॉल्यूशन / घनत्व कैसे स्वतंत्र कर सकता हूं? क्या अंतर्निहित घनत्व की परवाह किए बिना "पूर्ण" के रूप में छवि के आकार को निर्दिष्ट करने का एक तरीका है?

मैं एक बहुत ही सरल बच्चों का खेल बना रहा हूं; स्क्रीन पर प्रदर्शित स्प्राइट्स का एक गुच्छा और मेनू के लिए कुछ पाठ (विकल्प मेनू मुख्य रूप से)। जो मैं जानना चाहता हूं वह यह है: मैं अपने स्प्राइट्स / फोंट संकल्प को कैसे स्वतंत्र करूं? (मैंने चीजों को आसान बनाने के लिए उन्हें अपनी कक्षाओं में लपेटा है।)

चूंकि यह एक साधारण बच्चों का खेल है, इसलिए मुझे खेल के "खेलने योग्य क्षेत्र" के बारे में चिंता करने की आवश्यकता नहीं है; मैं स्क्रीन स्पेस का ज्यादा से ज्यादा इस्तेमाल करना चाहता हूं।

मैं अभी क्या कर रहा हूं, जो सुपर गलत लगता है, बस बड़े आकार के प्रस्तावों के लिए उपयुक्त छवियां बनाना है, और फिर स्क्रीन आकार को फिट करने के लिए नीचे पैमाने (या शायद ही कभी, ऊपर) है। यह मेरे डेस्कटॉप पर रेखीय मानचित्रण के साथ भी (डेस्कटॉप संस्करण में) ठीक काम करने लगता है, लेकिन छोटे संकल्प बदसूरत लगते हैं।

इसके अलावा, यह एंड्रॉइड के "डिवाइस इंडिपेंडेंट पिक्सल" (डीपी) के सामने उड़ान भरने के लिए लगता है। या हो सकता है कि मुझे कुछ याद आ रहा है और libGDX पहले से ही किसी भी तरह इस का ख्याल रखता है?

इससे निपटने का सबसे अच्छा तरीका क्या है? मुझे यह लिंक मिला; इस समस्या के हल के लिए ?: एक अच्छा तरीका है http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

इसमें उल्लेख किया गया है कि छवियों को कैसे नियंत्रित किया जाए, लेकिन यह उल्लेख नहीं करता है कि घनत्व की परवाह किए बिना फ़ॉन्ट / छवि आकार कैसे निर्दिष्ट करें।


संभवतः संबंधित हैं? gamedev.stackexchange.com/questions/34/…
thedaian

@thedaian काफी नहीं। यह संकल्प के बारे में है; मैं घनत्व और संकल्प के बीच के अंतर के बारे में अधिक चिंतित हूं।
as999999

जवाबों:


12

चूँकि आप डिवाइस घनत्व को पढ़ सकते हैं और libgdx में रनटाइम के दौरान फोंट प्रस्तुत कर सकते हैं , इसलिए मैं इस समाधान का उपयोग घनत्व स्वतंत्र फ़ॉन्ट आकार प्राप्त करने के लिए करता हूँ:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

मेरी चर्चा छवियों के साथ-साथ फोंट के बारे में है। डायनामिक फ़ॉन्ट रेंडरिंग के लिए +1 (हालांकि मैं यह पहले से ही करता हूं)।
as999999

10

Libgdx में इसे प्राप्त करने के लिए, आप "orthographicCamera" का उपयोग कर सकते हैं, आप उस आकार को असाइन करते हैं जिसे आप उपयोग करने के लिए उपयोग करते हैं, और प्रत्येक रिज़ॉल्यूशन में आप अपनी सभी छवियों को उस आकार में छोटा कर सकते हैं (मैं 800X480 का उपयोग करता हूँ क्योंकि इसकी Android में बड़ी स्क्रीन है ) और यह अच्छा काम करता है :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

कृपया मुझे एक कोड नमूना मिल सकता है?
ashes999

कोड का उपयोग करता है, और आप एक वर्ग बनाते हैं जो स्क्रीन इंटरफ़ेस को लागू करता है, जिस कंस्ट्रक्टर में आप अपना मंच बनाते हैं, और रेंडर विधि में, आप मंच को हटाते हैं ()। यदि आप Stages का उपयोग नहीं करना चाहते हैं, तो आप प्रकार कैमरा के स्क्रीन कार्यान्वित वर्ग में एक चर घोषित कर सकते हैं, और स्टेज में भी ऐसा ही कर सकते हैं, लेकिन रेंडर विधि में आप कैमरे पर अपडेट लागू करते हैं।
रूडी_TM

यह वास्तव में बहुत अच्छी तरह से काम करता है।
you786

4

मेरा मानना ​​है कि एंड्रॉइड का "डिवाइस स्वतंत्र पिक्सेल" केवल वर्गीकृत उपकरणों के लिए एक मापने की छड़ी है, और वास्तव में रेंडर करने योग्य पिक्सल के रूप में उपलब्ध नहीं हैं। तो आप किसी भी जादुई डीपीआई-सुलझाने के बुनियादी ढांचे को याद नहीं कर रहे हैं। जहां तक ​​मैं यहां की कला की स्थिति को समझता हूं, आपने सभी विकल्पों की खोज की है। विभिन्न उपकरणों से निपटने के लिए दो बुनियादी दृष्टिकोण हैं:

  1. वास्तविक डिवाइस DPI से मिलान करने के लिए पहले से मौजूद छवियों को स्केल करें।
  2. DPI के आधार पर रन-टाइम पर विभिन्न प्रकार की प्री-स्केल की गई छवियों में से चुनें।

बेशक, आप दोनों में से कुछ का मिश्रण कर सकते हैं (लगभग एक सटीक छवि चुनकर और फिर उसे स्केलिंग करके), या अपने यूआई के विभिन्न तत्वों के लिए अलग-अलग तरीकों का उपयोग कर सकते हैं (जैसे, फोंट / पाठ के लिए पूर्व-मौजूदा छवियां, और गेमप्ले के लिए गतिशील स्केलिंग) स्प्राइट)।

आपका विशिष्ट खेल जो करने की कोशिश कर रहा है वह वास्तव में एक अंतर बना सकता है जिसमें दृष्टिकोण अधिक समझ में आता है। उदाहरण के लिए, यदि आपको ऑन-स्क्रीन मेनू मिला है, तो आप यह सुनिश्चित करना चाहेंगे कि बटन फिंगर-टिप साइज के कुछ उचित हों (ताकि बटन को हिट करना हमेशा आसान हो, लेकिन आवश्यकता से अधिक बड़ा न हो गोलियाँ जैसे बड़े उपकरण)। वैकल्पिक रूप से, यदि आप एक पहेली गेम बनाने की कोशिश कर रहे हैं जहाँ आप यह सुनिश्चित करना चाहते हैं कि पूरी पहेली एक ही बार में दिखाई दे, तो आपको स्क्रीन पर फिट होने के लिए तत्वों को स्केल करने की आवश्यकता होगी (उदाहरण के लिए, टिक-टैक-टो के साथ खेल शायद आप प्रत्येक तत्व को स्क्रीन के लगभग 1/3 उपयोग करना चाहते हैं)।

मुझे लगता है कि फोंट जैसी चीजों के लिए बहुत बढ़िया विवरण है जिन्हें आप पाठ के साथ पहले से रेंडर छवियों की एक किस्म के लिए चाहते हैं, और फिर सबसे अच्छा मिलान चुनें। इसलिए बटन एक उपकरण से दूसरे उपकरण में अपने सापेक्ष आकार / आकार को बदल सकते हैं, लेकिन आम तौर पर हमेशा अच्छे दिखेंगे।

समस्याओं की कुछ चर्चा और कुछ समाधानों के लिए मारियो ज़र्नेर की शुरुआत एंड्रॉइड गेम्स देखें । ध्यान दें कि मारियो libGDX का लेखक है, इसलिए पुस्तक का दृष्टिकोण libGDX एक को दर्शाता है (ध्यान दें कि वे एक-से-एक नहीं हैं, पुस्तक libGDX के समान एक पुस्तकालय लिखना शामिल है, लेकिन स्वयं libGDX नहीं है)।


यहां तक ​​कि अगर मैं डीपीआई पर आधारित पूर्व-निर्मित छवि संग्रह से चयन करता हूं, तो मैं यह नहीं देखता कि मैं कैसे गारंटी दे सकता हूं कि "यह 64x64 के रूप में प्रदर्शित होना चाहिए।"
राख999

1
मैं मान रहा था कि आप भौतिक प्रदर्शन से मेल खाने के लिए अपना OpenGL कैमरा सेट कर रहे हैं, इसलिए 1 OpenGL पिक्सेल नक्शे से 1 प्रदर्शन पिक्सेल। उस बिंदु पर एक 64x64 छवि स्क्रीन पर 64x64 के रूप में दिखाई देगी। जैसा कि Rudy_TM बताता है, आप कैमरा मैपिंग के साथ पूरी स्क्रीन स्केलिंग प्राप्त करने के लिए गड़बड़ कर सकते हैं।
पीटी

ठीक है, यह "सीक्रेट सॉस" जैसा दिखता है जो मैं था। मैं जाँच करूँगा और आपको बताऊँगा, धन्यवाद।
ashes999

0

ऐसा करने का एक तरीका न्यूनतम पहलू अनुपात और आपके खेल के लिए अधिकतम पहलू अनुपात को परिभाषित करना है। ये वो अनुपात होंगे जिनका आप समर्थन करना चाहते हैं। फिर आपको एक व्यूपोर्ट का उपयोग करने की आवश्यकता है जो अब libGdx में प्रदान किया गया है। आपके द्वारा प्रदान की गई सेटिंग के अनुसार व्यूपोर्ट आपकी दुनिया को माप देगा।

कई प्रकार के व्यूपोर्ट हैं और आपको अपने खेल के लिए सबसे उपयुक्त है।

आप उदाहरण के लिए एक्स्टेंड व्यूपोर्ट का उपयोग कर सकते हैं और अपनी ऊंचाई या चौड़ाई को ठीक कर सकते हैं और दूसरे की गणना कर सकते हैं। फिर आपको यह सुनिश्चित करने की आवश्यकता है कि सभी ग्राफिक्स आपके न्यूनतम पहलू अनुपात में देखे जा सकते हैं। विस्तारित व्यूपोर्ट ग्राफिक्स को विकृत किए बिना आपके ग्राफिक्स को सही पहलू अनुपात में ले जाएगा। हालाँकि, एक्स्टेंड व्यूपोर्ट आपकी दुनिया में अतिरिक्त स्थान जोड़कर काम करता है, इसलिए आपको उदाहरण के लिए पृष्ठभूमि के लिए ग्राफिक्स भी प्रदान करना चाहिए, जो आपके कवर किए गए पहलू अनुपात के पूरे विस्तार को कवर करता है, जब दुनिया आपके अधिकतम पहलू अनुपात से छोटा होता है, तो ग्राफिक्स का अतिरिक्त हिस्सा नहीं होगा दिखाया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.