Libgdx में स्क्रीन रिज़ॉल्यूशन में फ़ॉन्ट आकार से मेल खाने की समस्या


10

मुझे अलग-अलग स्क्रीन पर एक ही आकार में अपने खेल पर पाठ दिखाने में समस्या हो रही है, और मैंने एक सरल परीक्षण किया।

इस परीक्षण में स्क्रीन पर एक पाठ फिटिंग दिखाना शामिल है, मैं चाहता हूं कि पाठ का स्क्रीन से और DPI से एक ही आकार स्वतंत्र हो।

मुझे यह और यह उत्तर मिला है कि मुझे लगता है कि मुझे अपनी समस्या का समाधान करना चाहिए लेकिन नहीं। डेस्कटॉप में आकार ठीक है, लेकिन मेरे फोन में बहुत बड़ा है।

यह मेरे Nexus 4 पर परिणाम है: (768x1280, 2.0 घनत्व)

नेक्सस 4 गणना घनत्व

और यह मेरी मैकबुक पर परिणाम है: (480x800, 0.6875 घनत्व)

यहाँ छवि विवरण दर्ज करें

मैं ओपन सैंस कंडेंस्ड (गूगल फोंट के लिए लिंक का उपयोग कर रहा हूं )

जैसा कि आप देख सकते हैं डेस्कटॉप अच्छा लग रहा है, लेकिन फोन पर इतना बड़ा है।

यहाँ मेरे परीक्षण का कोड:

public class TextTest extends ApplicationAdapter
{
    private static final String TAG = TextTest.class.getName();
    private static final String TEXT = "Tap the screen to start";

    private OrthographicCamera camera;
    private Viewport viewport;

    private SpriteBatch batch;
    private BitmapFont font;

    @Override
    public void create ()
    {
        Gdx.app.log(TAG, "Screen size: "+Gdx.graphics.getWidth()+"x"+Gdx.graphics.getHeight());
        Gdx.app.log(TAG, "Density: "+Gdx.graphics.getDensity());

        camera = new OrthographicCamera();
        viewport = new ExtendViewport(Gdx.graphics.getWidth(), Gdx.graphics.getWidth(), camera);
        batch = new SpriteBatch();

        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/OpenSans-CondLight.ttf"));
        font = createFont(generator, 64);
        generator.dispose();
    }

    private BitmapFont createFont(FreeTypeFontGenerator generator, float dp)
    {
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();

        int fontSize = (int)(dp * Gdx.graphics.getDensity());
        parameter.size = fontSize;

        Gdx.app.log(TAG, "Font size: "+fontSize+"px");

        return generator.generateFont(parameter);
    }

    @Override
    public void render ()
    {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        int w = -(int)(font.getBounds(TEXT).width / 2);

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        font.setColor(Color.BLACK);
        font.draw(batch, TEXT, w, 0);
        batch.end();
    }

    @Override
    public void resize(int width, int height)
    {
        viewport.update(width, height);
    }

    @Override
    public void dispose()
    {
        font.dispose();
        batch.dispose();
    }
}

मैं इसे ठीक करने का एक साफ तरीका खोजने की कोशिश कर रहा हूं। मैं क्या गलत कर रहा हूँ? कैमरा है व्यूपोर्ट?

अपडेट करें:

मैं जो चाहता हूं, उसी मार्जिन को अनुपात में रखना है, स्वतंत्र रूप से स्क्रीन आकार या रिज़ॉल्यूशन के लिए। यह छवि बताती है कि मेरा क्या मतलब है।

यहाँ छवि विवरण दर्ज करें


क्या आप चाहते हैं कि भौतिक आकार समान रहे (कंप्यूटर पर 2cm पाठ == मोबाइल पर 2cm tekt) या पाठ में प्रदर्शन फिट है?
ईजीन

मैं पूरी तरह से निश्चित नहीं हूं कि आप यहां क्या पूछ रहे हैं। आपके द्वारा पोस्ट की गई लिंक इस प्रश्न का उत्तर देती प्रतीत होती है। आपको डिस्प्ले साइज़ और DPI के बारे में पता होना चाहिए। कृपया अपने प्रश्न को विस्तृत करें, इसलिए इसका सही उत्तर दिया जा सकता है।
काटू

मैं इसे आजमाऊंगा। मैं जो चाहता हूं वह पाठ के उसी अनुपात को विभिन्न स्क्रीन आकारों या प्रस्तावों के बीच रखना है। मेरा मतलब है कि सिनेमा स्क्रीन में स्पष्ट रूप से सेमी में बड़ा आकार होगा, लेकिन अनुपात में समान मार्जिन होगा। तो, @Eejin ने कहा कि वास्तव में नहीं है। मैंने एक छवि के साथ पोस्ट को अपडेट किया जो दिखाता है कि मेरा क्या मतलब है।
इनाकी बेदोया

जवाबों:


15

आप एक ही ग्रंथ / स्क्रीन अनुपात को रखना चाहते हैं। मूल रूप से आप जो करते हैं वह एक रिज़ॉल्यूशन पर विकसित होता है और इसे 1.0 स्केल होने दें। फिर आप नई स्क्रीन की चौड़ाई को पुरानी चौड़ाई से विभाजित करते हैं और यह आपका पैमाना कारक है।

उदाहरण के लिए। 2560x1440 पर फ़ॉन्ट आकार 16 के साथ विकसित करना और 1920x1080 पर चलना।

फ़ॉन्ट का आकार होगा: 1920 * 16/2560 = 12

मैं अपने इंटरफ़ेस लाइब्रेरी में भी ऐसा ही करता हूं और यह पूरी तरह से काम करता है।


धन्यवाद @Eejin, मैं क्या जरूरत है और यह पूरी तरह से काम करता है। फिर मैंने जो उत्तर जोड़े हैं, वही वास्तविक आकार दिखाने के लिए हैं?
इनाकी बेदोया

यह डिवाइस के साथ स्केलिंग के बारे में भी है। लेकिन यहाँ उपलब्ध रिज़ॉल्यूशन के लिए फ़ॉन्ट बड़ा हो जाता है और वहाँ फ़ॉन्ट डीपीआई पर निर्भर होता है। 28 "2560x1440 मॉनिटर में 5" 1920x1080 फोन की तुलना में एक अलग डीपीआई है। जिस विधि को आप चाहते हैं वह हमेशा एक निश्चित भाग को भरेगी और DPI जागरूक विधि फ़ॉन्ट आकार को बदल देगी ताकि वे पठनीय हों और ध्यान रखें कि अधिक कार्यशील स्थान हो सकता है।
ईजीन

धन्यवाद! इसने काम कर दिया!!
परमपाल

2
@kevinksmith ऐसा इसलिए होगा क्योंकि आप पूर्णांक विभाजन कर रहे हैं, इसलिए नहीं कि 'Android के कुछ संस्करण' सही ढंग से गणना नहीं कर रहे हैं।
MichaelHouse

1
@ अशरफसाईद-अहमद डीपीआई से कोई फर्क नहीं पड़ता कि आपको पाठ की स्क्रीन चौड़ाई पिक्सेल का एक निश्चित प्रतिशत होना चाहिए।
ईजिन

2

डॉन, टी किसी भी चीज़ को बस फ़ॉन्ट के पैमाने पर सेट करें और यह सभी प्रकार के डिवाइस के लिए काम करेगा

 font.setScale( .9f,.9f);

क्या आप इस समाधान को डालने के लिए सर्वश्रेष्ठ स्थान पर संदर्भ देने के लिए अपने उत्तर में इसे अपने कोड में जोड़ सकते हैं, यह भविष्य के उपयोगकर्ताओं को आपके उत्तर को जल्दी से समझने में मदद करता है।
टॉम 'ब्लू' पिद्दॉक

बस इस पंक्ति का उपयोग करें जहां आप अपने बिटमैप फ़ॉन्ट बनाते हैं जैसे कि उनके कोड में उन्होंने फ़ॉन्ट = createFont (जनरेटर, 64) लिखकर अपना बिटमैप फ़ॉन्ट बनाया; तो बस लाइन को लिखें font.setScale (.9f, .9f); इसके नीचे
सुधीर सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.