2016. július 20., szerda

Még egy kis app inventoros játék, remélem sokan bővítik

Igértem, hogy legközelebb is app inventor jön.

Célszerű az alaplépéseken túlesni, erre szerintem megfelelő az előző poszt. Megismerkedtünk már az app inventor felületével, ha minden igaz, már pattog a labdánk szépen. Lehet hogy valaki már azt is megcsinálta (sőt, biztos, még a poszt írása előtt), hogy belül egy mozgó dobozon is pattoghatnak a golyók, vagy változtatják a színüket, ha hosszan nyomjuk meg valamelyik gombot (longclikk esemény). Jó kis játék, de szeretnénk eme egyszerű eszközökkel csinálni valami látványosabbat. Az egyik diák (Sohár Attila) mutatott egy játékot a telefonján, egyből megtetszett, ezt egyszerű megcsinálni, és annó a mikrogépeken számtalan hasonló egyszerű kis játék futott. Sokkal könnyebb feladat, mint a tévéfoci megcsinálása, bár az sem olyan nagy ördöngösség. Azt a projektet azért ignorálom egyébként, mert annál kiütközött ennek az eszköznek egy komoly hiányossága, nem támogatja a multitouch-ot, mert a cél android rendszer túl régi, az még nem tudta ezt. Ezért is idegesít az, hogy bezzeg a telefonhívást belepakolták. Mindegy, ajándék lónak ne nézzük a fogát.

Tűzzük ki a célt.

Egy repülővel - én egy barna téglalappal helyettesítem - repülünk egyre lejjebb, és az alattunk levő oszlopokat próbáljuk eltüntetni, hogy nehogy nekik menjünk. Hajjaj, ez bonyolultnak tűnik.
Nem az.
Ha még emlékszünk a sprite-okra, akkor tudjuk, hogy figyelni tudják az egymásnak ütközésüket, van sebességük, irányuk, jobban belegondolva csak össze kell dobálni az elemeket, és készen is vagyunk. A legószerű programalkotás nagyon aranyos, de itt már lassan előjön a leírt programkód előnye. Nem is fogom lépésenként "lefotózni" most, én sem szeretek feleslegesen kattintgatni. (A jövő egyébként szerintem valami vegyes megoldás lesz, 3d-ben úszkáló objektumokkal...)

A design rész elkészítésére nem pazarlok helyet, azt megtettem már az előzőekben. Itt már használunk képi elemeket, azt az általunk kedvelt képszerkesztővel - windows alatt paint, én linux alatt pinta-t használtam, de ott van az ingyenesen elérhető, komoly tudású Gimp is mindkét rendszeren - készíthetjük el.



A bombánk alapesetben nem látható, csak a kép miatt tettem azzá. Gyanús, hogy nem a legutolsó változattal dolgozom most, ha kiderül, akkor majd cserélem az exportált fájlt.
Ugyanúgy mint a múltkor, a képernyőnkre dobozokat helyezhetünk el, amelyekbe belül vagy újabb dobozokat rakhatunk, vagy ha az illető dobozobjektumunknak más a "feladata", akkor "befelé" azt tesz, ami akar. Illetve amit az objektum készítője akart. Szövegdobozt még nem raktunk ki, pedig a legeslegelső appnak elvileg csak annyit kellett volna tartalmaznia, hogy egy szövegdobozba feliratot írunk egy gomb lenyomásakor, a hosszú lenyomáskor meg egy másik feliratot, pl azt, hogy hú de erős vagy ;). Szerintem ezt mindenki meg tudja már csinálni, ha nem, akkor majd leírom azt is nulladik lépésként egyszer. A szövegdoboz belsejébe nem más dobozokat, hanem szöveget rakhatunk.
Nekünk egy canvasra van szükségünk most, meg két gombra. Az objektumok elnevezése itt válik fontossá, már elég sokan vannak :D.
A nem látható objektumokat is tekinthetjük dobozoknak :D. Rájuk később térek ki.
Célszerű megnézni az objektumok tulajdonságait (property-k, adattagok), például a gombok lehetnek lekerekítettek is akár (shape/oval), tehetünk hátteret, változtathatunk a színeken, satöbbi.

A repülő

A repülőnk fenn kezd, az iránya 0 - emlékszünk, az a vízszintes irány -, be kell állítanunk a sebességét, innen csak annyi a dolgunk, hogy a szélnek ütközésnél vagy lejjebb megyünk, vagy ha a képernyő alján vagyunk, nyert a játékos. Ha egy másik objektumnak ütköztünk, akkor meghaltunk. Itt az ügyesek csinálhatnak robbanás effektet. (Egy sprite amit láthatóvá teszünk, esetleg egy hangfile lejátszása.)

A "bomba" 

Ha megnyomjuk a bombagomb-ot, akkor amennyiben nem látható - magyarul nem zuhan éppen -, akkor a repülő alá álltjuk be az x,y koordinátáit, az iránya 270 fok (lefelé), aztán csak sebességet kell beállítanunk neki. Onnan két esemény történhet vele. Vagy a képernyő aljának ütközik, vagy valamelyik oszlopnak. Ha a képernyő aljára ér (edgereached esemény), akkor láthatatlanná tesszük és kész, jöhet az újabb gombnyomás. Ha egy oszlopnak ütközik, akkor az ütközés eseménynél rendelkezésünkre áll a másik objektum neve. Így nem kell minden egyes oszlopra ugyanazt a parancssorozatot beírnunk. (Ez egy aránylag új lehetőség az app inventorban.)
Az oszlop magasságát csökkentjük. Ennyivel lejjebb is kell raknunk, mert a koordinátáink felülről lefelé "nőnek". Ha csökkentjük a magasságot, alulról fog hiányozni a megfelelő darab.
Sajna most sem tudom kihagyni a tanulságot :). Bármilyen alkalmazás készítésénél az egyik legfontosabb dolog a tesztelés. Minden eddigi kornak megvolt az aktuális megváltó csodaszere, ilyen volt annak idején a struktúrált programozási módszerek elterjedése, ide tartozik az OOP is természetesen, manapság a TDD (test driven development), vagyis a tesztelés központú fejlesztés az aktuális megmentő. Nem véletlenül alakulnak ezek ki, ne feledjük.
Az előbb rátekintettem a blokk nézetre, és a gyanúm beigazolódott. Nem a végleges változat van itt nálam, és nem is emlékszem hogy melyik diáknál van a legjobb, letesztelt példány. No de sebaj. Így marad, legalább kapok visszajelzést hogy hol van bug :). (Ha nem, akkor majd tesztelek, javítok magam, de jobban örülnék a visszajelzésnek.)

Térjünk át a blokkokhoz.

Az imént említettem a tesztelést. Sajna hiába pakoltuk a képernyőnk aljára az oszlopainkat, bizonyos telefonokon a levegőben lógtak. Úgyhogy meg kellett oldanunk ezt a problémát. A képernyőnkhöz is tartoznak események. Amire nekünk szükségünk van most, az az inicializálás.




A bombánk láthatóságát megszüntetjük, beállítjuk az oszlopok magasságát, és a canvas magasságát figyelembe véve mindet elhelyezzük alulra. A repülőnket a bal felső sarokba, az irányát jobbra, és kész is vagyunk. Ha valaki ügyes, megoldhatja, hogy minden ütközésnél megforduljon. (Hint: a bounce metódus pont ezt csinálja, csak az y koordinátát szintén lejjebb kell tenni.)

A startgomb lenyomásával indul a játék

Azért hogy elférjen a képen, kivettem a blokk aljáról elemeket, és mellétettem balra, természetesen vissza is helyeztem utána a helyére.





Ugyanazt megtesszük, amit az initnél is - igen, lehetne rá eljárást is írni és meghívni, így nem lenne duplikálás, javításnál nem kell két helyre figyelni, ha ez valakinek eszébe jutott, gratula ;) -, Mindegyik torony láthatóságát beállítjuk, ne feledjük el, hogy lehet hogy mindegyiket eltüntettük már...
A végén "sebességbe" tesszük a repülőnket, és indulhatunk is. Itt még illene a bombagombot is engedélyezni, illetve az indítás előtt letiltani, de mint említettem, szeretjük a hibákat. Most még. Hogy majd ne kövessük el őket élesben :D. No meg a start lenyomása előtt bombázhatunk így :D. Hiába persze, mert a torony visszaemelkedik aljas módon ;).

Három apró részlet.

Itt még az előbb az repülő.edgereached-nél nem volt ott az if. Azt hittem, hogy lementettem azt a képernyőképet, de úgy fest az kimaradt. Itt az volt a hiba, hogy alulra érve nem történt semmi. Az else ágban most csak annyi található, hogy megáll a repülőnk. Itt lehet új képernyőt nyitni, pontszámot növelni, ízlés szerint.
Itt lehetne megtenni azt amit fent említettem. Ha az x koordináta 5-re állítása helyett a repülő bounce metódusát hívnánk meg az edge-t paraméterként megadva, akkor visszafordulna..Érdemes kipróbálni. Akár be is lehet kérni, hogy így, vagy úgy viselkedjen. Nem bonyolult :D.

Ha a repülönk nekimegy valaminek, akkor most nemes egyszerűséggel bezárjuk az applikációnkat.

Ha lenyomjuk a  bomba gombot, akkor amennyiben nem látható, illetve nincs engedélyezve - tehát nem zuhan épp -, akkor berakjuk a repülő alá, beállítjuk az irányát - mit is jelent egy imagesprite-nál a rotate tulajdonság :D? -, sebességét, engedélyezzük, láthatóvá tesszük, és már mehet is :D.

Ha a bombánk leér (edgereached esemény), akkor megszüntetjük a láthatóságát, és nem engedélyezzük.

Mindjárt készen is vagyunk :).


Nem tudjuk, hogy melyik toronynak ütköztünk, de nem is érdekes, megkapjuk paraméterként, és kihasználva az új lehetőséget

hogy megjelent az anycomponent elem a programban, mivel bármelyik oszloppal ugyanazt kell tennünk, megtesszük azt.



A legalsó néhány elemet most is elmozgattam a helyéről, hogy elférjen a képen.
Először elimináljuk a bombát.
Ha az adott oszlop magassága nagyobb mint 20, akkor csökkentjük a magasságát, majd ugyanennyivel lejjebb toljuk.
Ha kisebb mint 20, akkor a hosszát nullára állítjuk, a láthatóságát megszüntetjük, ugyanúgy ez engedélyezettségét is. (Különben ütközne vele a repülőnk, hiába nem látszik.)

Kész is vagyunk :D.

Az importálható program itt található.
Ha nem működik, sikítsatok :D.

Nincsenek megjegyzések:

Megjegyzés küldése