libgdx alapú program létrehozása, kép importálása, mozgatása libgdx alapok Android játékfejlesztés Soós András
Tartalom 1. Az első lépések... 1 2. Fontos beállítások a kezdés előtt... 3 3. A programkód... 4 4. Kép importálása, megjelenítése... 5 5. Kép mozgatása... 7
1. Az első lépések Előzetesen létrehoztuk a projektünket, minimum 3 package-t kell látnunk az Eclipse-ben, az első, aminek a nevében csak a projektünk neve vagy a projektnév-core szerepel, ebben fog helyet kapni a Java nyelven írt programkódunk. A projeknév-android package az androidos futtatáshoz szükséges, a projektnév-desktop pedig Jar fájlként futtatja a projektet. 1. ábra: Projekt beimportálva
2. Fontos beállítások a kezdés előtt Az android és desktop package-ben is fontos beállítani a OpenGL 2.0-t. Ezeken belül mindkét esetben az src-ben lévő osztályban igaz értéket adunk a cfg.usegl20 = false; sornak, ahogy a képeken is látszik: 2. ábra: Android OpenGL 3. ábra: Desktop OpenGL
A desktop-nál még tudjuk módosítani a felbontás nagyságát, ugyanez az adroidnál a készülék képernyőjétől fog függni. 3. A programkód A projekt létrehozásakor kapunk egy Hello World-höz hasonló programot amely egy képet jelenít meg amin rövid leírást/reklámot kapunk a libgdx-ről. Ennek nagy részére nincs szükségünk. A függvényeket megtartjuk, de azokon belül csak a render és create első két-két sorát hagyjuk meg. Ezen kívül az importoknál az import com.badlogic.gdx.graphics.gl10; sort átírjuk import com.badlogic.gdx.graphics.gl20;-ra. Később fontos lesz, hogy az OpenGl2.0-ás verzióját használjuk. Ezen kívül a render függvény második sorát (Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);) írjuk át ugyanilyen módon. 4. ábra: Programkód a felesleges sorok törlése után A create első két sora lekéri nekünk két változóba a kijelző magasságát és szélességét. A render első két sora egy fehér hátteret ad a megjelenített tartalomnak. Fontos tudni, hogy a create egyszer hívódik meg az osztály példányosításakor, a render pedig az előre beállított időközönként fut le, ezzel frissítjük a kijelzőt. A dispose-t pedig akkor hívjuk meg, amikor fel szeretnénk szabadítani a használt erőforrásokat.
4. Kép importálása, megjelenítése Az első feladatunk egy Texture létrehozása, ez fogja tartalmazni a képet, amelyet importálunk, szükségünk van még egy Sprite-ra, amely szintén a képet tartalmazza majd megjeleníthető és módosítható formában, ezen kívül szükségünk van a megjelenítéshez egy SpriteBatch-ra. SpriteBatch batch; Texture labda; Sprite labdasprite; A create függvényben példányosítjuk a változóinkat, és importáljuk a képet, amelyet előzetesen a projektnévandroid mappa assets almappájába helyeztünk. batch = new SpriteBatch(); labda = new Texture(Gdx.files.internal("labda.png")); labdasprite = new Sprite(labda); labdasprite.setbounds(w/2-100/2, h/2-100/2, 100, 100); Látható hogy a batch-t egyszerűen példányosítjuk. A labda nevű Texture változóba importáljuk a labda.png nevű képet, ami egy focilabdát ábrázol. A sprite-ot már ezzel a változóval példányosítjuk. Ezután a setbounds függvénnyel beállítjuk a méretét és a helyét. Az első két változó az x és y tengelyen is középre helyezi a képet, a második két változó a szélességét és a magasságát határozza meg a sprite-nak. Ezután már csak annyi a dolgunk, hogy a render-ben megjelenítjük a képet. batch.begin(); labdasprite.draw(batch); batch.end(); Ezt a batch segítségével a fent látható módon valósítjuk meg.
5. ábra: Végleges programkód 6. ábra: Lefuttatva desktop módban
5. Kép mozgatása Létrehozunk két float változót a sprite helyének tárolására. Legyen: float x, y; A create-en belül megadjuk neki a kezdőértéket, ez: x=w/2-100/2; y=h/2-100/2; Erre a pontra helyeztük korábban a képet. Ezután a renderen belül létrehozunk valamilyen megoldással egy input lehetőséget, mivel a legegyszerűbb desktop módban tesztelni a programot, és így lehetőségünk van billentyűzettel adatokat bevinni, irányítsuk a WASD gombokkal a képet. Ehhez a következő függvényre van szükségünk: if(gdx.input.iskeypressed(keys.w)){ y++; if(gdx.input.iskeypressed(keys.a)){ x--; if(gdx.input.iskeypressed(keys.s)){ y--; if(gdx.input.iskeypressed(keys.d)){ x++; Látható, hogy ha lenyomva tartjuk a négy gomb közül az egyiket, akkor a sprite x és y koordinátái változnak, így fel, le, jobbra és balra tud haladni a kijelzőn. A változáshoz szükséges még, hogy a változókat összekapcsoljuk a sprite-al, hisz eddig konstanst értéket állítottunk be a setbounds-al. A render függvénybe is teszünk egy setbounds függvényt a következő módon: labdasprite.setbounds(x, y, 100, 100); Ezzel készen is vagyunk, a gombok segítségével tudjuk mozgatni a képet. További lehetőségek egyike, amire majd egy tényleges androidot futtató eszközön is szükségünk lesz, a kijelzőn történő érintés helyét értelmezi: if(gdx.input.istouched()){ x=gdx.input.getx(); y=h-gdx.input.gety(); else{ x=0f; y=0f; Ezzel a megoldással egy érintés helyét tudjuk lekérdezni, amennyiben nincs érintés az adott időben, a változók értéke 0 lesz.