Zmotywowany wieczorną rozmową ze znajomą, postanowiłem, że dziś pojawi się kolejny wpis ściśle związany z projektem. Kilka commitów widnieje już na moim koncie githuba. Wpis będzie tyczył się pierwszych rzeczy jakie zrobiłem w kierunku realizacji mojego projektu. Wspomnę o tym na jakim urządzeniu pracuję oraz w jakim programie powstaje projekt. Moim codziennym narzędziem pracy jest Macbook Air mid 2012 11,6′, natomiast środowisko w jakim piszę to IntelliJ IDEA 2016.3, wszystkim polecam. Warto dodać, że dla każdego studenta jest darmowa licencja, wystarczy tylko podesłać skan legitymacji.
Początek projektu
Na samym początku utworzyłem projekt w generatorze udostępnionym przez twórców biblioteki ligbdxa. Kolejnym krokiem było skonfigurowanie środowiska pod tą bibliotekę, co wiążę się z ustawieniami kompilacji i uruchamiania pisanej aplikacji. W IntelliJ wystarczy przejść do Run->Edit Configurations… i tam należy w przypadku desktopu (projekt, którym obecnie się zajmuję jest tylko na desktopy, być może zostanie później utworzona wersja na urządzenia mobilne) podać Use classpath of module, klasę uruchamiającą Main class oraz folder roboczy Working directory, w którym są przechowywane pliki wykorzystywane w aplikacji np. grafiki lub pliki audio. U mnie wygląda to następująco:
Początkowy kod wygląda następująco:
public class UWar extends ApplicationAdapter { SpriteBatch batch; Texture img; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg "); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(img, 0, 0); batch.end(); } @Override public void dispose () { batch.dispose(); img.dispose(); } }
W kodzie głównym naszej gry mamy dwie zmienne. batch odpowiada za wyświetlanie elementów na ekranie, natomiast img tworzy grafikę wyświetlaną w oknie aplikacji. Nasza klasa składa się również z nadpisanych (@Override) trzech metod – create(), dispose() oraz render().
W metodzie create() inicjalizujemy wcześniej zadeklarowane zmienne, ustawiamy ich atrybuty i tak właśnie w tym kodzie następuje pierw inicjalizacja zmiennej batch, a następnie zmiennej img, gdzie w konstruktorze podajemy nazwę pliku graficznego, który ma zostać wczytany.
Kolejna metoda to render() w której następuje generowanie każdej klatki gry. To ta metoda odpowiada za wyświetlanie elementów na ekranie. W powyższym kodzie linijki 12-13 odpowiadają za wyczyszczenie ekranu z elementów narysowanych w poprzedniej klatce oraz wypełnienie go kolorem czerwonym. Następnie aby móc rysować na ekranie musimy wcześniej użyć metody start() zmiennej batch, czynimy to w 14 linijce oraz nie możemy na koniec po wykonaniu rysowania na ekranie zapomnieć o użyciu metody end() (ostatnia linijka metody). W 15 linijce kodu mamy styczność z rysowaniem wcześniej zainicjalizowanej tekstury na ekranie. Metoda ta przyjmuje 3 argumenty – zmienną klasy Texture, współrzędną x oraz współrzędną y (współrzędne x i y wyrażane są w pixelach). Wartu tu wspomnieć, że w odróżnieniu od innych języków w libgdxie ekran ma wartość 0,0 w lewym dolnym rogu.
Ostatnią metodą jest dispose() jej zadaniem jest po zamknięciu aplikacji wyczyszczenie pamięci ze zmiennych w celu zapobiegnięcia wycieku pamięci. Innymi słowy jest to po prostu usunięcie zmiennych.
Kod klasy uruchamiającej dla desktopa:
public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGdxGame(), config); } }
W tym kodzie widzimy, że libgdx dla wersji desktopowej wykorzystuje inną bibliotekę – LWJGL, również jest to biblioteka służąca do pisania gier w javie. Zmienna config (widzimy ja w 2-3 linijce) umożliwia nam zmianę wielkości i nazwy okna. Co pokażę w kolejnym wpisie.
Po skompilowaniu i uruchomieniu wyżej omówionego kodu, naszym oczom ukaże się taki widok:
Podsumowanie
Dziś już było troszkę więcej praktycznych rzeczy, jednak kolejny wpis będzie jeszcze bardziej ciekawszy, ponieważ w nim skupię się na graczu i jego początkowych możliwościach. Zaczniemy od napisania klasy bohatera, wyświetlenia jej na ekranie aż w końcu przejdziemy do poruszania postacią.
Miłego dnia,
sirmarbug