[libGDX 0.9.7][2D] Praca z kamerą i przesuwaniem postaci w zależności od kąta

Czyli kilka porad jak zrobić by nasz postać podążała tam gdzie patrzy i jak ustawić kamerę by widniała nad postacią.

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

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!!!)

------------------------------------------------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:)