SORU
8 ŞUBAT 2012, ÇARŞAMBA


Nasıl libGDX farklı boy oranları ile başa çıkmak için?

Açıkçası Screen Sınıf libGDX çerçevesi tarafından sağlanan kullanacağı bazı ekranlar libGDX kullanarak hayata geçirdik. Ancak, bu ekranlar için uygulama sadece ön tanımlı ekran boyutu ile çalışır. Örneğin, sprite için anlamlı bir 640 x 480 ekran boyutu (4:3 görüntü oranı), işe yaramaz olarak hedeflenen diğer ekran boyutları yüzünden Sprite git par ekranın sınırları ve ölçekli ekran boyutu. Eğer basit Ölçekleme libGDX tarafından sağlanmaktadır ayrıca, eğer karşı karşıyayım sorun yine de bu oyunu, ekranın en boy oranını değiştirmek için neden olabilir, çünkü orada olurdu.

İnternette araştırma yaparken aynı sorunu tartıştığı blog/forum rastladım. Bunu hayata geçirdik ve şu ana kadar gayet iyi çalışıyor. Ama daha iyi alternatifler var olup olmadığını bu bunu başarmak için en iyi seçenek olup olmadığını teyit etmek istiyorum. Aşağıda bu meşru sorunuyla uğraşıyorum nasıl göstermek için kodu.

FORUM LİNKİ: http://www.java-gaming.org/index.php?topic=25685.new

public class SplashScreen implements Screen {

    // Aspect Ratio maintenance
    private static final int VIRTUAL_WIDTH = 640;
    private static final int VIRTUAL_HEIGHT = 480;
    private static final float ASPECT_RATIO = (float) VIRTUAL_WIDTH / (float) VIRTUAL_HEIGHT;

    private Camera camera;
    private Rectangle viewport;
    // ------end------

    MainGame TempMainGame;

    public Texture splashScreen;
    public TextureRegion splashScreenRegion;
    public SpriteBatch splashScreenSprite;

    public SplashScreen(MainGame maingame) {
        TempMainGame = maingame;
    }

    @Override
    public void dispose() {
        splashScreenSprite.dispose();
        splashScreen.dispose();
    }

    @Override
    public void render(float arg0) {
        //----Aspect Ratio maintenance

        // update camera
        camera.update();
        camera.apply(Gdx.gl10);

        // set viewport
        Gdx.gl.glViewport((int) viewport.x, (int) viewport.y,
        (int) viewport.width, (int) viewport.height);

        // clear previous frame
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        // DRAW EVERYTHING
        //--maintenance end--

        splashScreenSprite.begin();
        splashScreenSprite.disableBlending();
        splashScreenSprite.draw(splashScreenRegion, 0, 0);
        splashScreenSprite.end();
    }

    @Override
    public void resize(int width, int height) {
        //--Aspect Ratio Maintenance--
        // calculate new viewport
        float aspectRatio = (float)width/(float)height;
        float scale = 1f;
        Vector2 crop = new Vector2(0f, 0f);

        if(aspectRatio > ASPECT_RATIO) {
            scale = (float) height / (float) VIRTUAL_HEIGHT;
            crop.x = (width - VIRTUAL_WIDTH * scale) / 2f;
        } else if(aspectRatio < ASPECT_RATIO) {
            scale = (float) width / (float) VIRTUAL_WIDTH;
            crop.y = (height - VIRTUAL_HEIGHT * scale) / 2f;
        } else {
            scale = (float) width / (float) VIRTUAL_WIDTH;
        }

        float w = (float) VIRTUAL_WIDTH * scale;
        float h = (float) VIRTUAL_HEIGHT * scale;
        viewport = new Rectangle(crop.x, crop.y, w, h);
        //Maintenance ends here--
    }

    @Override
    public void show() {
        camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); //Aspect Ratio Maintenance

        splashScreen = new Texture(Gdx.files.internal("images/splashScreen.png"));
        splashScreenRegion = new TextureRegion(splashScreen, 0, 0, 640, 480);
        splashScreenSprite = new SpriteBatch();

        if(Assets.load()) {
            this.dispose();
            TempMainGame.setScreen(TempMainGame.mainmenu);
        }
    }
}

GÜNCELLEME:Geçenlerde libGDX kendi işlevi olduğunu bilmek burada tartışmak istediğim boy oranı korumak için geldi. İnternet üzerinden en boy oranı sorunu arama yaparken, bazı forumlarda rastladım "Ne kadar farklı ekran boyutlarında en boy oranını korumak için mi?" bu sorun vardı geliştiriciler/ Gerçekten benim için çalıştı çözüm yukarıda yayınlanmıştır.

Daha sonra ne zaman başladı ile uygulama touchDown() yöntem için ekran, bulduğum nedeniyle Ölçekleme üzerinde yeniden boyutlandırma, koordinatlar üzerinde olan vardı uygulanıyor. touchDown() değiştireceğini tarafından büyük bir miktar. Ekran yeniden boyutlandırma uyarınca koordinatları çevirmek için bazı kod ile çalıştıktan sonra, büyük ölçüde bu miktar azalır ama başarılı pin nokta doğruluğu ile onları korumak için yanında olamadım. Örneğin, eğer vardı uygulanıyor. touchDown() bir doku, yeniden boyutlandırma ekran olur shift touchListener dokuyu bölge birkaç piksel sağa veya sola bağlı olarak yeniden boyutlandırma ve bu besbelli ki istenmeyen.

Daha sonra stage sınıfının en boy oranını (boolean stretch = false) korumak için kendi yerel işlevleri olduğunu bilmek geldi. Sahne sınıfını kullanarak ekran uyguluyorum şimdi, en boy oranı çok iyi korunur. Ancak yeniden veya farklı ekran boyutlarında, siyah bölge oluşturulan her zaman görünür sağ tarafta ekran; ekran değildir merkezli olan yapar bunu çok çirkin eğer siyah alanı oldukça geniş.

Herhangi bir topluluk üyesi, bu sorunu çözmek için bana yardımcı olabilir?

CEVAP
18 NİSAN 2014, Cuma


Nasıl bugünlerde yapmak için:

Bu libgdx burada en ünlü sorulardan biri olduğu için, biraz daha vereceğimgüncelleme:

LibGDX v1.0 Viewport bu sorun kullanılmaya başlandı. Bir sürü tek bir satır davranış değişikliği anlamına gelir ve ölçekleme strateji takılabilir kullanımı, daha kolay ve onunla oynamak ve en iyi oyununu uyan görebilirsiniz.

Hakkında bilmeniz gereken her şey here bulunabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blunty

    Blunty

    13 Mart 2006
  • TecNoob

    TecNoob

    15 AĞUSTOS 2013
  • tsweeney79

    tsweeney79

    21 Ocak 2008