pasjaonline.pl
Pi-explosion
Pi-explosion
Pi-explosion
Pi-explosion
Od podstaw – libGDX #2 | Kolizja i input
autor

Szymon Nowak

date

Hej! Witam Cię w nastepnym poradniku na temat tworzenia gier. W tej części dowiemy się jak sprawdzać kolizję oraz obsługiwać input użytkownika. Jeżeli przegapiłeś mój ostatni wpis na temat grafiki w libGDX’ie – przeczytasz go tutaj. Dobrze jakbyś go przerobił, ponieważ będziemy rozszerzać aplikację napisaną wcześniej.

Okej – obsługa kolizji i input. Od czego zaczniesz? Jeśli odpowiedziałeś – „no… od stworzenia gracza!” – to znaczy, że dobrze myślisz.

A więc – stwórzmy klasę „Gracz” w naszym głównym projekcie klikając prawym przyciskiem myszy na pakiet (u mnie – pl.pasjaonline.poradnik), wybierając New -> Class. Tak powinnna ona wyglądać:

package pl.pasjaonline.poradnik;

public class Gracz {

}

Pierwsze co musimy zrobić to sprawić by nasz obiekt dziedziczył z klasy Rectangle dopisując – jak możesz się domyślić:

public class Gracz extends Rectangle

Teraz dodajemy:

  • pole texture
  • metode getTexture
  • konstruktora naszego obiektu

Końcowy kod będzie wyglądał tak:

package pl.pasjaonline.poradnik;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Rectangle;

public class Gracz extends Rectangle {

private Texture texturaGracza;

   public Gracz(Texture t) {
      this.texturaGracza = t;
   }


   public Texture getTextura() {
      return texturaGracza;
   }

}

Gdy wszystko mamy gotowe – wracamy do naszej głównej klasy – Gra. W niej tworzymy 2 obiekty klasy Gracz, nazwę je gracz i przeciwnik. Inicjujemy je w metodzie create. Do konstruktra gracza dam texture [pasja] a do przeciwnika – [img] (zobacz poprzednią część kursu). Teraz do każdej z nich dajemy atrybuty w taki o to sposób:

gracz = new Gracz(pasja);

gracz.height = gracz.getTextura().getHeight(); // wysokosc obiektu
gracz.width = gracz.getTextura().getWidth();  // textura obiektu
gracz.x = 0; // pozycja x obiektu
gracz.y = 0; // pozycja y obiektu


przeciwnik = new Gracz(img);

przeciwnik.height = przeciwnik.getTextura().getHeight();
przeciwnik.width = przeciwnik.getTextura().getWidth();
przeciwnik.x = 300;
przeciwnik.y = 250;

Oczywiście – jeśli wiemy – możemy na sztywno ustawić szerokość i wysokość obiektu, np na 100, 100, jednak ten sposób jest bezpieczniejszy ponieważ ustawia te wartości pobierając je z textury.

Teraz zmieńmy funkcję render na następującą: 


public void render() {

   Gdx.gl.glClearColor(1, 1, 1, 1);
   Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


   batch.begin(); // początek SpriteBatcha

   batch.draw(gracz.getTextura(), gracz.x, gracz.y); // rysowanie gracza
   batch.draw(przeciwnik.getTextura(), przeciwnik.x, przeciwnik.y); // rysowanie przeciwnika

   batch.end(); // koniec SpriteBatch'a


   if (Gdx.input.isKeyPressed(Keys.W)) {
      gracz.y += 500 * Gdx.graphics.getDeltaTime();
   }


   if (Gdx.input.isKeyPressed(Keys.A)) {
      gracz.x -= 500 * Gdx.graphics.getDeltaTime();
   }


   if (Gdx.input.isKeyPressed(Keys.S)) {
      gracz.y -= 500 * Gdx.graphics.getDeltaTime();
   }


   if (Gdx.input.isKeyPressed(Keys.D)) {
      gracz.x += 500 * Gdx.graphics.getDeltaTime();
   }


   if(gracz.overlaps(przeciwnik)) {
      System.out.println("Kolizja!");
   }
}

Teraz pewnie myślisz – o co tutaj chodzi? A więc, pozwól, że Ci wytłumaczę:

  • zmieniliśmy batch.draw aby rysował nasz obiekt oraz jego x i y które są ustawione w metodzie create
  • dodaliśmy 4 if’y obsługujące input gracza. Jest to bardzo proste, Gdx.input.isKeyPressed() jest booleanem który bierze przycisk (Keys.[przycisk]. np. Keys.A) i zwraca wartość true jeżeli go naciskamy. Więc – gdy trzymamy A zmniejszamy wartość x naszego gracza. A co robi Gdx.graphics.getDeltaTime()? Jest to funkcja zwracająca różnice między poprzednią a następną klatką w metodzie render. Mnożąc wartość która ma być dodana/odjęta razy delta time jesteśmy pewni że na każdym sprzęcie gra będzie działać tak samo.
  • if sprawdzający kolizje. Klasa rectangle posiada metode overlaps, którą możemy sprawdzić czy 2 prostokąty (nasze obiekty gracz i przeciwnik) kolidują ze sobą. Jeśli tak – w konsoli dostaniemy komunikat „Kolizja!”

I to tyle w tej części kursu. Następnym razem nauczę Cię obsługiwać dźwięki oraz w lepszy sposób je ładować. Do zobaczenia!