LibGDX'te Çözünürlük Bağımsızlığı


22

LibGDX oyun çözünürlüğümü / yoğunluğumu nasıl bağımsız yapabilirim? Alttaki yoğunluğa bakılmaksızın görüntü boyutlarını "mutlak" olarak belirtmenin bir yolu var mı?

Çok basit bir çocuk oyunu yapıyorum; Ekranda sadece bir grup sprite ve menüler için bir miktar metin görüntüleniyor (öncelikle seçenekler menüsü). Bilmek istediğim şey: sprite / fontlarımı çözünürlüğümü nasıl bağımsız hale getirebilirim? (İşleri kolaylaştırmak için onları kendi sınıflarımda sardım.)

Basit bir çocuk oyunu olduğu için, oyunun "oynanabilir alanı" hakkında endişelenmeme gerek yok; Ekran alanını mümkün olduğunca kullanmak istiyorum.

Şu anda yaptığım şey, süper yanlış görünüyor, sadece büyük çözünürlükler için uygun görüntüler oluşturmak ve ardından ekran boyutuna sığacak şekilde küçültmek (veya nadiren yukarı). (Masaüstü sürümünde) dokularım üzerindeki doğrusal haritalamada bile işe yarayacak gibi görünüyor, ancak daha küçük çözünürlükler çirkin görünüyor.

Ayrıca, bu Android'in "cihazdan bağımsız pikseller" (DP'ler) karşısında uçuyor gibi görünüyor. Ya da belki bir şeyleri özlüyorum ve libGDX zaten bununla ilgileniyor?

Bununla baş etmenin en iyi yolu nedir? Bu bağlantıyı buldum; bu sorunu çözmenin iyi bir yolu mu ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Görüntülerin nasıl kontrol edileceğinden bahseder, ancak yoğunluktan bağımsız olarak yazı tipi / görüntü boyutlarının nasıl belirtileceğinden bahsetmez.



@thedaian pek değil. Bu çözümle ilgili; Yoğunluk ve çözünürlük arasındaki etkileşim hakkında daha çok endişeliyim.
ashes999

Yanıtlar:


12

Aygıt yoğunluğunu okuyabildiğiniz ve çalışma zamanı boyunca libgdx'deki yazı tiplerini işleyebildiğiniz için yoğunluktan bağımsız bir yazı tipi boyutu elde etmek için bu çözümü kullanıyorum:

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

Tartışmam, yazı tiplerinin yanı sıra görüntüler hakkında da. Dinamik font oluşturma için +1 olsa da (bunu zaten yapıyorum).
ashes999

10

Bunu libgdx'de elde etmek için, kullanacağınız boyuta sahip olduğunuz "orthographicCamera" ı kullanabilirsiniz, ve her çözünürlükte tüm resimlerinizi o boyuta ölçeklendirilmiş olarak görebilirsiniz (çünkü 800X480'i kullanıyorum çünkü Android'de daha büyük ekran ) ve iyi çalışıyor :)

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); 
     } 
}

Kod örneği alabilir miyim lütfen?
ashes999

Bu koddur ve Screen arayüzünü uygulayan bir sınıf yaratırsınız, kurucunuzda kendi kurucunuzu oluşturur ve render yönteminde stage.draw () komutunu koyarsınız. Stages kullanmak istemiyorsanız, Camera tipi sınıfta uygulanan bir değişkeni tanımlayabilir ve Stage'dekiyle aynı şeyi yapabilirsiniz, ancak oluşturma yönteminde kameraya bir güncelleme uygularsınız.
Rudy_TM

Bu aslında oldukça iyi çalışıyor.
sen786

4

Android'in "cihazdan bağımsız pikseller" in yalnızca aygıtları sınıflandırmak için bir ölçü çubuğu olduğuna ve gerçekte yenilebilir pikseller olarak bulunmadığına inanıyorum. Yani herhangi bir büyülü DPI çözme altyapısını kaçırmıyorsunuz. Sanatın buradaki durumunu anladığım kadarıyla tüm seçenekleri keşfettiniz. Farklı cihazlarla uğraşmak için iki temel yaklaşım vardır:

  1. Önceden var olan görüntüleri, asıl aygıt DPI'ına uygun şekilde ölçeklendirin.
  2. DPI'ya göre çalışma zamanında çeşitli ölçeklendirilmiş görüntüler arasından seçim yapın.

Elbette, ikisinin bir karışımını yapabilir (kabaca doğru bir görüntü seçip ölçeklendirerek) veya kullanıcı arabiriminizin farklı öğeleri için farklı yaklaşımlar kullanabilirsiniz (örneğin, yazı tipleri / metin için önceden var olan görüntüler ve oyun için dinamik ölçeklendirme) cinler).

Özel oyununuzun yapmaya çalıştığı şey, yaklaşımın daha mantıklı olduğu konusunda gerçekten bir fark yaratabilir. Örneğin, bir ekran menünüz varsa, düğmelerin parmak ucu boyutunun makul bir katı olduğundan emin olmak istersiniz (bu nedenle düğmenin her zaman kolay olması gerekir, ancak tabletler gibi büyük aygıtlar). Alternatif olarak, tüm yapbozun aynı anda görünür olduğundan emin olmak istediğiniz bir yapboz oyunu oluşturmaya çalışıyorsanız, elemanları ekrana sığacak şekilde ölçeklendirmeniz gerekir (örneğin, bir tic-tac-toe ile Oyun belki de her elemanın kabaca ekranın 1 / 3'ünü kullanmasını istersiniz).

Bence yazı tipleri gibi, çok fazla ayrıntı içeren şeyler için, metin içeren önceden oluşturulmuş çeşitli görüntüler elde etmek isteyeceksiniz ve ardından en iyi eşleşmeyi seçin. Dolayısıyla düğmeler göreceli şekillerini / boyutlarını bir cihazdan diğerine değiştirebilir, ancak genellikle her zaman güzel görünür.

Mario Zerchner'ın Sorunları ve bazı çözümleri tartışması için Android Oyunlarına Başlarken bölümüne bakın . Mario'nun libGDX'in yazarı olduğuna dikkat edin, bu nedenle kitabın yaklaşımı libGDX'e bir yansıtma yapar (kitap bire bir değil, kitap libGDX'e benzer bir kütüphane yazmayı kapsar, ancak libGDX'in kendisine değil).


DPI tabanlı hazır resim koleksiyonlarından birini seçsem bile, "bu sprite 64x64 olarak görüntülenmeli" diye nasıl garanti edebileceğimi anlamıyorum.
ashes999

1
OpenGL kameranızı fiziksel ekrana uyacak şekilde ayarladığınızı varsayıyordum, bu yüzden 1 OpenGL piksel 1 ekran pikseline eşlenir. Bu noktada 64x64 görüntü ekranda 64x64 olarak görünecektir. Rudy_TM'nin işaret ettiği gibi, tam ekran ölçeklendirmesi elde etmek için kamera eşlemesi ile karışabilirsiniz.
PT

Tamam, bu benim peşimde olan "gizli sos" gibi gözüküyor. Kontrol edip size bildiririm, teşekkürler.
ashes999

0

Bunu yapmanın bir yolu oyununuz için minimum boy oranını ve maksimum boy oranını tanımlamaktır. Bunlar desteklemek istediğiniz oranlar olacaktır. O zaman şimdi libGdx'de verilen bir Viewport kullanmanız gerekir. Görüntü alanı, dünyanızı sağladığınız ayarlara göre ölçeklendirir.

Birkaç görüntü penceresi vardır ve oyununuz için en uygun olanı seçmeniz gerekir.

Örneğin ExtendViewport'u kullanabilir, boy veya genişliğinizi düzeltebilir ve diğerini hesaplayabilirsiniz. Ardından, tüm grafiklerin minimum en boy oranında görülebildiğinden emin olmanız gerekir. Genişletme çerçevesi, grafikleri bozmadan grafiklerinizi doğru en boy oranına ölçeklendirir. Bununla birlikte, ExtendViewport, dünyanıza ek alan ekleyerek çalışır; böylece, dünyanın en boy oranından daha küçük olduğu durumlarda, dünyanın en boy oranından daha küçük olması durumunda, grafiklerin fazladan bir kısmı olmaz. gösterilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.