2016-04-18 46 views
6

Jestem programistą dla Androida, budując swoją pierwszą grę za pomocą LibGDX. Po przeczytaniu WIELU, wciąż jest jedna rzecz, której nie rozumiem.Używaj Libgdx i TexturePackera z obrazami xxxdpi zniekształconymi

Zdaję sobie sprawę, że powinienem mieć jeden zestaw obrazów, dla najwyższej rozdzielczości 2560x1440 (Aby zapobiec brzydkiemu skalowaniu nie obrazów wektorowych).

Używam TexturePacker pakować moje obrazy, a nawet stosując liniową liniową, aby uzyskać maksymalną jakość:

TexturePacker.Settings settings = new TexturePacker.Settings(); 
settings.filterMin = Texture.TextureFilter.Linear; 
settings.filterMag = Texture.TextureFilter.Linear; 
settings.maxWidth = 4096; 
settings.maxHeight = 2048; 
TexturePacker.process(settings, inputDir, outputDir, packFileName); 

mam ustawić aparat, zgodnie z zaleceniami w kilku SO-tych, do liczników stałych i uniknąć wszystkich PPM. Z ekranu C'TOR:

mCamera = new OrthographicCamera(); 
mCamera.viewportWidth = 25.6f; ; // 2560/100 
mCamera.viewportHeight = 14.4f ; // 1440/100 
mCamera.position.set(mCamera.viewportWidth/2, mCamera.viewportHeight/2, 0f); 
mCamera.update(); 

Jak widać wybrałem pracę z 1 metrem = 100 pikseli.

Teraz, co oznacza, że ​​powinny rysuję moje ikonek z 1/100 wielkości, co robię tutaj:

TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("images/pack.atlas")); 
mImage = atlas.createSprite("image")); 
mImage.setSize(mImage.getWidth()/100 , mImage.getHeight()/100); 

To działa i obrazy są wyświetlane zgodnie z przeznaczeniem. ALE, są one zniekształcone jak diabli! idealnie okrągły obraz wygląda piksele na krawędziach, a nie okrągły.

Więc moje pytania to:

  1. Jest to najlepsza praktyka czy mam działać inaczej?
  2. Czy poprawne jest posiadanie obrazów o najwyższej jakości?
  3. Czy zniekształcenie oznacza, że ​​mój kod naprawdę redukuje sprite i jakoś libgdx ponownie go skaluje i obniża jakość?

Dzięki!

EDIT
będę dostosować @ odpowiedzi Tenfour04 do (1) i (2).
chodzi (3), problem jest z Genymotion :(, jego pixelating grę. Mam przetestować go na rzeczywistych urządzeń z kilku rozdzielczościach i wygląda idealnie.

Odpowiedz

1
  1. Masz jeden błąd w konfiguracji Twój aparat: zakładasz, że ekran ma zawsze ten sam współczynnik kształtu, ale w rzeczywistości będzie się różnić. Lepiej wybrać stałą wysokość lub szerokość (wybierz w zależności od rodzaju gry) i dostosować przeciwny wymiar na podstawie od proporcji bieżącego ekranu. na przykład:

    mCamera.viewportHeight = 25.6f; //game screen always 25.6 meters tall

    mCamera.viewportWidth = 25.6f/(float)Gdx.graphics.getHeight() * (float)Gdx.graphics.getWidth();

  2. „powinienem mieć jeden zestaw obrazów dla najwyższej rozdzielczości” niekoniecznie jest to prawda. Jeśli to zrobisz, będziesz musiał załadować obrazy o bardzo wysokiej rozdzielczości na urządzeniach, które nie mogą z nich skorzystać. Spowoduje to użycie dużej ilości pamięci i wydłużenie czasu ładowania. To może być w porządku w trakcie projektowania, ale na dłuższą metę prawdopodobnie będziesz chciał mieć dwie lub trzy różne wersje o mniejszej rozdzielczości, które możesz selektywnie załadować.

    Z tego powodu uniknęłbym również kodowania twardego, które 100 wszędzie w kodzie. Ustaw pixelsPerMeter jako zmienną ustawianą raz, gdy gra się uruchomi. Na razie może to być po prostu 100, ale jeśli zdecydujesz się na późniejszą grafikę o mniejszej rozdzielczości, możesz dostosować ją odpowiednio, bez konieczności szukania wszystkich wystąpień 100 w kodzie.

  3. Twój min. Filtr powinien wynosić MipMapLinearLinear lub MipMapLinearNearest. W przeciwnym razie wydajność będzie ucierpiała, gdy spity będą rysowane mniej niż ich rozdzielczość natywna i mogą wyglądać zniekształcone zgodnie z opisem. Możesz sprawdzić mapowanie mip, aby zobaczyć, dlaczego tak się dzieje.

+0

Cześć dziękuję za szczegółową odpowiedź. (1) Jestem z tym zainteresowany i zamierzam go wdrożyć oczywiście dzięki. (2) dźwięk sprytny i łatwy do zrobienia z TexturePackerem, jak to możliwe, że nie widzę żadnego tutoriala, który wspomniałby o tej metodzie pracy? (3) Próbowałem także MipMapLinearLinear i innych opcji, ale ikonka nadal jest zniekształcona. Więc, z tego, co mówisz, mogę mieć inny problem? – Shirane85

+0

Nie wiem, dlaczego nie znajduje się w wielu samouczkach. Wsparcie znajduje się w TexturePackerze. Może opublikuj zdjęcie swojego zniekształconego duszka. Nie jestem pewien, co jeszcze spowodowałoby to, co opisałeś. – Tenfour04