petak, 19 aprila, 2024
Kako da...?

LibGDX „Java game development framework” (1. dio)

Autor: Gavrilo Prodanović

Skoro čitavoj mladoj populaciji igrice su alatka za opuštanje i portal za uživanje u nekoj drugoj dimenziji. Mnogi odrasli često igraju igrice sa svojom djecom ili samostalno u slobodno vrijeme. Da bi se sastavila igrica, potrebne su određene tehničke sposobnosti i osjećaj za umjetnost i kreativnost da bi se igrica dočarala kroz grafiku, zvučne efekte i kroz sam gameplay. Mi ćemo ovde predstaviti alat koji će vam olakšati pisanje koda za igricu, a ime mu je LibGDX od badlogicgames-a.

Nekada prije, trebalo je vjerovatno duboko razumjevanje low-level stvari da bi se napisala i neka osnovna igrica. Da bi igrica bila dostupna na više platformi, obično se preskakao korak. Danas je sve mnogo lakše, a podrška za više platformi dolazi spontano i podrazumjevano, a to su, može se reći, glavni aduti LibGDX-a. LibGDX je javaframework koji podržava sledeće platforme: Desktop (Linux, Mac OSX, Windows), Mobile (Android, iOS) i web (HTML5). Od IDE-a podržani su Eclipse, IntellijIDEA i NetBeans. Moguće je koristiti samo komandnu liniju za razvoj. LibGDX svaki projekat konceptualno djeli u pet djelova (projekata): core, desktop, android, ios i html. Core sadrži zajednički kôd, a ostali projekti sadrže kôd specifičan za platformu. LibGDX posjeduje generator projekta koji će podesiti sve potrebne potprojekte i skinuti sve dodatne libove (eng. libraries) koji su potrebni. Možemo odabrati koje platforme želimo da koristimo, a u ponudi su ostale biblioteke koje će da prošire funkcije libGDX-a. Koristi gradle, što automatski omogućava importovanje u sve poznate IDE-ove.Za portabilnost LibGDX-a vjerovatno su najviše zaslužni OpenGL i Java koji su dostupni za različite platforme. Programer će kôd logike igre da stavi u core projekat, dok su ostali projekti generisani vraperi (eng. wrappers), a u njima se i ne mora mnogo toga mjenjati. Za desktop bismo postavili podrazumjevanu rezoluciju, za android podrazumjevanu orjentaciju, a u html projekat kôd landing stranice. Za sve platforme biće vam dovoljan Linux OS za programiranje, osim za iOS platformu gdje će vam biti potreban Mac računar sa OSX sistemom i sa xCode razvojnim okruženjem. Znajući da se struktura sistema datoteka konceptualno razlikuje između Windows-a i ostalih UNIX sistema, a isto tako se i načini smještanja podataka na Android-u i na Linuxdesktop-u razlikuju, prikaz LibGDX počećemo upravo o tome kako ovaj framework generalizuje sistem datoteka. LibGDX generalizuje sistem datoteka u sledećih pet grupa:

  1. Classpath: Omogućuje pristupanje datotekama koje su upakovane u arhivu aplikacije (npr. jar ili apk). Pristup ovim datotekama je read-only.
  2. Internal: U interne datoteke spadaju one datoteke čija je putanja relativna na root putanju aplikacije i radnog direktorijuma za Desktop i za datoteke koje se nalaze unutar assets/ direktorijuma u Android projektu koji je uključen u arhivu aplikacije. Interne datoteke su obično read-only ako se odnose na datoteke upakovane u arhivu.
  3. Local: Lokalne datoteke na desktop-u su smještene u root aplikacije, a za mobilne uređaje unutar privatnog direktorijuma u zavisnosti od sistema. Preporučeno ga je koristiti za čuvanje manjih datoteka kao što je game state.
  4. External: Za desktop su smještene unutar home direktorijuma, dok je za mobilne uređaje to SD kartica. Namjenjen je za čuvanje velikih datoteka, ako ima potrebe.
  5. Absolute: Omogućava pristup datotekama na osnovu apsolutne putanje. Ovakav način nije preporučljiv jer postoji mogućnost za narušavanje portabilnosti.

Za html5 dostupno je samo interno skladište (eng. storage), dok se za sve ostale platforme mogu koristiti sva skladišta. Lokalno i eksterno skladište mogu biti fizički nedostupni na nekim platformama, pa su tu i funkcije kojima možemo provjeriti dostupnost. Moguće je brisati i mjenjati naziv datoteke unutar lokalnog ili eksternog skladišta ili kopirati i premještati datoteku između lokalnog i eksternog skladišta.

Kao primjer vrapera za sistem datoteka učitaćemo tekstualnu datoteku iz internog skladišta koja je smještena unutar assets fascikle u android projektu.

FileHandle file = Gdx.files.internal("myfile.txt"); String text = file.readString();

Program u LibGDX, možemo reći, počinje u klasi koja naslijeđuje Gamesuper klasu. Prije toga, pokrene se kôd specifičan za platformu, npr. main funkcija za desktop ili onCreate u MainActivity-u za android. Najvažnija naslijeđena metoda je render() koja se poziva u beskonačan loop. U njoj se pozivaju funkcije za renderovanje, a može biti smješten i kôd logike igrice. U praksi nije praktično implementirati čitavu igricu unutar glavne Game klase, a libGDX nam tu pomaže jer posjeduje interfaceScreen koji implementira neku našu klasu koja je zadužena za određenu usku logiku (npr. jedan screen za glavni meni, drugi screen za sam gameplay). Interfejs definiše veći broj metoda: render, resize, show, hide, pause, resume i dispose. One svojim imenom opisuju svoju namjenu. Zahvaljujući ovakvom pristupu, lako možemo da smjenjujemo logičke cjeline jednu za drugom. U sledećem broju udubićemo se u metode kojima možemo da renderujemo grafiku u libgdx, njegove low-levelopengl vrapere i high-level klase koje su tu da nam olakšaju život. Govorićemo o tome kako je input klasifikovan kroz platforme i ukratko ćemo reći šta je u ponudi za reprodukovanje zvučnih efekata i melodija. Kasnije ćemo govoriti o mogućnostima koje su integrisane u libgdx, a koje nam mogu omogućiti da napravimo što bolji gameplay.