sobota, 27 lipca 2013

LIBGDX - Grafika - konfiguracja i odczytywanie parametrów.

OpenGL Context
Poniższy kod odpowiada za ustawienie rozmiarów pola widzenia oraz jego wyczyszczenie (wypełnienie jednolitym kolorem).

Gdx.gl20.glViewport( 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight() );
Gdx.gl20.glClearColor( 0, 0, 0, 1 );
Gdx.gl20.glClear( GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );


Frame Time
Jedną z najczęściej wykorzystywanych metod klasy Graphics jest getDeltaTime(), która zwraca czas który upłynął od chwili wyrenderowania poprzedniej ramki.
Przykładowe użycie:
stage.act( Math.min( Gdx.graphics.getDeltaTime(), 1/30 ) );

Kolejną przydatną metodą jest getFramesPerSecond() - zwraca średnią ilość renderowanych ramek w ciągu sekundy. Najczęściej przydatna w celach diagnostycznych.

LIBGDX - klawiatura ekranowa.

Wyświetlenie klawiatury:

Gdx.input.setOnscreenKeyboardVisible(true);


LIBGDX - Obsługa przycisków 'Wstecz' i 'Menu'

Naciśnięcie przycisku 'Wstecz' zazwyczaj powoduje zakończenie bieżącej aktywności. W niektórych sytuacjach wymagane jest wyświetlenie okna dialogowego służącego potwierdzeniu decyzji o zamknięciu np. aktywności. Aby tego dokonać należy przechwycić zdarzenie naciśnięcia przycisku 'Wstecz'.
Gdx.input.setCatchBackKey(true);

Zdarzenie nadal będzie obsługiwane jeśli mamy zarejestrowany odpowiedni InputProcessor, jednak system operacyjny nie zamknie bieżącej aktywności.
Należy mieć na uwadze, że w systemie Android przycisk 'Wstecz' z definicji służy do zamykania bieżącej aktywności i zmiana takiego zachowania nie należy do dobrych praktyk.
Sposób przechwytywania zdarzenia naciśnięcia przycisku 'Menu':
Gdx.input.setCatchMenuKey(true);

LIBGDX - obsługa wibracji (Gdx.input.vibrate).

Obsługa urządzenia wibracji:

Gdx.input.vibrate(2000);

Jako parametr podajemy czas wibracji mierzony w milisekundach.
Sposób wibrowania można określić bardziej precyzyjnie:

Gdx.input.vibrate(new long[] { 0, 200, 200, 200}, -1); 

W tym przypadku wibracje będą włączone przez 200ms, następnie zostaną wyłączone na 200ms poczym ponownie włączone na 200ms. Drugi parametr oznacza, że cykl wibracji nie będzie powtarzany. Więcej szczegółów w Javadocs.

LIBGDX - Obsługa kompasu

Sprawdzenie obecności czujnika pola magnetycznego w urządzeniu:

boolean compassAvail = Gdx.input.isPeripheralAvailable(Peripheral.Compass);

Odczytywanie danych z kompasu:

float azimuth = Gdx.input.getAzimuth();
float pitch = Gdx.input.getPitch(); float roll = Gdx.input.getRoll();

Wartości kątów zwracane przez w/w funkcje mierzone są w stopniach.

  • azimuth - kąt położenia urządzenia względem osi 'z'. Wartości dodatnie osi 'z' skierowane są ku środkowi kuli ziemskiej.
  • pitch - kąt położenia urządzenia względem osi 'x'.
  • roll - kąt położenia urządzenia względem osi 'Y'.

LIBGDX - obsługa akcelerometru

Przyspieszenie mierzone jest w metrach na sekundę do kwadratu (m/s2). Jeśli dana oś wskazuje dokładnie środek kuli ziemskiej, przyspieszenie dla tej osi wynosi 10 m/s2. Jeśli wskazuje przeciwny kierunek wówczas przyspieszenie ma wartość -10 m/s2.
Układ osi współrzędnych obowiązujący dla urządzeń z systemem Android.


Niestety dla urządzeń typu tablet układ osi jest inny. W urządzeniach z systemem Android przyjęto, że telefony domyślnie znajdują się w pozycji 'portrait' a tablety 'landscape'.

Sprawdzenie dostępności akcelerometru w urządzeniu:

boolean available = Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer);


Odczytanie bieżącej orientacji ekranu:
int orientation = Gdx.input.getOrientation();


Funkcja zwraca wartość 0, 90, 180 lub 270. Daje to informację o różnicy między aktualną orientacją a natywną.

Odczytanie natywnej (domyślnej) orientacji ekranu:
Orientation nativeOrientation = Gdx.input.getNativeOrientation();
Funkcja zwraca wartość Orientation.Landscape lub Orientation.Portrait.

Odczytywanie wartości akcelerometru:
 float accelX = Gdx.input.getAccelerometerX();
 float accelY = Gdx.input.getAccelerometerY();
 float accelZ = Gdx.input.getAccelerometerZ();
W urządzeniach nie posiadających akcelerometru funkcje zwrócą wartość 0.
Przykład zastosowania akcelerometru: Super Jumper.


LIBGDX - wprowadzanie tekstu przez użytkownika "Text Input interface".

Jeśli w aplikacji konieczne jest wprowadzenie przez użytkownika tekstu (np. wpisanie hasła), można skorzystać z gotowego interfejsu "Input".
W systemie Android zostanie wyświetlone standardowe okno dialogowe umożliwiające wprowadzenie tekstu.
Obsługa zdarzeń akceptacji lub anulowania wprowadzonych danych za pomocą listener-a:

public class MyTextInputListener implements TextInputListener {
   @Override
   public void input (String text) {
   }

   @Override
   public void canceled () {
   }
}

Aby wywołać okno dialogowe należy skorzystać z metody:

MyTextInputListener listener = new MyTextInputListener();
Gdx.input.getTextInput(listener, "Dialog Title", "Initial Textfield Value");

Metody listenera ("input" lub "canceled") zostaną wywołane standardowo w tym samym wątku, w którym wykonywana jest metoda "render", zaraz przed wywołaniem ApplicationListener.render().