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.