-------------------- CENTROWANIE KAMERY NA WIDOKU GRACZA -----------------------------
Najpierw potrzebujemy samej instancji naszej klasy:
W metodzie create() albo konstruktorze innej klasy ustawiamy naszą kamerę na określony wymiar ekranu:
camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
Aby ustawić kamerę na środku naszego obiektu(tutaj żołnierza gracza) musimy wykonać taki kod:
camera.position.x = map.playerSolider.pozycja.x + (map.playerSolider.pozycja.width / 2);
camera.position.y = map.playerSolider.pozycja.y + (map.playerSolider.pozycja.height / 2);
Legenda:
- przyjmijmy że map jest klasą w której znajdują się wszystkie obiekty w grze.
- playerSolider jest klasą naszego żołnierza
- pozycja jest to klasa Rectangle z biblioteki libGDX.
Te instrukcje ustawiają kamerę na początkową pozycję obiektu oraz biorą poprawkę na miejsce środka gracza. Czyli do konkretnych pozycji x lub y dodają jeszcze połowę(kolejno) szerokości lub wysokości.
--------------------------------- OBRACANIE GRACZA I KAMERY-----------------------------------
Na początek mała uwaga:
Klasa Sprite ma ustawione początkowe wartości na połowe wartości szerokości(width) i wysokości(height) Texture do niej wczytanej. Dlatego obraca się od razu według swojego środka.
Dla klasy Texture podczas jej malowania, musimy o to sami zadbać.
Kod potrzebny aby obrócić Sprite gracza i kamery:
if((Gdx.input.getX() < 200 && Gdx.input.isTouched()) || Gdx.input.isKeyPressed(Keys.LEFT))
{
map.playerSolider.rotation += 1 ;
if( map.playerSolider.rotation < 0)
{
map.playerSolider.rotation = 360 + map.playerSolider.rotation;
}
camera.rotate(-1);
}
if((Gdx.input.getX() > 600 && Gdx.input.isTouched()) || Gdx.input.isKeyPressed(Keys.RIGHT))
{
map.playerSolider.rotation -= 1 ;
if( map.playerSolider.rotation > 359)
{
map.playerSolider.rotation = map.playerSolider.rotation - 360;
}
camera.rotate(1);
}
Legenda:
- Gdx.input jest klasą odpowiedzialną za obsługę klawiszy
- rotation maksymalną wartością tej zmiennej jest 359 stopni
Dzięki temu kodowi kamera będzie podążać za graczem, dzięki czemu gracz będzie patrzył ciągle w tę samą stronę na ekranie a inną w mapie gry. Instrukcja warunkowa chroni przed przekroczeniem 359 stopni albo przed wejściem w stopnie ujemne. Teoretycznie jest to opcjonalne zabezpieczenie ale czasem może spowodować przepełnienie się zmiennej.
Kamerę obracamy o wartość przeciwną do tej dla naszej postaci.
--------------------- PORUSZANIE SIĘ POSTACIĄ PO MAPIE---------------------------------------
if(Gdx.input.isKeyPressed(Keys.UP))
{
map.playerSolider.pozycja.x += (-120 * math.sinDeg((float)map.playerSolider.rotation)) * Gdx.graphics.getDeltaTime();
map.playerSolider.pozycja.y += (120 *
math.cosDeg((float)map.playerSolider.rotation)) * Gdx.graphics.getDeltaTime();
math.cosDeg((float)map.playerSolider.rotation)) * Gdx.graphics.getDeltaTime();
}
Legenda:
- Gdx.graphics.getDeltaTime() to funkcja która pobiera delte czasu gry, dzięki temu animacja czy odświeżanie czegoś niezależnie od ilości FPS na sekunde przesunie się o zadaną wartość. Gdyby tego nie było zacięcie gry albo chwilowy spadek FPS spowodowałby że nasza postać poruszająca się po 2 klatki(120 na 60 = 2)na 1FPS, przy 50FPS ruszyłaby się tylko o (50 * 2) 100 jednostek.
- MathUtils math to klasa służąca do obliczeń matematycznych.
- math.sinDeg()/math.cosDeg() to metoda obliczająca sinus/cosinus podanego kąta(UWAGA: Nie mylić z radianami!!!)
- Gdx.graphics.getDeltaTime() to funkcja która pobiera delte czasu gry, dzięki temu animacja czy odświeżanie czegoś niezależnie od ilości FPS na sekunde przesunie się o zadaną wartość. Gdyby tego nie było zacięcie gry albo chwilowy spadek FPS spowodowałby że nasza postać poruszająca się po 2 klatki(120 na 60 = 2)na 1FPS, przy 50FPS ruszyłaby się tylko o (50 * 2) 100 jednostek.
- MathUtils math to klasa służąca do obliczeń matematycznych.
- math.sinDeg()/math.cosDeg() to metoda obliczająca sinus/cosinus podanego kąta(UWAGA: Nie mylić z radianami!!!)
------------------------------------------------UWAGA---------------------------------------------------
Żeby działania kamery były widoczne, zanim zaczniemy rysować obiekty na mapię, czy mapę musimy odświeżyć stan kamery i nałożyć go na SpriteBatch. Wygląda to tak:
camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
/*
spriteBatch.begin();
//Wywołanie funkcji rysujących
spriteBatch.end();
*/
Legenda:
- spriteBatch instancja klasy SpriteBatch
I to wszystko, teraz możemy cieszyć się skrętnym widokiem w naszej apce:)