Rozdzielczość Niezależność w libGDX


22

Jak ustawić niezależność rozdzielczości / gęstości gry libGDX? Czy istnieje sposób, aby określić rozmiary obrazu jako „bezwzględne” niezależnie od podstawowej gęstości?

Tworzę bardzo prostą grę dla dzieci; tylko kilka ikonek wyświetlanych na ekranie i trochę tekstu dla menu (przede wszystkim menu opcji). Chcę wiedzieć: w jaki sposób mogę uniezależnić rozdzielczość moich ikonek / czcionek? (Owinąłem je na własne zajęcia, żeby było łatwiej).

Ponieważ jest to prosta gra dla dzieci, nie muszę się martwić o „obszar gry”; Chcę wykorzystać jak najwięcej miejsca na ekranie.

To, co robię teraz, co wydaje się bardzo niepoprawne, to po prostu tworzenie obrazów odpowiednich dla dużych rozdzielczości, a następnie skalowanie w dół (lub rzadko w górę), aby dopasować do rozmiaru ekranu. Wydaje się, że działa to dobrze (w wersji na komputery), nawet z liniowym mapowaniem moich tekstur, ale mniejsze rozdzielczości wyglądają brzydko.

Wydaje się to również leżeć w obliczu „niezależnych od urządzenia pikseli” Androida. A może coś mi brakuje, a libGDX już się tym jakoś zajmuje?

Jak najlepiej to rozwiązać? Znalazłem ten link; czy to dobry sposób na rozwiązanie problemu ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Wspomina o sterowaniu obrazami, ale nie wspomina o tym, jak określać rozmiary czcionek / obrazów niezależnie od ich gęstości.



@thedaian niezupełnie. Chodzi o rozdzielczość; Bardziej martwi mnie wzajemne oddziaływanie gęstości i rozdzielczości.
ashes999

Odpowiedzi:


12

Ponieważ w libgdx można odczytać gęstość urządzenia i renderować czcionki podczas działania , używam tego rozwiązania, aby uzyskać rozmiar czcionki niezależny od gęstości:

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

Moja dyskusja dotyczy obrazów, a także czcionek. +1 za dynamiczne renderowanie czcionek (już to robię).
ashes999

10

Aby to osiągnąć w libgdx, możesz użyć „aparatu ortograficznego”, w którym ustawiasz rozmiar, którego chcesz użyć, aw każdej rozdzielczości możesz zobaczyć wszystkie swoje obrazy skalowane do tego rozmiaru (używam 800X480, ponieważ jest to większy ekran w Androidzie ) i działa dobrze :)

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

Czy mogę prosić o próbkę kodu?
ashes999

To jest kod i tworzysz klasę, która implementuje interfejs Screen, w konstruktorze budujesz swój etap, a w metodzie renderowania wstawiasz stage.draw (). Jeśli nie chcesz używać etapów, możesz zadeklarować zmienną w klasie typu Screen zaimplementowanej w kamerze i zrobić to samo, co w etapie, ale w metodzie renderowania zastosujesz aktualizację do kamery.
Rudy_TM,

To naprawdę działa całkiem dobrze.
you786,

4

Uważam, że „niezależne od urządzenia piksele” Androida to tylko miarka do klasyfikacji urządzeń i nie są w rzeczywistości dostępne jako piksele do renderowania. Więc nie przegapisz żadnej magicznej infrastruktury do rozwiązywania DPI. O ile rozumiem tutaj stan techniki, odkryłeś wszystkie opcje. Istnieją dwa podstawowe podejścia do obsługi różnych urządzeń:

  1. Skaluj wcześniej istniejące obrazy, aby dopasować je do faktycznego DPI urządzenia.
  2. Wybieraj spośród wielu wstępnie skalowanych obrazów w czasie wykonywania na podstawie DPI.

Oczywiście możesz wykonać kilka kombinacji (wybranie z grubsza dokładnego obrazu, a następnie skalowanie go) lub zastosować inne podejście do różnych elementów interfejsu użytkownika (np. Wcześniej istniejące obrazy dla czcionek / tekstu i dynamiczne skalowanie dla gry duszki).

To, co stara się zrobić w konkretnej grze, może naprawdę zmienić to, które podejście ma większy sens. Na przykład, jeśli masz menu ekranowe, upewnij się, że przyciski mają rozsądną wielokrotność wielkości palca (więc przycisk jest zawsze łatwy do naciśnięcia, ale nie jest większy niż to konieczne w duże urządzenia, takie jak tablety). Alternatywnie, jeśli próbujesz zbudować grę logiczną, w której chcesz mieć pewność, że cała łamigłówka jest widoczna na raz, musisz przeskalować elementy, aby pasowały do ​​ekranu (na przykład za pomocą kółko i krzyżyka) być może chciałbyś, aby każdy element wykorzystywał około 1/3 ekranu).

Sądzę, że w przypadku czcionek o bardzo drobnych szczegółach będziesz chciał mieć wiele wstępnie renderowanych obrazów z tekstem, a następnie wybierz najlepiej dopasowane. Przyciski mogą więc zmieniać swój względny kształt / rozmiar z jednego urządzenia na drugie, ale ogólnie zawsze będą ładnie wyglądać.

Sprawdź gry Mario Zerchner's Beginning na Androida, aby uzyskać omówienie problemów i rozwiązań. Zauważ, że Mario jest autorem libGDX, więc podejście książki odzwierciedla libGDX jeden (zauważ, że nie są one jeden do jednego, książka obejmuje pisanie biblioteki podobnej do libGDX, ale nie samej libGDX).


Nawet jeśli wybiorę spośród gotowych kolekcji obrazów opartych na DPI, nie widzę, w jaki sposób mogę zagwarantować, że „ten duszek MUSI wyświetlać się jako 64x64”.
ashes999

1
Zakładałem, że ustawiłeś kamerę OpenGL tak, aby odpowiadała fizycznemu wyświetlaczowi, więc 1 piksel OpenGL odwzorowuje na 1 piksel wyświetlacza. W tym momencie obraz 64x64 pojawi się na ekranie jako 64x64. Jak wskazuje Rudy_TM, możesz zepsuć mapowanie kamery, aby uzyskać skalowanie całego ekranu.
PT

Okej, to wygląda jak „sekretny sos”, którego szukałem. Sprawdzę i dam ci znać, dzięki.
ashes999

0

Jednym ze sposobów jest zdefiniowanie minimalnego współczynnika proporcji i maksymalnego współczynnika proporcji dla gry. Będą to współczynniki, które chcesz wesprzeć. Następnie musisz użyć rzutni, która jest teraz dostępna w libGdx. Rzutnia skaluje Twój świat zgodnie z podanymi ustawieniami.

Istnieje kilka rodzajów rzutni i musisz wybrać ten, który jest najbardziej odpowiedni dla twojej gry.

Możesz na przykład użyć ExtendViewport i naprawić albo wysokość, albo szerokość i obliczyć drugą. Następnie upewnij się, że cała grafika jest widoczna w minimalnym formacie. Rozszerz rzutnię przeskaluje twoją grafikę do właściwego współczynnika proporcji bez zniekształcania grafiki. Jednak ExtendViewport działa poprzez dodanie dodatkowej przestrzeni do twojego świata, więc powinieneś także zapewnić grafikę dla tła, która na przykład obejmuje cały zakres pokrytych współczynników proporcji, gdy świat jest mniejszy niż twój maksymalny współczynnik proporcji, dodatkowa część grafiki nie będzie wykazać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.