Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
i
Mobil programozás
D R
Nehogy már megint a mobilod nyomkodjon Téged!
Ed. Egyetemi jegyzet, verzió 1.0.9
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
ii
A FT
Copyright © 2009, 2010, 2011, 2012 Dr. Bátfai Norbert
D R
A tananyag a TÁMOP-4.1.2-08/1/A-2009-0046 számú Kelet-magyarországi Informatika Tananyag Tárház projekt keretében készült. A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósult meg.
Nemzeti Fejlesztési Ügynökség http://ujszechenyiterv.gov.hu/ 06 40 638-638
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
iii
COLLABORATORS TITLE : Mobil programozás NAME
DATE
SIGNATURE
WRITTEN BY
Bátfai, Norbert
2012. október 2.
Szakmai lektor
Mária Erika Bátfai
2012. október 2.
Nyelvi lektor
Ildikó Novák
A FT
ACTION
2012. október 2.
REVISION HISTORY
DATE
DESCRIPTION
NAME
0.0.1
2009. december 29.
Elkezdem a jegyzet készítését DocBook 5.0 ˝ XML-ben, a pályázati anyagomnak megfeleloen GNU FDL engedéllyel. Mivel a Kempelen Farkas ˝ Felsooktatási Digitális Tankönyvtár szokásos licence ennél szigorúbb, az anyagot még nem teszem ki és a legalnotice elemen belül, mindkét licencet említve, részletesen leírom a szituációt.
Bátfai
D R
NUMBER
0.0.2
2010. január 11.
Átírom DocBook 4.4-be és ebben folytatom, mert a teljesítéshez a Tankönyvtár lapján, a 2005-ös pályázathoz hasonlóan, a 4.4 verziót kérik.
Bátfai
0.0.3
2010. január 21.
Tartalomjegyzék fixálása, bevezeto˝ rész befejezése.
Bátfai
0.0.4
2010. február 5.
A 110% Nyári Kapitális OSE bemutatása, a Focijáték Neked NYFK foci szimulátorának leírása.
Bátfai
0.0.5
2010. március 6.
Maven projektek beillesztése, SourceForge és saját hp-s projektek belinkelése. UML ábrák beillesztése.
Bátfai
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
iv
REVISION HISTORY DATE
DESCRIPTION
NAME
0.0.6
2010. március 10.
Játékgráfok képeinek legenerálása, beillesztése. A dblatex nem tudta tördelni a táblázatokat, ezért kettessével csoportosítottam a képeket.
Bátfai
0.0.11
2010. március 15.
Maven és NetBeans projektként való felélesztés, saját horgászhelyes példa, két gépi játékosos ˝ módosítás, helyesírás-ellenorzés.
Bátfai
0.0.12
2010. szeptember 24.
Az USZT és az EU támogatási szövegének, logójának beillesztése.
Bátfai
0.0.14
2010. szeptember 26.
LEGO leJOS programozás részek beillesztésének megkezdése.
Bátfai
0.0.20
2010. október 1.
A 0.0.1 verziótörténeti bejegyzésnek megfelelo˝ részek kikerültek (bekommentezve). A focis játék továbbfejlesztéseivel kapcsolatos részek frissítve.
Bátfai
0.0.21
2010. október 3.
Átolvasás, nyelvi és szakmai lektoroknak kiadás. Képek méretének beállítása (a dblatex számára, az xsltproc-nak a parancssorban kapcsoljuk ki a skálázás figyelését). Az irodalomjegyzék átnézése.
Bátfai
D R
A FT
NUMBER
0.0.22
2010. október 6.
Feladatok külön kigyujtése ˝ a fejezetek végére.
Bátfai
0.1.2
2010. október 9.
Szakmai lektor javításainak átvezetése. További példák beillesztése a fejezetek végére.
Bátfai
0.1.3
2010. október 10.
Képek méretének további fimonítása a saját dblatex konverzióhoz (illetve néhány kép vágása). Apróbb hibák javítása. Kiadva a nyelvi lektornak.
Bátfai
0.1.4
2010. október 20.
˝ Ellenorzés, nyomtatás, majd kiadás a lektoroknak. Meta adatok (Dublin Core, Marc) elkészítése.
Bátfai
0.2.0
2010. december 1.
Lektori javítások bedolgozása.
Bátfai
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
v
REVISION HISTORY NUMBER
DATE
1.0.0
2010. december 1.
1.0.1
2011. január 6.
1.0.2
2012. március 23.
1.0.3
DESCRIPTION
NAME Bátfai
A kolofon módosítása (betéve colophon és legalnotice tagokba is).
Bátfai
˝ Elokészítés a szerzo˝ saját honlapjára történo˝ kitételhez. (A korábban a pályázatvezeto˝ beillesztette új logo átméretezése.) A DocBook ˝ készített közvetlen kimenetek: HTML XML-bol (xsltproc), pdf (dblatex), epub (dbtoepub).
Bátfai
2012. március 29.
Az aktuálisan választható feladatok bemutatása.
Bátfai
1.0.4
2012. április 11.
A városi hangya példa felélesztése és továbbfejlesztése. Ezzel párhuzamosan egy Androidos melléklet elkezdése, amelyben ennek a példának az ismertetése is zajlik majd. (Ennek a verziónak a megkezdésekor XML forrásban 472.780 leütés.)
Bátfai
1.0.5
2012. április 13.
A Városi hangya részletes (szimulátoros) bemutatása.
Bátfai
1.0.6
2012. április 14.
A Városi hangya részletes bemutatásának folytatása valódi telefonon.
Bátfai
D R
A FT
A beküldendo˝ kész könyv.
1.0.7
2012. április 15.
A Városi hangya tesztelése valódi telefonon.
Bátfai
1.0.8
2012. április 27.
A jegyzet evolúciója (ezt az összes TÁMOP könyvbe beillesztve).
Bátfai
1.0.9
2012. május 7.
A jegyzet környezetének bemutatása (egységesen az összes TÁMOP jegyzetemben).
Bátfai
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
vi
I
Tartalom menedzsment
1. A játékok felélesztése 1.1
A Java ME platform
A FT
Tartalomjegyzék
3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1
Konfiguráció és profil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.2
A játékok felélesztése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.1.2.1
A játékok letöltése forrásban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.1.2.2
A játékok felélesztése Maven projektben . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.1.2.2.1 1.1.2.3
A játékok felélesztése Maven projektben GNU/Linux alatt . . . . . . . . . . . . . .
9
A játékok felélesztése NetBeans környezetben . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2
A játékok új nyelvre fordítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3
A fejezet feladatainak összefoglalása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2. A játékok er˝oforrásainak lecserélése
2.2
21
Képek lecserélése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2.1.1
Új horgászhelyes portolás elkészítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2.1.2
Új focis portolás elkészítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
A fejezet feladatainak összefoglalása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
D R
2.1
II
1
Szoftverfejlesztés
11
3. A játékok továbbfejlesztése
13
3.1
A játékok szervezése, megírása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
3.1.1
A 110% Nyári Kapitális OSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3.1.2
A Focijáték Neked OSE bemutatása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
3.1.3
Az EM foci szimulátora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.1.3.1
A szimuláció el˝okészítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.1.3.2
A szimuláció futása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.1.4 3.2
Továbbfejlesztések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.1
3.3
A Hetedik Szem NYFK bitmintáinak elemzése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Két gépi játékos a foci játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
A fejezet feladatainak összefoglalása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
vii
4. A játékok portolása 4.1
Portolás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
4.1.1
Android platformos horgász . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
4.1.2
Teljes képerny˝os asztali alkalmazás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.1.3
Megvalósítás Java Appletként . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.1.3.1 4.2
Szurkolói avatárok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
A fejezet feladatainak összefoglalása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
MELLÉKLET
16
5. Funkcionális képerny˝oképek 5.1
A FT
III
20
18
Játék gráfok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
5.1.1
Funkcionális pillanatképek a 110% Nyári Kapitális NYFK játékból . . . . . . . . . . . . . . . . . . . .
1
5.1.2
Funkcionális pillanatképek a Focijáték Neked NYFK játékból . . . . . . . . . . . . . . . . . . . . . . .
3
5.1.3
Funkcionális pillanatképek a Hetedik Szem NYFK játékból . . . . . . . . . . . . . . . . . . . . . . . .
7
6. A Google Android platform
11
6.1
A GNU/Linux kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
6.2
Az Androidos API-k használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
6.2.1
A városi hangya . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
6.2.2
A városi hangya tesztelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Szimulátorban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.2.2.2
Telefonon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
A városi hangya forráskódjai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
D R
6.2.3
6.2.2.1
6.2.3.1
A VarosiHangyaActivity osztály . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.2.3.2
A VarosiHangyaItemizedOverlay osztály . . . . . . . . . . . . . . . . . . . . . . . . 20
6.2.3.3
A VarosiHangyaLocationListener osztály . . . . . . . . . . . . . . . . . . . . . . . 21
7. LEGO robotok Java programozása 7.1
7.2
23
LEGO© NXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
7.1.1
Els˝o leJOS osztályaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
7.1.2
Kormányzott autó viselkedésekkel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
7.1.3
Bluetooth alapú távirányító . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
7.1.3.1
A BTHelloNXT osztály . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
7.1.3.2
A BTHelloPC osztály . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
A fejezet feladatainak összefoglalása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
viii
IV
Irodalomjegyzék
13
7.3
Idézetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7.4
Szórakoztató ismeretterjesztés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7.5
Programozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7.6
Mobil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.7
Gyerekeknek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.8
Foci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.9
Tudat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.10 Robotok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Tárgymutató
D R
8
A FT
7.11 Futball . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
17
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
ix
Ábrák jegyzéke
A FT
6.1. Az Android SDK letöltött API-jai. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
6.2. A Városi hangya projekt létrehozása. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
6.3. Milyen célplatformra fejlesztjük az alkalmazást? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
6.4. A VarosiHangyaActivity megadása. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
6.5. Az alkalmazás és a térkép ikonja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
6.6. Egy AVD beállítása. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
6.7. A Városi hangya példa a szimulátorban, éppen a DEIK új épületének tetején állok. . . . . . . . . . . . . . . . . 10 6.8. Az alkalmazás aláírásának megkezdése. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 6.9. A tanúsítványt tartalmazó kulcskészlet kitallózása. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 6.10. A tanúsítványhoz tartozó nyilvános kulcs alias-ának megadása. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 6.11. A telefonra tölthet˝o elkészült apk fájl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6.12. GPS koordináták megadása a szimulátorban. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 6.13. A geo fix 21.638818 47.549482 parancs eredménye. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.14. Tesztelés a Motorola Milestone készüléken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
D R
6.15. Tesztelés az LG Optimus 2X készüléken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.16. Tesztelés egyszerre a két készüléken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
x
Táblázatok jegyzéke
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A FT
2.1. Pillanatkép a most elkészített Saját horgász játékból
4 5
2.3. A „saját ” labdarúgó futásának keretei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.4. A „ellen ” labdarúgó futásának keretei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
5.1. A 110% Nyári Kapitális NYFK induló splash képerny˝oje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
5.2. A 110% Nyári Kapitális NYFK Névjegy parancsának részlete . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
5.3. Csalizás a 110% Nyári Kapitális NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
5.4. A 110% Nyári Kapitális NYFK játék horgászhelye . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
5.5. Halradar és kapás a 110% Nyári Kapitális NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
5.6. A 110% Nyári Kapitális NYFK játék horgász vásznán elérhet˝o parancsok . . . . . . . . . . . . . . . . . . . . .
3
5.7. A madárdal ki-/bekapcsolásának lehet˝osége a 110% Nyári Kapitális NYFK játékban . . . . . . . . . . . . . . .
3
5.8. A splash képerny˝o a Focijáték Neked NYFK játékban
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
5.9. A 110% Nyári Kapitális NYFK játék induló képerny˝ore helyezett parancsai . . . . . . . . . . . . . . . . . . . .
4
5.10. Saját játékos labda technika, játékérzék és gyorsaság értékei Focijáték Neked NYFK játék foci szimulátorában
.
4
. . . . . . . . . . . . . . . . . . .
5
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
5.13. Ki-kivel játszik az aktuális sorsolás szerint a Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . . .
5
5.14. Olasz-brazil mez˝onyjáték a Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
5.15. Az aktuális olasz-brazil mérk˝ozés statisztikái Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . .
6
5.16. Új mérk˝ozés: indul a svéd-angol a Focijáték Neked NYFK játék VB-jének valóságában
. . . . . . . . . . . . .
7
5.17. Egy angol szöglet Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
5.18. Egy védés a német-amerikai meccsen Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . . . . . .
8
5.19. Tizenegyes párbaj Focijáték Neked NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
5.20. A Hetedik Szem NYFK játék indulása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
5.21. A Hetedik Szem NYFK grafikus vászonra rajzolt menüje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
5.22. A Hetedik Szem NYFK vásznának parancsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
5.23. A tudat-lenyomatok vizsgálata a Hetedik Szem NYFK játékban . . . . . . . . . . . . . . . . . . . . . . . . . .
9
D R
2.2. Pillanatkép egy kisebb kijelz˝oj˝u szimulátorban a Saját horgász játékból . . . . . . . . . . . . . . . . . . . . . .
5.11. A Focijáték Neked NYFK játékban a telefon kamerája is fontos szerepet kap 5.12. Indul egy mérk˝ozés Focijáték Neked NYFK játékbeli VB-n
5.24. A tudat-lenyomatok vizsgálatának megjelenítése a Hetedik Szem NYFK játékban . . . . . . . . . . . . . . . . . 10
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xi
A példák listája . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
A FT
A megjegyzések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A MIDlet osztály . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Az API doksi használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Szoveg.java állományok szervezése . . . . . . . . . . . . . . . . . . . . . . . . . . A Parancs.java állományok szervezése . . . . . . . . . . . . . . . . . . . . . . . . . . A játékot vezérl˝o szál elkészítése és elindítása a KapitalisMIDlet.java állományban A játékot vezérl˝o szál elkészítése és elindítása a FociMIDlet.java állományban . . . .
D R
1.1 1.2 1.3 1.4 1.5 3.1 3.2
. . . . . . .
. . . . . . .
. 3 . 5 . 6 . 19 . 19 . 4 . 5
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xii
Ajánlás
D R
A FT
Gyerekeimnek: Bátfai Mátyás Bendegúznak, Bátfai Margaréta Niobénak, Bátfai Nándor Benjáminnak és az érdekl˝od˝o hallgatóimnak. Viszont, ha szeretnél csatlakozni a Debreceni Fejleszt˝oi Hálózathoz, akkor Neked, mivel a közösségépítés igényével is írtuk, kötelez˝o olvasmány!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xiii
D R
A FT
Bevezetés
A FT Kivonat
Ebben a bevezet˝o részben
• megismerkedünk a „Nehogy már...” könyvek koncepciójával • áttekintjük a feldolgozott mobil Java játékprogramokat
• vázoljuk a játékok oktatásban való felhasználásának használati eseteit
• végül röviden bemutatjuk a szerz˝ot és a játékokat megnyitó cégét, az Eurosmobilt.
D R
s ezek mellett azt is megtudjuk majd, hogy egyáltalán miért is írta meg a szerz˝o ezt a könyvet.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
i
„Minden számítógép-pedagógus tudja a világon, hogy játékokkal kell kezdeni.” —Marx György [MARX]
Nehogy már... „Több er˝ofeszítést fektetünk a tervezésbe és kódolásba (ami szórakozás), hogy csökkentsük a jóval költségesebb tesztelést és hibajavítást (ami nem az).” —Kernighan-Plauger [KERNIGHANP] A programozás magasiskolája
A FT
A Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] cím˝u könyv megírásakor arra törekedtem, hogy népszer˝u stílusban adjak át legalább annyira mély információkat, melyekkel felvértezve az olvasó különösebb er˝ofeszítés nélkül tudja elkészíteni els˝o, saját mobiltelefonos programjait. Ezt persze azzal is segítem, hogy a könyvben tárgyalt forráskódok nem csak a tárgyalt részleteikben, hanem külön projektekként (azaz a teljes kódokat és a program más er˝oforrásait is tartalmazóan) elérhet˝oek. Hét Java ME és három Google Android projektet tekint át a könyv. Az el˝obbieknél tisztán tudtam alkalmazni a KernighanRitchie klasszikus [KERNIGHANC] C könyvében megismert módszert, hogy minden program egy korábbi továbbfejlesztése. Az Androidos példáknál még elég bug-os volt az akkor még csak szimulált platform, ezért futotta csak három (a Java ME-s résszel szimmetrikus) projektre1 .
A Nehogy már a mobilod nyomkodjon Téged! könyv példáinak letöltése.
D R
A könyv megírása óta számos kurzusban használtam már fel a könyv példáit, tipikusan a Hetediket, az e közben felhalmozódó tapasztalataim azt mutatják, hogy a könyvvel kit˝uzött célt sikerült megvalósítanom: a hallgatók (sokszor még olyanok is, akik nem vagy alig rendelkeztek Java programozási ismeretekkel) sikeresen készítették el saját mobil játékukat és sikerélményük volt! Olvasnál még róla? Olvass! A könyv megvásárolható vagy megrendelheto˝ a
Sziget Egyetemi Könyvesboltban: Debrecen Egyetem tér 1, 52 512 900/22185,
[email protected] . Továbbá kölcsönözheto˝ a Debreceni Egyetem Egyetemi és Nemzeti és az Informatikai Kar könyvtárában.
Nehogy már megint...
A jelen Nehogy már megint a mobilod nyomkodjon Téged! cím˝u könyv az imént említett folytatásaként készül, így megtehetjük, hogy a Java ME platform alapjait csak röviden említjük és a feldolgozást a megnyitott Java játékok feldolgozására fókuszáljuk.
Az írás során arra törekszünk, hogy az olvasó valamilyen szinten könnyen „magáévá tudja tenni” a feldolgozott projekteket. Ezeket a szinteket a következ˝oképpen, a [REVOLUTION] cikkünkben is ismertetett, nehézségük szerint növekv˝o rendbe szedve, az alábbi módon szervezzük meg: 1 Konkrétan a frame alapú animáció API szint˝ u használata nem m˝uködött a specifikációnak, példáknak megfelel˝oen. (A jelen jegyzetben elkészítjük az említett Androidos NehogyMar4 példát.)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
ii
• A játék projektek felélesztése: IDE független Maven projektek formájában, vagy a NetBeans integrált fejleszt˝oi környezetben a Java források lefordítása, a telefonra tölthet˝o állományok elkészítése, majd (adott esetben) telefonra töltése. • A játék felületének új nyelvre fordítása. Itt már a Java forrásokba kell nyúlni, de nem kell mást tenni: csupán megadni a szerepl˝o szövegek fordításait. • A játékban szerepl˝o kép és hang er˝oforrások lecserélése. Például készítesz néhány fotót saját horgászhelyedr˝ol, majd a horgász játékbeli helyet lecseréled erre. Itt még nincs programozási feladat, hanem csak képeket kell szerkeszteni egy arra alkalmas programmal, mondjuk a Gimppel. • A játék Java forrásainak módosítása, portolása. Ez esetben már programozol. Egyszer˝ubb esetben, a horgászos példánál maradva, a saját horgászhelyedet jellemz˝o halakat állítod be. Nehezebb feladat pedig mondjuk az lehet, ha a játékot egy új platformra, mondjuk a Google Android platformjára portolod.
A jegyzet környezete
A FT
• Bonyolultabb feladat, ha a játékot egy új platformra, mondjuk a Google Android platformjára portolod.
Ez a könyv több társával együtt finomodik, s ennek alapján együttesen egy egységesnek tekinthet˝o környezetet alkotnak meg, amelyben egymás példáit, gyakorlatait háttértudással, know-how-al támogatják, de számos esetben megalapozzák vagy tovább fejlesztik egymás feladatait. Ebbe a szóban forgó környezetbe tartozónak tekinthetjük a következ˝o jegyzeteket: • Bátfai Norbert: Programozó Páternoszter http://www.inf.unideb.hu/~nbatfai/ProgramozoPaternoszter.pdf, [PP].
• Bátfai Norbert, Juhász István: Javát tanítok, Bevezetés a programozásba a Turing gépekt˝ol a CORBA technológiáig http://www.tankony hu/tartalom/tkt/javat-tanitok-javat, [?]. • Bátfai Norbert: Mobil programozás, Nehogy már megint a mobilod nyomkodjon Téged! http://www.inf.unideb.hu/~nbatfai/konyvek/MOBP/mobp.book.xml.pdf (ez a jelen könyv). • Bátfai Norbert: Mesterséges intelligencia a gyakorlatban: bevezetés a robotfoci programozásba http://www.inf.unideb.hu/~nbatfai/konyvek/MIRC/mirc.book.xml.pdf, [?]. • Bátfai Norbert: Párhuzamos programozás GNU/Linux környezetben: SysV IPC, P-szálak, OpenMP http://www.inf.unideb.hu/~nbatfai/konyvek/PARP/parp.book.xml.pdf, [PARP].
D R
• Bátfai Norbert: Programozó Páternoszter újratöltve: C, C++, Java, Python és AspectJ esettanulmányok http://www.inf.unideb.hu/~nbatfai/konyvek/PROP/prop.book.xml.pdf, [PROP]. • Bátfai Norbert: Paternoster of Programmers Reloaded: C, C++, Java, Python and AspectJ Case Studies http://www.inf.unideb.hu/~nbatfai/konyvek/POPR/popr.book.xml.pdf, [POPR]. Az említett jegyzetekben sok a közös téma. Egy példát említve: robotfoci csapat építésével foglalkozunk a MIRC könyvben Java alapon, C++ alapon a PROP könyvben, de a csapat párhuzamos m˝uködésének szervezése a PARP könyvbe is bekerült. Ez természetesen nem azt jelenti, hogy a MIRC könyv robotfocit bevezet˝o részét duplikáltuk a többiben, hanem arra csak hivatkozunk, hiszen az összes szóban forgó könyv szabadon elérhet˝o. A példánál maradva ez azt is jelenti, hogy egy adott csapat csak egy adott jegyzetben szerepel tételesen kidolgozva. A könyvek között a leger˝osebb kapcsolat a PP és a PROP illetve a PP és a PARP könyvek között van. Hiszen el˝obbi már címében is annak újrafogalmazása. Ám az eredeti PP-ben nem volt például kernel programozás, a PROP több más, de immár nagyobb esettanulmány mellett immár ilyen részeket is tartalmaz. A PP er˝os volt párhuzamos programozásban, ezt az irányt er˝osíti fel a PARP. Nézzük itt például a Mandelbrotos méréseket! A PARP-ban nem foglalkozunk az algoritmussal, azt megismerhetjük a JT könyvb˝ol.
Annyit még megjegyezhetünk, hogy a PP csak informális jegyzet volt, a JT már valódi TÁMOP könyv, de mindkett˝o fejlesztése jóideje be van fagyasztva. El˝obbi azért, mert számos helyen hivatkozunk fix oldalszámaira, utóbbit pedig gyakorlatilag nem volt lehet˝oség módosítani. A mostanában elkészült (MOBP, MIRC) illetve most készül˝o aktív (PARP, PROP, REPP) könyveket folyamatosan tervezzük karban tartani. Ha máshogy nem lenne lehetséges akkor akár úgy is, hogy duál licencelve forkolunk bel˝ole és az open source (GNU FDL) változatot tartjuk karban a továbbiakban. A direkt redundáns részeket tehát igyekeztünk elkerülni a könyvekben, de például ez a pont kivételt képez, ezt egy az egyben megjelentetjük az aktív szerkesztés˝u MOBP, MIRC, PARP és PROP könyvekben is.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
iii
A jegyzet környezetének kvintesszenciája
A MOBP Java ME platformon er˝os, de piacot figyelve (például a Gartner elemzéseit olvasva, vagy végzett hallgatóink munkaer˝opiaci visszajelzéseire alapozva) folyamatosan er˝osítjük majd az Android szerepét. A MIRC egyrészt a robotfociba ad egy bevezetést, másrészt a Java platformon történ˝o munkát alapozza meg némi valódi feladatokba oltott Maven-JUnit-AspectJ gyakorlattal a konkrét Java alapú csapatok tekintetében. A PARP könyv a klasszikusok (például OpenMP) mellett számos további párhuzamos programozási paradigmába (például NVIDIA CUDA vagy Hadoop Map-Reduce) ad konkrét tapasztalatokat mellékletként, de legizgalmasabb vonása a debreceni szuperszámítógép használata!
A megnyitott játékok
A FT
A PROP könyv számos kisebb-nagyobb esettanulmányt tartalmaz, melyek közül a leginkább a szóban forgó környezetünkbe ill˝oek a C++ alapú RCSS robotfoci csapatok, amelyekre akár már a további, például a mesterséges intelligencia tárgyak is effektíve ráépülhetnek.
A 2008-as Év Informatikai Oktatója VISZ díj átvételekor tett bejelentésnek 2 megfelel˝oen, a szerz˝o doktori (phd) értekezése kapcsán, 2010 elején az Eurosmobil megnyitotta néhány piaci ciklusát már bejárt játékának: egy horgász, egy foci és egy ezoterikus játékának forrását.
A könyv szervezése: horgászat, foci, ezoterika
A jelen könyvet három konkrét megnyitott játék ismertetése nyomán szervezzük meg. Ezek a 110% Nyári Kapitális NYFK ( 110% Summer Capital OSE - egy horgász játék) a Focijáték Neked NYFK ( Soccer Game 4u OSE - egy foci játék) és a Hetedik Szem NYFK ( Seventh Eye OSE - egy ezoterikus közösségi játék). Nyílt forráskód
D R
A Java forrásokat és a különböz˝o er˝oforrásokat (képek, MIDI fájlok) a GNU GPL v33 licenc engedélye alatt tettük közzé, illetve párhuzamosan e jegyzet írásával, éppen ehhez a könyvhöz készítettük: • A Kapitális sorozat a horgászat élményét adja a mobilodon. Adott kiadástól függ˝oen úszós, fenekez˝o vagy úszós és fenekez˝o készséggel horgászhatod meg privát tavadat. MIDI-ben (Musical Instrument Digital Interface) készített, életh˝u, akár cseng˝ohangnak is használható (de azért kikapcsolható) madárdal szórakoztatja játék közben a horgászt. A 110% értelmezése a realisztikusabb horgászat, hogy például a könnyebb szerelékkel felkínált csalit is felveszi a hal, de aztán a fárasztásnál közben ez a vékonyabb zsinór elszakadhat, a vékonyabb horog eltörhet stb. A játékbeli horgászhely bármikor újratelepíthet˝o, 5 különféle méret˝u zsinórt, 6-féle el˝okét, 17-féle csalit kombinálhatsz a szereléskor. 2 Az említett díj elnyerésében a bejelentésnek nem volt szerepe, csak a díjátadó szülte figyelmet használtuk ki arra, hogy ezt a bejelentést megtegyük.
.
3A
licenc magyar fordítása be van linkelve ugyanerre a http://gnu.hu/gplv3.htm lapra.
[PHD]
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
nyari-kapitalis-1_0_0-project.zip
A FT
iv
D R
• A focis sorozatunk tagjai a foci élményét, a csapat játék irányításának élményét adják a mobilodon. Ezek a programok foci szimulátorok, amelyekkel a labdarúgást a telefon billenty˝uivel u˝ zhetjük. Ennek megfelel˝oen egy csapatot 10 játékos, a telefon 0-9 gombjáig reprezentálta játékos alkot. A program megjelenése 2.5D. A játékban fotókat készíthetsz a telefon kamerájával a labdarúgókról, illetve át is nevezheted o˝ ket. A játék menetét az átadás orientált játék jellemzi. A találkozók 10 percesek, van szöglet, s adott esetben 11-es párbaj. Akár játék közben is váltva a 3x3x3, 3x4x2, 4x3x2, 2x3x4 felállásokba tudod a játékosaidat szervezni.
focijatek-neked-1_0_0-project.zip
• A Hetedik Szem sorozat tagjai a relaxáció és fantáziálás élményét adják a mobilodon. A mobil használata itt különösen indokolt, hiszen egy billenty˝uzettel az ölében a játékos nem tud relaxálni. A mi terminológiánkban ez a program egy „szabad akarat szonda”, ami mentális ujjlenyomatot tud felvenni a játékostól. A játék ötletét Kornhuber és Libet a tudatosság és az id˝o kapcsolatának vizsgálatában szerzett eredményei ihlették [Libet] , [Kornhuber] . Nálunk az akaratlagos mozgást az jelenti, hogy a játékos megnyomja a t˝uzgombot egy a 2048 egymást követ˝o 100 milliszekundumos id˝oszelet során vagy sem. Ennek megfelel˝oen a játék által felvett tudatlenyomat 2048 bites.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
hetedik-szem-1_0_0-project.zip
A FT
v
Mindhárom fenti archívum egy tömörben is elérhet˝o: javacska-one-1_0_0-projects.zip. Szerepelnek továbbá egyéb LEGO NXT robotos Java források is, ezek elkészítésénél úgy jártunk el, hogy a forrásokat önmagából ebb˝ol a könyvb˝ol másoltuk be és próbáltuk ki, így nem lehet majd gondod a példák kipróbálásánál, ha követed az utasításainkat. A nyílt forrású kibocsátás el˝ott a játékokon átalakításokat végeztünk, de természetesen úgy, hogy közben funkcióikból nem, vagy alig veszítettek. Az átalakítás célja az volt, hogy ne portolásokat, hanem egyetlen, könnyen karbantartható kiadást adjunk a közösségnek. Ezeknek a kiadásoknak a neveit az „NYFK” (nyílt forráskódú kiadás, open source edition, azaz röviden OSE) részszóval láttuk el.
D R
Jávácska ONE A megnyitott forrásokat nem csak e könyv fent belinkelt mellékleteként érheted el, hanem megtalálod a Javacska ONE (Jávácska ONE) projekt név alatt a nyílt forrású fejlesztések anyahajóján, a SourceForge.net portálon, illetve a szerzo˝ saját lapján is megvan mindhárom játékból egy speciális kiadás: mindhárom helyen (tehát a jelen könyv mellékleteként, a SourceForge-on és a szerzo˝ lapján) Maven projektek formájában vannak közzé téve a játékok. Az elso˝ esetben a hozzáadott érték nyilván triviálisan maga ez a könyv, a második esetben a közösség: a levelezési lista, a fórum, a verziókövetés, hibakövetés stb. A harmadik esetben (azaz a szerzo˝ honlapján) pedig számos speciális ˝ Checkstyle, CPD Report, FindBugs, JavaDocs, JDepend, PMD riport is kikerült a Maven projektek mellé (a következok: ˝ ezeket magad is automatikusan legenerálhatod a mvn site Report, Source Xref, Tag List, persze a Maven projektekbol paranccsal). • A Javacska One (Jávácska One) a SourceForge-on. • A mailman-es levelezési lista a SourceForge-on. • A 110% Nyári Kapitális NYFK, 110% Summer Capital OSE a szerzo˝ honlapján. • A Focijáték Neked NYFK, Soccer Game 4u OSE a szerzo˝ honlapján. • A Hetedik Szem NYFK, Seventh Eye OSE a szerzo˝ honlapján.
A könyvhöz mellékelt forrásokról Jelen könyv minden forrásfájl csipetének sorait megszámoztuk és a könyv szövegében számos helyen hivatkozunk ezekre a számokra, ezért fontos, hogy a források ne változzanak. Ez persze egy teljesíthetetlen kritérium! Ami azért ˝ forrásoesetünkben természetesen feloldható: a könyv mellékleteként belinkelt (azaz a Tankönyvtár lapjairól elérheto) kat soha nem fogjuk változtatni, a szerzo˝ lapjain ritkán és esetlegesen, a SourceForge-on pedig állandóan változhatnak a források, lévén, hogy itt élnek, itt fut a verziókezelo˝ rendszer, itt tartjuk karban a forrásokat.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
vi
A jegyzet evolúciója ˝ ˝ Jegyzetünk egy informatikai jegyzet, ezért alaptermészete a sok online eroforrásra történo˝ hivatkozás, amelyek ido˝ ˝ tellik) folyamatosan karbantartunk egy legfrissebb verziót: vel változnak, így a szerzo˝ honlapján (ahogy eronkb ol http://www.inf.unideb.hu/~nbatfai/konyvek/, ahol nemcsak ezt, hanem az összes jegyzetünket gondosan gondozni igyekszünk.
A játékok gondozása, felhasználása az oktatásban ˝ Hálózat Debreceni Fejlesztoi
D R
A FT
Nem elegend˝o csupán a források megnyitása, kell egy hordozó közösség, amelynek tagjai a projekteket gondozzák. Az általunk tervezett egyetemi fejleszt˝o közösség gerincét a nemrégiben elindított Debreceni Fejleszt˝oi Hálózat Debrecen Developer Network, DDN képezi.
A DDN célja egy széles hallgatói bázisra alapozott egyetemi szoftverfejleszt˝oi közösség kialakítása és fenntartása. Íme, az ábra alapján, a DDN legegyszer˝ubb használati esetei: az érdekl˝od˝o hallgatók jelentkeznek, mert égnek a vágytól, hogy bekapcsolódjanak egy érdekes fejlesztésbe. A diákok els˝osorban megfelel˝o egyetemet, a fejvadász cégek munkatársai pedig gyakorlott hallgatókat keresnek. Jelen pillanatban már ez az önkéntes szervezet a hallgatókkal való szakmai kapcsolattartásom (fejlesztésekbe való bekapcsolódás, diplomamunka téma választása, stb.) alapja. Hogyan lehetek DDN tag?
Ez az egyetem érdekl˝od˝o hallgatóinak tipikus els˝o kérdése. A belépés szabályozása folyamatosan változik. Jelen pillanatban három lehet˝oség közül választhatsz. • Beküldöd a Nehogy már a mobilod nyomkodjon Téged! könyv NehogyMar7 Java ME példájának és az Androidos NehogyMar3 példájának olyan felélesztését, melyben a saját képeidet használod. • Valamelyik Jávácska kupára sikeres istállót alakítasz, azaz olyan istállót, hogy az általatok irányított autó legalább három kört képes megtenni a kupa szabványos pályáján. • Elkészítesz egy szurkolói avatárt, azaz feldolgozol egy labdarúgó mérk˝ozést, ami alapján egy (a Relax NG kompakt szintaxisa szerint megadott nyelvtannak megfelel˝o) érvényes XML állományt készítesz.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
vii
Mobil programozás Egy szélesebb közösséget képeznek a mindenkori Mobil programozás cím˝u kurzus hallgatói, mert tulajdonképpen ennek a labornak a jegyzeteként szolgál a könyv. Egyetemünkön ez tipikusan a programtervez˝o informatikus BSc szakon futó INDV331L, INAV331L és T_I3789L kódú tárgy. • A kurzus egyik fóruma az API portál Bátfai Norbert tanítványai alportálján itt található. • Egy további témát indítottunk a DE Informatikai Karának hivatlos fórumán ezen a címen. A beadandó feladat
A Mobil programozás laboron a félév teljesítésének feltétele, hogy az alább felsorolt feladatokból egyet elkészítesz.
A FT
A választható feladatok listája a következ˝o:
• Egy megnyitott játék továbbfejlesztése. Néhány elképzelhet˝o és izgalmas konkrét fejlesztési célt soroltunk fel ebben a belinkelt pontban. • Egy megnyitott játék portolása.
• Egy megnyitott játék továbbfejlesztése.
• Egy megnyitott játék szerveroldali továbbfejlesztése. Értékelés
A félévben gyakorlati jegyet kell szerezni! Nullától tíz pontig értékeljük a fejlesztésre szánt, munkaórában számított id˝ot, a játékba kódolt játékélményt és a felhasznált API-t. A Mobil programozás laboron kialakult gyakorlat szerint az összpontszám a 3 * játékélmény + 2 * API + munkaóra alapján adódik. A Java EE szerveroldai munkával további plusz pontok szerezhet˝ok. Nézzünk néhány használati esetet, hogy hányast fogsz kapni? • Jelest kaptam: dolgoztam rajta 10 órát, a játékélmény tovább javult, így szerényen eléri a 10 pontot, további „extra” API-kat nem is használtam: ez pontszám alapján (3*10 + 2*4 + 10 = 48) tipikusan elég volt egy jeleshez.
D R
• Jót kaptam: az el˝oz˝o esethez képest a játékélményt valamelyest lerontottam, például 3*8 + 2*4 + 10 = 42.
• Közepest kaptam: ha a játékélmény iménti lerontása mellett csak fele annyit dolgozok, az a hármas környékére pozícionál: például , például 3*8 + 2*4 + 5 = 37. • Elégségest kaptam: ha durván elrontom az élményt és alig dolgozok vele, akkor a kettesnél járok.
• Akad elégtelen osztályzat is, ami azért meglep˝o egy választható tárgynál...
A pontos ponthatárok félévenként változnak, az elmúlt félévben az alábbi határok voltak érvényben: • 45 ponttól jeles, • 38 ponttól jó,
• 30 ponttól közepes,
• 22 ponttól elégséges.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
viii
Lehetséges „házi” vagy órai feladatok listája
A listázott feladatokat egy-egy szóval abból a szempontból jellemezzük, hogy milyen jelleg˝u munkát igényel a kidolgozásuk, illetve a megoldás részletesen-tételesen megtalálható-e a jelen jegyzetben. • A játékok felélesztése Maven projektben (jelleg: telepítés, szoftverismeret, kidolgozott). • A játékok felélesztése NetBeans környezetben (jelleg: telepítés, szoftverismeret, kidolgozott). • A játékok felületének új nyelvre fordítása (jelleg: nyelvi fordítás, nem kidolgozott). • Saját horgász játék elkészítése (jelleg: fotózás, képszerkesztés, szoftverismeret, kidolgozott). • Saját foci játék elkészítése (jelleg: filmezés, képszerkesztés, szoftverismeret, nem kidolgozott).
A FT
• A foci játék új csapattal b˝ovítése (jelleg: programozás, nem kidolgozott). • Két gépi játékos beprogramozása (jelleg: programozás, kidolgozott).
Továbbá minden fejezet végén bemutatunk újabb feladatokat. Ezeket (az általunk vélt) nehézségük szerint 1-20 pontig pontozzuk. • Az els˝o fejezet feladatai (játékok felélesztése).
• A második fejezet feladatai (er˝oforrások lecserélése).
• A harmadik fejezet feladatai (a játékok továbbfejlesztése). • A negyedik fejezet feladatai (a játékok portolása).
• A hatodik fejezet feladatai (LEGO robotok Javában). Jávácska Kupák
D R
Az elmúlt félévben jó tapasztalatokat szereztünk azzal, hogy a beadható feladatok listáját LEGO NXT robotok Java, azaz leJOS programozási feladatokkal b˝ovítettük. Ezt a lehet˝oséget a továbbiakban is fenntartjuk az alábbiak szerint. A Jávácska Kupában, a Kiterjesztett Jávácska Kupában, vagy a Központosított Jávácska Kupában saját istállóval induló hallgatók külön elbírálás alapján szerezhetik meg a labor érdemjegyét. Az említett kupák egy LEGO robotos autóverseny platform részei, egyel˝ore tesztfutamok alapján tudsz képet alkotni róluk. • Jávácska Kupa, Debreceni Egyetemi Nagydíj, 1. tesztelés • Jávácska Kupa, Debreceni Egyetemi Nagydíj, 3. tesztelés • Jávácska Kupa, Debreceni Egyetemi Nagydíj, 5. tesztelés • Jávácska Kupa, Debreceni Egyetemi Nagydíj, 7. tesztelés Ennek megfelel˝oen a jegyzet mellékleteként részletesen foglalkozunk a LEGO robotok Java programozásával, amivel azt is elérjük, hogy a jegyzet a Magasszint˝u programozási nyelvek 2 kurzusban is felhasználható legyen egy el˝oadás részlet és kétnégy laborfoglalkozás erejéig. Egy tipikus félév heti bontásban
1. A mobil fejlesztési platformokat, az aktuális mobil piaci trendeket, a Java ME és az Android platformot részletesebben bemutató bevezet˝o el˝oadás levetítése, megbeszélése. Otthoni feladat: a kapcsolódó megadott könyv és internetes szemelvények elolvasása. Laborfeladat: A Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] els˝o rész feladatai közül az els˝ot˝ol a hatodikig, azaz a NehogyMar1- NehogyMar6 Java ME példáknak a kipróbálása.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
ix
2. A Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] els˝o rész hetedik NehogyMar7 Java ME példájának és az Androidos NehogyMar3 példájának kipróbálása. Otthoni feladat: a két példa egyikének módosítása. Például saját szprájtok és csempézett háttér alkalmazása, esetleg a háttér mozgási irányának megváltoztatása, vagy függ˝oleges mozgatási irányba b˝ovítése. Fontos, hogy a megoldás során csak olyan kép (és bármilyen más, például hang) er˝oforrásokat használhatsz fel, amelyek kapcsán szerz˝oi jogi kérdések nem merülnek fel. Tehát például írásos anyagot tudsz bemutatni, ami engedélyezi egyetemi kurzusokon, hallgatói dolgozatokban, munkákban történ˝o felhasználásukat. 3. A jelen jegyzet Jávácska ONE játékainak felélesztése Maven projektben, illetve NetBeans környezetben. Otthoni feladat: a következ˝o laborra saját horgászhely fotózása. 4. Saját horgász játék elkészítése 5. LEGO NXT robot és Java ME JSR 82 alapú Bluetooth kommunikációs példa bemutatása.
A FT
6. Saját szabadon választott továbbfejlesztés vagy portolás megbeszélése, a feladat kit˝uzése, elfogadása. 7. A választott saját feladat fejlesztése. 8. A választott saját feladat fejlesztése. 9. A választott saját feladat fejlesztése.
10. A választott saját feladat fejlesztése.
11. A választott saját feladat bemutatása, értékelése. (Ha nem rendelkezel a szükséges készülékkel, akkor a DDN lehet˝oségei szerint a labor rendelkezésére bocsájtja a megfelel˝o eszközt.) A bemutatóról videó-dokumentáció készítése a laboron. (A kamerát a DDN lehet˝oségei szerint a labor rendelkezésére bocsájtja. ) 12. A választott saját feladat bemutatása, értékelése. A bemutatóról videó-dokumentáció készítése a laboron. 13. A választott saját feladat bemutatása, értékelése. A bemutatóról videó-dokumentáció készítése a laboron.
14. Érdemjegyek lezárása, rögzítése. Az utolsó labor végével bezárul az ajtó bármiféle javítási próbálkozás el˝ott, tehát dolgozz a félév közben! A választható feladatok aktualizálása
D R
A jegyzet fejlesztése 2009-ben indult, már abban az évben megindult a nagy földindulás a mobiltelefóniában: megjelent az Android, amely hasonló utat látszik bejárni, mint amint azt a Java ME tette, de a folyamat sokkal gyorsabb. A 2011-es év harmadik negyedévében már 52 százalék fölött van a rendszer a világszerte eladott mobilok tekintetében. Ismert ez a Gartner adat azok el˝ott, akik folyamatosan figyelik ezeket, általában az IT vezet˝ok figyelmére számot tartó jelentéseket. S érdemes is, hiszen itt látszik, hogyan feszülnek egymásnak azok az informatikai tektonikai lemezek, amelyek a Symbian leáldozását, az Android és az iOS el˝oretörését hozták. Utóbbinál például 15 százalékot láthatunk, meggy˝oz˝odésem, hogy ez nem is mehet 20 fölé. Miért? A Pareto, vagy „80-20” szabály (miszerint a társadalom javainak 80 százalékát annak 20 százaléka bitrokolja) miatt, amit naívan úgy értelmezek, hogy a „gazdagok” nincsenek többen 20 százaléknál. S ez a rendszer éppen ezt a réteget célozza meg. De ha már elmozdultunk a számmisztika felé, az Objective-C nagy TIOBE indexbeli megugrását is a rendszer népszer˝uségének köszönheti, amely érezhet˝oen szívja magába a fejleszt˝oket. Lényeg a lényeg, hogy az eddig f˝oleg Java ME alapú feladat-csokrunkon színesítenünk kell. Ezért az alábbi alternatív feladatokat kínálom fel a laborra, amivel szofisztikáljuk a továbbra is Java ME alapú megoldásainkat, illetve új területekre is elkalandozunk. 1. Egy szabadon választott JSR 257 alapú fejlesztés. Ehhez tudok néhány NFC matricát és Nokia 6212 classic készülékeket biztosítani. 2. Egy a Bouncy Castle csomagot használó Java ME kliens˝u, Java EE szerver˝u hibrid kriptorendszeres demó alkalmazás fejlesztése, amelyben a kliens és a szerver szimmetrikus titkosítást használva kommunikálnak, miután az ehhez szükséges szimmetrikus kulcsot egy asszmetrikus módszerrel megosztották. 3. Fejleszd tovább úgy a Google MAPs alapú városi hangya példa alkalmazást, hogy legyen benne útvonaltervezés.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
x
4. A hetedik Szemet készítsd el iwiw kisalkalmazásként, cél, hogy lehessen köré olyan közösséget építeni, amelyben az ismeretségeket a tudatlenyomatok hasonlósága alapján lehet kötni. 5. A robotfoci Qt C++ alapú eszközeit módosíts, hogy azok tudjanak sport tudományi eredményeket bemutati és alkalmazni a robotfoci mérk˝ozésekre. Példaként az rcsslogplayer ide linkelt módosítását mutatjuk be. A jegyzet végén adunk további segítséget a közölt feladatok megoldásához, lesz amelyikhez csak szöveges segítséget, de olyan is, amelyhez teljes forráskódokat mutatunk be. Magas szint˝ u programozási nyelvek 2
A FT
Egyetemünkön belül a legszélesebb közösséget képeznek a mérnök informatikus BSc szakon futó Magas szint˝ u programozási nyelvek 2 cím˝u (INBK302E, INBK302L) kurzus hallgatói, mert a mérnökök számára a mobil programozás, LEGO robot programozás külön hangsúlyt kap. Ezért a jelen jegyzet (bár nem olyan részletesen programozott formában, mint azt a Mobil programozás esetén teszi) támogatást nyújt ehhez a tárgyhoz is az alábbiak szerint. Javasolt használati esetek néhány labor erejéig
• Az els˝o laboron fordítsuk le a RobotCarRacing osztályt! Második feladatként a névtelen osztályok használata helyett írjuk át úgy a forrást, hogy minden viselkedés külön fordítási egységbe, azaz külön forrásba kerüljön és legyen egy „main jelleg˝u” további osztály. Végül b˝ovítsük a forrásokat „debug” System.out.println("Megy viselkedés");
utasításokkal és figyeljük a tégla kijelz˝ojét!
• A félév els˝o felében dolgozzuk fel a Bluetooth alapú LEGO robot távirányító példát.. Ezt teljes kidolgozással támogatjuk a LEGO mellékletben. • A félév második felében dolgozzunk ki egy esettanulmányt valamelyik Jávácska Kupára. Ezt részlegesen támogatjuk a LEGO mellékletben.
D R
HTML, XML
Ugyancsak egyetemünkön belül, bár egy vékonyabb közösséget képeznek a programtervez˝o informatikus BSc szakon futó HTML, XML cím˝u (INDK202L) kurzusom hallgatói. A jegyzet a focis játék „továbbfejlesztése” kapcsán korlátozottan itt is használható néhány labor erejéig. Javasolt használati esetek a szurkolói avatárokkal kapcsolatban
• Az els˝o laboron validáljunk le néhány szurkolói avatárt! Második feladatként élesszük fel a Public Resource Football Computing projektet és validáljuk ezzel a szurkolói avatárokat! • A félév DocBook XML 5.0-ban összefoglalandó feladatait a foci iránt érdekl˝od˝o hallgatók szurkolói avatáros feladatokkal kiválthatják, helyettesíthetik. • Az [KAVATAR] cikk alapján az RDF-be (Resource Description Framework) konvertált szurkolói avatárjaikat SPARQL végpontunkon keresztül a szemantikus web részévé tehetik.
Játékgráfok A mellékletben felvillantjuk a játékok tipikus képerny˝oképei közül a leggyakoribbakat, s két képenként néhány mondatos megjegyzéseket is f˝uzünk a pillanatfelvételekhez. Így részletesebb bepillantást kaphatsz a játékokba, könnyebben el tudod dönteni, melyikkel szeretnél foglalkozni.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xi
˝ ol ˝ A szerzor
A FT
Bátfai Norbert 1996-ban szerzett programozó matematikusi, majd 1998-ban kitüntetéses programtervez˝o matematikusi oklevelet a Debreceni Egyetemen. 1998-ban megnyerte a Java Szövetség Java Programozási Versenyét. Bátfai Erikával közös mobil információtechnológiai cége, az Eurosmobil [EUROSMOBIL], második helyezést ért el 2004- ben a Motorola JavaJáték Versenyén, ugyancsak az Eurosmobil 2004-ben a Sun és a Nokia közös Mobil Java Fejleszt˝oi Versenyén a „Ha hívsz, támadok!” (H.A.H) hálózati ( Java EE szerver, Java ME kliens) játéksorozattal els˝o díjat nyert. A mobil játékfejlesztés elmélete és gyakorlata és a kék (JSR 82) játékok címmel el˝oadott az Eurosmobillal a Sun Java Fejleszt˝oi Konferencián 2005-ben. Társszerz˝oje a Fantasztikus programozás [J] cím˝u ismeretterjeszt˝o kalandregény sorozatnak, illetve a 2007-ben megjelent Javát tanítok [JT] digitális szakkönyvnek. Szerz˝oje e könyv el˝odjének, a Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] cím˝u könyvnek. Közel 10 évig volt a Debreceni Egyetem Informatikai Kar, Alkalmazott Matematika és Valószín˝uségszámítás Tanszékének munkatársa. Jelenleg ugyenezen a karon, az Információtechnológiai Tanszék egyetemi tanársegéde. Oktatási tapasztalata az alábbi el˝oadásokon: Magas szint˝u programozási nyelvek 2, Operációs rendszerek, Operációs rendszerek 2; illetve az alábbi tárgyak gyakorlatain alapul Java esettanulmányok, J2SE hálózatok, Java appletek, CORBA, Programozás, Hálózatok, Formális nyelvek és automaták, Algoritmuselmélet, Bevezetés az informatikába, Operációs rendszerek, Alkalmazások fejlesztése WWW-re, XML-HTML, Objektumorientált programozás a középiskolában, Mobil programozás, Internettartalom menedzsment, Tartalomszolgáltatás, Magas szint˝u programozási nyelvek 2. A VISZ (Vezet˝o Informatikusok Szövetsége) a 2008-as évben az Év Informatikai Oktatójának választotta.
D R
2011-ben szerzett PhD doktori fokozatot informatikából. Jelen pillanatban a Debreceni Egyetem Információtechnológiai Tanszékének adjunktusa. Érdekl˝odése most a gépi tudatosságra irányul [?]. 2012-ben Pollák-Virág díjat kapott A Debreceni Egyetem labdarúgást szimuláló szemináriumának bemutatása cím˝u cikkért [DEIKFOCI] a Hírközlési és Informatikai Tudományos Egyesülett˝ol.
Miért is írom ezt a könyvet?
A prózai ok magától érthet˝od˝o: egy pályázat, a TÁMOP 4.2.1 pályázat keretében írom, amiért megfizetnek. Van számos további motivációm, amiket talán érdemes megemlíteni, mert nem nyilvánvalóak. Az egyik például, hogy az élesben 2010 januárjában elinduló Debreceni Fejleszt˝oi Hálózat (röviden csak DDN) helyi népszer˝uségének növekedésével egyre több hallgató keres fel érdekl˝odéssel, a csatlakozás szándékával. Mint minden egyetemi fejleszt˝oi közösség, a DDN is er˝osen épít a hallgatók között önszervez˝odéssel kialakuló, laza mentori hálózat szervez˝o és tanító erejére: mert ha mindenki csak rám akar csatlakozni, az már néhány hallgató után is a diák-tanár, oktató-hallgató vagy fejleszt˝o-fejleszt˝o jelleg˝u kapcsolatok min˝oségének rovására menne. A jelen könyv tartalmi kialakításával is a DDN hálózat életképességét szeretném szerény mértékben javítani. Mire gondolok pontosan? Amikor az egyetemre kerültem, akkor azokban a közösségekben, amelyekbe mindenki természetesen bekerül (kollégiumi szoba, szakon belüli tanuló közösség, barátok stb.) természetes volt a mémek cseréje. Ennek tipikus eszköze, hogy ki milyen könyvet olvasott, milyen filmet látott, s akinek hiányossága volt, az a szorgalmi id˝oszakban (sok esetben szívesen) bepótolta azokat. Tehát ennek a könyvnek az írása során igyekeztem olyan információkat, hivatkozásokat, szemléletmódot belesz˝oni a könyv testébe, ami el˝osegíti a közös informatikai mém készlet, azaz egy olyan közös mentális felület kialakítását, ami er˝osebben összeköthet minket mint leend˝o fejleszt˝o vagy oktató kollégákat. Ezért a DDN tagoknak, ahogyan a bevezet˝o lapon említettem, a könyv fellapozása kötelez˝o! Tehát, akinek az alábbi listából van pótolnivalója, annak irány a könyvtár és a videó-kölcsönz˝o! Láttad például
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xii
• a Kapcsolat mozi [KAPCSOLAT1], • vagy a What the #$*! Do We (K)now!? Mi a csudát tudunk a világról? mozi [KVANTUM1] filmeket? Ha igen, akkor az jó kezdet, de nem sokat ér, ha nem olvastad o˝ ket könyvben is! Olvastad hát • a Carl Sagan: Kapcsolat [KAPCSOLAT2] • vagy a Penrose-Hawking: A nagy, a kicsi és az emberi elme cím˝u [KVANTUM2] könyveket?
A FT
Kötelez˝o mozik, olvasmányok 1. Ha a fent említett kultúrából még nem fogyasztottál, akkor a doksi szellemében [Hacker] pótold ezen hiányosságaidat!
A lektorokról
Bátfai Mária Erika a jegyzet szakmai lektora. 1997-ban szerzett magyar nyelv és irodalom tanári, majd 1998-ban finn tanári és informatikus könyvtárosi oklevelet a Debreceni Egyetemen.
D R
Az Eurosmobilban Bátfai Mária Erika vezette a szóban forgó (megnyitott és a jelen jegyzetben tárgyalt) játékok tesztelését.
Novák Ildikó a jegyzet nyelvi lektora. 1996-ban szerzett angol középiskolai tanári és informatikus könyvtáros oklevelet a Debreceni Egyetemen. ˝ A szakmai lektor vélekedése a könyvrol
A könyv sokak által közkedvelt témájú, megnyitott forrású játékokon át (horgászat, foci, ezotéria) játszi könnyedséggel vezeti be olvasóját a mobilprogramozba. Eközben szinte észrevétlenül érinti a f˝o alapfogalmakat (pl. CLDC, JSR, MIDP, API) és az alapvet˝o programozási környezeteket (Marven, NetBeans). Mellékleteként az összes részletesen kommentált forrás elérhet˝o, amelyek így a könyv mellett mintegy járulékos segítséget adnak.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
xiii
Külön kiemelend˝o, hogy a szerz˝o egyaránt támogatást nyújt a GNU/Linux és Windows környezetben történ˝o fejlesztéshez; valamint a játékok portolását nem csupán egy-egy telefonra, hanem adott esetben másik platformra például asztali gépre és böngész˝oben/alkalmazásként futtatható Appletre is elkészíti vagy megint csak adott esetekben teljes képerny˝os PC-s játékhoz vagy a Google Android platformjához ötletet ad, iránymutatást nyújt. A könyv olvasása után akkor is mobilt szeretnék programozni, ha egyébként eszembe sem jutott volna – és sikerülni is fog. ˝ A nyelvi lektor vélekedése a könyvrol
D R
A FT
Korábban a focit, a horgászatot, az ezotériát, csakúgy, mint a programozást csupa unalmas tevékenységként tartottam számon. Ezt a könyvet elolvasva azonban mind a négy tevékenységhez kedvet kaptam, hiszen Bátfai Norbert könyve olyan gyakorlatias megközelítésb˝ol tárja elénk a mobilprogramozás rejtelmeit, hogy egy laikus is késztetés érez a kipróbálására. Közvetlen nyelvezetével, könnyen követhet˝o útmutatásaival és b˝oséges példáival minden segítséget meg is kapunk ehhez.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
1 / 19
rész I
D R
Tartalom menedzsment
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
2 / 19
D R
A FT
Ebben a részben megtanuljuk, hogyan élesszük fel a megnyitott játékokat: mi módon készítsük el bel˝olük a valódi telefonra tölthet˝o fájlokat. Illetve megnézzük, hogy milyen saját változatokat tudunk készíteni bel˝olük azzal a feltétellel, hogy a Java forrásprogramokat még nem módosítjuk, hanem csupán a játékok kép- és hanger˝oforrásait, esetleg a felhasználói felületük nyelvét változtatjuk meg.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
3 / 19
1. fejezet
D R
A FT
A játékok felélesztése
A FT
Kivonat
Ebben a fejezetben a Java ME platform rövid bemutatása után felélesztjük a játékokat és segítséget adunk ahhoz, hogyan töltsd o˝ ket fel valódi mobiltelefonodra. Ennek megfelel˝oen ebben a fejezetben
• áttekinted a CLDC, MIDP, JSR, API fogalmakat
• bemelegítésként felidézzük a korábbi „Nehogy már...” könyv forrásainak szerkezetét • letöltheted a könyvhöz mellékelt megnyitott játék-projekteket • megismered, hogyan kell Maven projektként
• illetve NetBeans környezetben feléleszteni a megnyitott játékokat
D R
• végül meglátod, hogyan készíthetsz más nyelv˝u portolásokat a megnyitott játékokból.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
„By 2012, 80 percent of all commercial software will include elements of open-source technology.” —Gartner [Gartner] Gartner Highlights Key Predictions for IT Organisations and Users in 2008 and Beyond
1.1.
A Java ME platform „The GNU General Public Licence is the most popular and most widely used Free Software licence. The special thing about this licence is that it’s a copyleft licence, that is to say: all versions of the program must carry the same licence. So the freedoms that the GNU GPL gives to the users must reach all the users of the program. And that’s the purpose for which I wrote it.” —Richard Stallman [Stallman] Free and Open Source Java stallman3.ogg
1.1.1.
A FT
A Java ME programozó API programozó, azaz programja írása során egy olyan világban, esetünkben egy olyan objektum orientált világban mozog, amelyet az API dokumentáció (a továbbiakban csak API doksi) ír le. Programjának elkészítése során, f˝oleg eleinte, folyamatosan olvasnia kell az API doksit, hogy tudja használni, hogy jól megismerje azt a világot, amelyben le kell írnia programját. Az API doksi választ ad az olyan egyszer˝u kérdésekre, hogy milyen csomagok, objektumok, interfészek, metódusok vannak a világunkban, vagy a kicsit kifinomultabb kérdésekre, hogy ha származtatunk egy osztályból, akkor az osztály mely tagjait kell implementálnunk, akár üres testtel is, hogy sikerrel le tudjuk fordítani a programunkat.
Konfiguráció és profil
D R
A Java ME platform kapcsán két alapvet˝o fogalommal kell megismerkedned, ezek a fogalmak a konfiguráció és a profil. Természetesen ezen a platformon is Java nyelven fogalmazza meg szándékát, akaratát a programozó. A konfiguráció, esetünkben a Connected Limited Device Configuration (CLDC), a virtuális gép minimális tulajdonságait és a core API-t határozza meg. El˝obbire példa az a kérdés, hogy tud-e a virtuális gép lebeg˝opontos számokkal dolgozni, azaz használható-e a nyelv float vagy double típusa? Utóbbira példák az e platformbeli a java.lang vagy java.util csomag osztályai lehetnek.
A platform (esetünkben a Mobile Information Device Profil, MIDP) a konfigurációt egészíti ki további API-kkal, például a HTTP hálózatkezelést, a perzisztens tárolást vagy a felhasználói felületet absztraháló API-kat tartalmazza. De számos, a programozó szempontjából fontos API van, ami nem része a MIDP profilnak. Ezeket a specifikációkat külön JSR (Java Specification Request) dokumentumokban fejlesztik és rögzítik. Ha például a Java programodból akarsz Bluetooth kapcsolattal dolgozni, akkor olyan telefonnal kell tesztelned, ami megvalósítja a JSR 82 API-t, azaz implementálva van benne a Java APIs for Bluetooth. Tehát maga az, hogy a telefon egy Bluetooth készülék, nem elég, egy JSR 82 készülékre lesz szükséged ebben az esetben. A gyakorlatban a legtöbb olvasó a saját telefonja kapcsán fog találkozni a JSR-ekkel: célszer˝u a készülék megvásárlása el˝ott szétnézni a gyártó lapjain, például, ha Nokia készüléket szeretnél, akkor a Fórum Nokia megfelel˝o lapjain.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
2 / 19
fontos A CLDC, MIDP és általában a JCP-n (Java Community Process) belül életre kelt JSR dokumentumok csak specifikációk, olyan készüléket vásárolj, ami megvalósítja azokat a szabványokat, vagy a szabványok azon verzióit, amelyre szükséged van!
Olvasnál még róla? Olvass! • A Java API doksinál megszokott, frames böngészheto˝ MIDP API doksiban ismerkedhetsz meg ennek az objektumorientált rendszernek a szerkezetével: a csomagokkal, osztályokkal, interfészekkel. • A MIDP specifikáció.
A FT
˝ o˝ tagja, a Nehogy már a mobilod nyomkodjon • Királyi út nincs, ám itt a gyorstalpaló: ennek a könyvsorozatnak az eloz Téged! címu˝ könyvem.
Nincs Java csapda ˝ nyílt forráskódban fejlesztenek Javában, de saját munkájuk egy zárt kódú rendVoltak, akik aggódtak, hogy ugyan ok ˝ függve csapdába eshet. Ezeket az aggályokat oszlatta el végleg, hogy a Sun 2006 novemberében mindhárom szertol Java kiadás kódját megnyitotta a GNU GLP v2 licenc hatása alatt (ugyenez a licenc védi a GNU/Linux kernelt is). Ennek ˝ megfeleloen a következo˝ három reinkarnációban él tovább az említett három kiadás. • Java ME – phoneME (Mobile & Embedded) • Java SE – OpenJDK
D R
• Java EE – GlassFish
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
3 / 19
Example 1.1 A megjegyzések Vegyük fel a fonalat! A következ˝o néhány példában idézzük fel a Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] könyv els˝o, bevezet˝o forrását! A megnyitott források is ehhez a kódhoz hasonlóan lesznek bekommentezve, de a fájlokat kezd˝o megjegyzés hosszabb, mert magának a GNU GPL v3 licenc szövegének az iránymutatását követve itt helyeztük el a licencre utaló megjegyzésrészt is. A fejlesztés során törekedtünk betartani a Java kódolási konvencióit és természetesen neked is ezt ajánljuk. Az osztály forrása egy (az állomány nevét megadó és azt általánosan jellemz˝o) megjegyzéssel indul. 2 3 4 5 6 7 8 9 10 11
/* * NehogyMar1MIDlet.java * * Bátfai Norbert: Nehogy már a mobilod nyomkodjon Téged! *
[email protected] * oforrásokat, * Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó er˝ * például képeket) letöltheted a http://www.eurosmobil.hu/NehogyMar/ ol. * címr˝ * */
FT
1
Ezt egy olyan speciális megjegyzés követi, ami bekerül az osztály dokumentációjába. Ezt a tipikusan böngészhet˝o dokumentációt a javadoc programmal vagy néhány kattintással magával a NetBeans környezettel generálhatod le. Ha továbbfejlesztesz egy osztályt, akkor ne felejtsd el hozzáadni a saját author tagodat és növelni a version tag értékét. 13 14 15 16 17 18 19 20
/** o programozási példája, bemutatja a * A könyv els˝ * MIDlet osztály használatát: a MIDlet objektumok * életét irányító startApp(), pauseApp() és * destoyApp() metódusok használatát. * * @author Bátfai Norbert,
[email protected] * @version 0.0.1 */
A
12
R
Olvasnál még róla? Olvass! ˝ ˝ a csoportmunka. Ha már láttál Fejlesztoként Te már egy olyan környezetben fogsz dolgozni, melynek alapjellemzoje olyan forrást, amit több különbözo˝ kommentezési stílust, egyéni szokást felvett programozó is karbantartott, akkor nem ˝ ismeretlen elotted az a tapasztalat, hogy a kommentek csinosítgatásával megy el az elso˝ néhány óra... Nos, ezért jó, ha egy nyelvhez vannak rögzített konvenciók: ajánlások, amik rögzítik, hogyan nevezd el az osztályaidat, azok metódusait, a változókat, hogyan kommentezd a forrásodat stb. • A Java kódolási konvencióit itt böngészheted,
D
• vagy letöltheted például egy pdf könyv formájában. ˝ egyszeru˝ publikus • Királyi út nincs, ám itt a gyorstalpaló: a belinkelt dokumentumok végén nézd meg a szereplo, osztály példájának forrását!
˝ ˝ • Arról, hogyan tudod jól kihasználni a javadoc lehetoségeit, példákkal boven fuszerezve ˝ itt olvashatsz.
Mi minden forrásunk esetén a GNU GPL v3 licenc használatát jelz˝o alábbi - például éppen a KapitalisVaszon.java forrásból kivágott - megjegyzést f˝uzzük a fájlok elejéhez. Minden esetben a forrás korábbi életéb˝ol származó verziótörténetb˝ol is meghagytunk valamennyit, mert történeti szempontból ez még érdekes lehet.
20 21 22 23 24
/* * KapitalisVaszon.java * * Bátfai Norbert: Mobiltelefonos játékok tervezése és fejlesztése * Doktori (PhD) értekezés, Debreceni Egyetem, Informatikai Kar,
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
4 / 19
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
Copyright (C) 2010, Bátfai Norbert This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see
.
Ez a program szabad szoftver; terjeszthet˝ o illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 3-as, akár (tetsz˝ oleges) kés˝ obbi változata szerint. Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz. A felhasználónak a programmal együtt meg kell kapnia a GNU General Public License egy példányát; ha mégsem kapta meg, akkor tekintse meg a
oldalon.
Dokumentáció: készül a "Nehogy már megint a mobilod nyomkodjon Téged!" cím˝ u egyetemi jegyzet. F˝ o célja a megnyitott források kapcsán a Debreceni Egyetem Informatikai Karának Mobil programozás laborját támogatni. A jegyzet DocBook XML-ben készül, továbbá a "Nehogy már a mobilod nyomkodjon Téged!" cím˝ u könyv folytatásának szánjuk, további információk majd a szerz˝ o honlapján: http://www.inf.unideb.hu/~nbatfai -------------------------------------------------------------Motorola E398, V300 2004. 2005. 2005. 2006. 2010.
szept. 4. dec. 24., Téli Kapitális dec. vége, Úszós febr. 28, 100% Horgászat febr. 4. - OSE
D
70
Információtechnológia Tanszék, http://www.inf.unideb.hu/~nbatfai/phd/
FT
27
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
A
26
R
25
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
--- Ragadozó Fenekez˝ o-ból a Téli Kapitális-b˝ ol úszós ----- 102Nyari_NOK403rd_240, 2007.02.11 EUROSMOBIL Játék- és Alkalmazásfejleszt˝ o Bt. http://www.eurosmobil.hu Bátfai Norbert Verziótörténet: 0.1.0 start 0.1.1 kapásjelz˝ o helyett úszó a téliben 0.1.2 2006.01.02, portolások el˝ otti átnézés, takarítás 0.1.3 MIDlet.megvan()-ba téve a mindKifogva vizsgalat (csak halfogaskor) 0.1.4 100% Horgászat: HÚZ-TEKER fárasztás (bot animáció - is könnyen lehetne, de most ←-
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
5 / 19
87 88 89 90 91
nincs) 2006.05.28, 102% Kapitális, vékonyabb damillal, kisebb horoggal is felveszi a * 0.1.5 csalit, majd a farasztasnal esetleg leakad stb. * 2010.02.10, OSE, Maven projekt * 0.2.0 * */
Example 1.2 A MIDlet osztály A forrásokban tartózkodunk az importálásoktól, ezért tipikusan a teljes csomagnévvel min˝osítve írjuk az osztályok neveit, azaz a szóban forgó forrás tekintetében a MIDlet osztály el˝ott a tartalmazó csomagnevet is szerepeltetjük, esetünkben tehát a javax.microedition.lcdui csomagnévvel min˝osített MIDlet osztályból származtatunk. 22 23 24 25
public class NehogyMar1MIDlet // Kiterjesztjük a MIDlet osztályt: extends javax.microedition.midlet.MIDlet // Figyelünk majd parancsokra: implements javax.microedition.lcdui.CommandListener {
A FT
21
Következnek a példánytagok, például programunk kilépés (softkey) gombját a javax.microedition.lcdui.Command osztálybeli kilepesGomb objektum reprezentálja majd. 25 26 27 28 29 30 31 32 33
D R
34
/** A mobiltelefon kijelz˝ ojét reprezentáló objektum. */ javax.microedition.lcdui.Display mobilKijelzoje = javax.microedition.lcdui.Display.getDisplay(this); /** A Kilépés gombot reprezentáló objektum. */ javax.microedition.lcdui.Command kilepesGomb = new javax.microedition.lcdui.Command("Kilépés", javax.microedition.lcdui.Command.EXIT, 20); /** Egy "karatkeres" képerny˝ ot reprezentáló objektum. */ javax.microedition.lcdui.Form karakteresKepernyo;
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
Example 1.3 Az API doksi használata Itt emlékeztet˝oül azt emeljük ki, hogy az API doksinak megfelel˝oen az ott protected módosítóval jelölt startApp(), pauseApp() és destroyApp() metódusokat implementáltuk a saját MIDlet osztályunkban. 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
Alig néhány (az eseménykezeléssel kapcsolatos) sor maradt ki a korábbi Nehogy már a mobilod nyomkodjon Téged! [NEHOGY] könyv bevezet˝o forrásából, ami mindössze a Kilépés gomb megnyomásának kezelésére, de ezt elég unalmas lenne megismételve tárgyalni, ezért térjünk is rá a megnyitott forrásokra.
D R
63
/** Mit tegyek én (this, azaz az aktuális MIDlet objektum) * ha elindítottak? */ public void startApp() { // Elkészítek egy "karakteres" képerny˝ ot karakteresKepernyo = new javax.microedition.lcdui.Form("Nehogy már a"); // aminek a címe az, hogy "Nehogy már a" // Erre a "karakteres" képerny˝ ore pedig ráteszek egy // szöveges elemet, ami két részb˝ ol áll karakteresKepernyo.append(new javax.microedition.lcdui.StringItem("Nehogy már a", "mobilod nyomkodjon Téged!")); // Legyen a kijelz˝ on az imént készített // "karakteres" képerny˝ o látható! mobilKijelzoje.setCurrent(karakteresKepernyo); // Legyen a "karakteres" képerny˝ on a Kilépés parancs! karakteresKepernyo.addCommand(kilepesGomb); // Aztán, ha kattintanak rajta, akkor majd // én (this, azaz az aktuális MIDlet objektum) // reagálok erre a commandAction() viselkedésemben. karakteresKepernyo.setCommandListener(this); } /** Mit tegyek én (this, azaz az aktuális MIDlet objektum) * ha futásom közben jön egy SMS, vagy hívja valaki a * tulajomat? */ public void pauseApp() { } /** Mit tegyek én, ha futásomnak vége... */ public void destroyApp(boolean unconditional) { }
A FT
34
1.1.2.
A játékok felélesztése
„Tapasztalatunk szerint a program min˝oségének legjobb kritériuma az olvashatóság: ha egy program könnyen olvasható, valószín˝uleg jó; ha nehezen olvasható, valószín˝uleg nem jó.” —Kernighan-Plauger [KERNIGHANP] A programozás magasiskolája
Ha ki akarod próbálni a könyvben tanultakat, vagy egyszer˝uen csak futtatni akarod a könyv játékait a mobilodon, akkor is le kell töltened a forrásokat, a források által használt és megszervezett er˝oforrásokat és ezekb˝ol el kell készítened a telefonra tölthet˝o állományokat! 1.1.2.1.
A játékok letöltése forrásban
Letöltési alternatívák ˝ A megnyitott játékok elérésére számos további alternatív lehetoséget tudunk ajánlani, ezeket a Jávácska One tippben ismertettük részletesen.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
Minden játékot külön zip fájlba csomagoltunk, az archívumon belül megtalálod a Java forrásfájlokat az src/main/java könyvtárban és a kapcsolódó, szüksége er˝oforrásokat a src/main/resources könyvtárban. • nyari-kapitalis-1_0_0-project.zip • focijatek-neked-1_0_0-project.zip • hetedik-szem-1_0_0-project.zip Kérdés, hogy a NetBeans környezetet vagy a Maven-t használod (azaz tulajdonképpen IDE független vagy)? • A NetBeans használatának esetére a korábbi: a Nehogy már a mobilod nyomkodjon Téged! cím˝u könyv leírja, hogyan tudsz egy új projektet elkészíteni, de készítettem egy rövid filmet is, amit ebbe a vetítésbe ágyazva találsz meg.
1.1.2.2.
A FT
• A Maven használata esetén nem kell mást tenned, mint a mvn package parancsot kiadnod és a telefonra tölthet˝o állományok automatikusan elkészülnek. (Ezzel az esettel kapcsolatban további részleteket találsz a projektek gyökerében a README.txt fájlokban.) A játékok felélesztése Maven projektben
Néhány képerny˝okép felvillantásával Linux és Windows alól is beizzítjuk a Maven projekteket. A 110% Nyári Kapitális NYFK installálása Windows alatt
1. Els˝o lépés a Maven beszerzése és beállítása: töltsd le a projekt lapjáról! Itt én most a apache-maven-3.0-alpha-6-bin. zip állományt választottam. 2. A letöltött állományt a c:\Users\Norbi\Prg\apache-maven-3.0-alpha-6\ könyvtárba csomagolom ki.
D R
3. Beállítom ennek megfelel˝oen az M2_HOME és az M2 változókat, illetve módosítom a PATH-ot az alábbiak szerint. Az M2_HOME változót a kicsomagolt c:\Users\Norbi\Prg\apache-maven-3.0-alpha-6\ könyvtárra, az M2-t ennek a bin könyvtárára, az elérési utat pedig frissítem ugyancsak a kicsomagolt bin könyvtárával. Fontos, hogy a JAVA_HOME is legyen beállítva, ennek kapcsán további infót találhatsz a korábbi „Nehogy már...” könyvben, de elég annyi, hogy ránts le egy JDK-t és állítsd a könyvtárára a JAVA_HOME és ennek bin-jével b˝ovítsd az elérési utat!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
8 / 19
4. Miután az imént látott módon, az mvn -version parancs kiadásával meggy˝oz˝odtem arról, hogy a Maven beállításaival minden OK, lefordíthatom a saját projektünket. Ezt a Jávácska One tippben ismertetett címr˝ol rántom le például, majd kicsomagolgatva belépek, megint csak például a horgászos projekt c:\Users\Norbi\Documents\NehogyMarMEGINT\ nyari-kapitalis-1.0.0\ könyvtárba gyökerébe. Ahol nincs is más dolgom, mint a C:\Users\Norbi\Documents\NehogyMarMEGINT\nyari-kapitalis-1.0.0>mvn package
parancsot kiadni, miután is a projekt elkészül, s a telefonra tölthet˝o állományok a target, tehát a c:\Users\Norbi\ Documents\NehogyMarMEGINT\nyari-kapitalis-1.0.0\target\ könyvtárban keletkeznek.
D R
5. A target könyvtárba generált nyari-kapitalis-1.0.0-me.jad és nyari-kapitalis-1.0.0-me.jar fájlok a telefonra tölthet˝o állományok (hogy melyik éppen, az készülékfügg˝o, ha megakadsz, további infókat a korábbi „Nehogy már...” könyvben találsz). Ha a Java ME SDK 3.0 SDK-d, vagy a Sun Java Wireless Toolkit 2.5.2_01 for CLDC szimulátorod megfelel˝oen installálva van, akkor a jad fájlon kattintva máris mehet a horgászás!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
9 / 19
A legtöbb gyártó saját készülék-specifikus szimulátorait is használhatod, ezekr˝ol is szólunk a számtalanszor hivatkozott korábbi „Nehogy már...” könyvben, például Sony Ericsson készülékek esetén a Sony Ericsson SDK for the Java ME platform 2.5.0.6 tetszhet.
1.1.2.2.1.
A játékok felélesztése Maven projektben GNU/Linux alatt
Itt lényegesen egyszer˝ubb az életünk, ami nem meglep˝o: lévén egy programozási projektr˝ol van szó. A Linuxunkon tipikusan menni fog az mvn parancs. Ha mégsem, akkor például Ubuntu alatt a
norbi@sgu:~$ sudo apt-get install maven2
parancs azonnal felrántja a gépre. Nincs más dolgunk, mint lerántani és kicsomagolni a vágyott megnyitott játék projektjét, majd belépni ide, a pom.xml állományt tartalmazó szintre, például magam: cd Dokumentumok/Projects/NehogyMarMEGINT/javacska-one-1.0.0-projects/nyari-kapitalis-1.0.0/
és itt kiadni az mvn package parancsot, mely eredményeként a telefonra tölthet˝o állományok elkészülnek.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
10 / 19
A képen a szöveges kimenetet megfigyelve észrevehetjük, hogy a pom.xml állományból a mobil programok obfuszkálását (obfuscation) is elvégezzük. 117
118
com.pyx4me <artifactId>j2me-maven-plugin ${me2Version} <executions> <execution> package <encoding>UTF-8 UTF-8 UTF-8 UTF-8 <useWtkLibs>false <proguardPreverify>true 1v <proguard>true 2v true 3v
119 120 121 122 123 124 125 126 127 128
D R
129 130 131 132 133 134 135 136 137
v, 2v, 3v Kérjük a projekt obfuszkálását, az Apache licenccel elérhet˝o pyx4me Maven plugint használva.
1
Ennek itt nem az a jelent˝osége, hogy a programunk bájtkódját ne lehessen visszafejteni, hanem az, hogy az eredmény Java archívumok méretét csökkentsük. A Proguard obfuszkátort használjuk erre a célra, mely innen is letölthet˝o, de a mai NetBeans verziók is tartalmazzák már. Megemlíthetjük, hogy vannak olyan esetek, amikor az obfuszkátor használatát nem is mell˝ozhetjük: amikor mobilunkon kriptográfiát, például a Bouncy Castle kriptográfiai csomagot kell alkalmaznunk, használnunk. 1.1.2.3.
A játékok felélesztése NetBeans környezetben
Az iménti ponthoz hasonlóan néhány képerny˝okép felvillantásával Linux és Windows alatt is beizzítjuk a NetBeans környezetben a projekteket. De mivel a NetBeans egy Java alapú GUI-s eszköz, így a két platformon nincs különbség a használatában. (Pusztán a telepítésében van annyi differencia, hogy el˝obbi esetben egy .sh állományt, utóbbiban egy .exe állományt, a telepít˝ot kell lefuttatnod.) Ezért most elég például a Windowsos képeket mutatnunk.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
A 110% Nyári Kapitális NYFK installálása a NetBeans-ben 1. Els˝o lépés természetesen a NetBeans beszerzése: töltsd le a projekt lapjáról! Magam ezt az IDE-t sokszor használom mindhárom Java kiadás: Java SE, Java ME, Java EE esetén (például még arra is képes, hogy Portleteket deployoljak fel egy futó WebSynergy portálra), ezért itt a letöltési mátrixból azt szoktam választani, amelyben minden benne van, most tehát a netbeans-6.8-ml-windows.exe állományt töltöttem le. Futtasd le, s a NetBeans rendben is van. Feltéve, hogy korábban már lerántottál egy JDK-t! Ha nem tudod, hogy ez miért kell, akkor nem árthat fellapozni a korábbi „Nehogy már...” könyvet, de mindenesetre töltsd le (jelen pillanatban az aktuális a JDK 6 Update 18) és hasonló módon telepítsd fel!
D R
A FT
2. Most hozz létre a NetBeans-ben egy mobilos projektet!
A SajatHorgaszom nevet adjuk a projektnek.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
12 / 19
D R
Beállítjuk a megcélzott platformot, a játéknak CLDC 1.0 és MIDP 2.0 kell, de a valódi telefonod is biztosan tudja ezt.
3. Erre a projektek fülben megjelenik a projekted.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
13 / 19
D R
A FT
Amin egy jobb gombot nyomva hozzá tudsz adni a projekthez egy MIDlet osztályt, aminek a neve fontos, hogy megegyezzen a megnyitott KapitalisMIDlet.java forrásbeli nyilvános MIDlet osztály nevével!
Erre az IDE ki is tölti néhány sorral az újonnan létrejött forrásodat (a MIDlet osztály absztrakt metódusaira ad egy üres test˝u implementációt).
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
14 / 19
D R
Amire Neked nem lesz szükséged, ezért másold be a letöltött és kicsomagolt horgász játék c:\Users\Norbi\Documents\ NehogyMarMEGINT\nyari-kapitalis-1.0.0\src\main\java\ könyvtárából a Java forrásokat a saját projekted c:\Users\Norbi\Documents\NetBeansProjects\SajatHorgaszom\src\ könyvtárába. Ekkor az IDE-ben rögtön megjelenik az új tartalom.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
15 / 19
D R
4. Immár csupán a kép- és hanger˝oforrások megadása választ el minket a tesztelést˝ol. Újra nyomj jobb gombot a projekt nevén, majd válaszd a Properties menüpontot!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
16 / 19
Itt közben készíts egy res könyvtárat a c:\Users\Norbi\Documents\NetBeansProjects\SajatHorgaszom\ src\ könyvtárral egy szinten és másod be ide a c:\Users\Norbi\Documents\NehogyMarMEGINT\nyari-kapitali 0.0\src\main\resources\ könyvtár tartalmát! S ezt a könyvtárat add meg a párbeszédablakban!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
17 / 19
5. Nincs más dolgunk, mint az F6 gomb lenyomásával futtatni a projektet.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
18 / 19
1.2.
A játékok új nyelvre fordítása
Mindhárom játékra igaz, hogy szöveges literálokat nem találunk elszórva a kódban, hanem minden szöveges er˝oforrás a Szoveg. java állományban van összegy˝ujtve.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
19 / 19
Example 1.4 A Szoveg.java állományok szervezése 74 75 76 77 78 79
/** oforrások. * Szöveg er˝ * Bátfai Norbert * @author 0.1.5 * @version */
80 81
interface Szoveg {
82
84 85
// névjegy infók public static final String nevjegyFej = "110% Nyári Kapitális OSE\n"; public static final String nevjegyTest = "Copyright (C) 2010, Bátfai Norbert\nEz a ←program szabad szoftver; terjeszthet˝ o illetve módosítható a Free Software Foundation ←által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 3-as ←, akár (tetsz˝ oleges) kés˝ obbi változata szerint.\n\nEz a program abban a reményben ←kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az ←ELADHATÓSÁGRA vagy VALAMELY CÉLRA VALÓ ALKALMAZHATÓSÁGRA való származtatott ←garanciát is beleértve.\n\nhttp://www.inf.unideb.hu/~nbatfai/phd/";
A FT
83
86 87 88 89
// Ált. játék infó public static final String jateknev = "110% Nyári Kapitális OSE"; public static final String jatekcimFej = "110% Nyári OSE\n";
Tehát a játékok nyelvi portolása mindössze annyi, hogy ebben a Szoveg.java állományban elvégezzük a fordítást, illetve még a Parancs.java fájlban kell lefordítanunk a célnyelvre az itt szerepl˝o parancsok szövegét. Example 1.5 A Parancs.java állományok szervezése 65 66 67 68 69
D R
70
/** * Parancsok felsorolása. * Bátfai Norbert * @author 0.1.1 * @version */ interface Parancs {
71 72 73 74 75 76 77 78 79 80 81 82 83
// Kilépés a MIDletb˝ ol public static final javax.microedition.lcdui.Command kilep = new javax.microedition.lcdui.Command("Kilép", javax.microedition.lcdui.Command.EXIT, 25); public static final javax.microedition.lcdui.Command kilep2 = new javax.microedition.lcdui.Command("Kivesz", javax.microedition.lcdui.Command.EXIT, 25); // Ált. tovább a kezd˝ o formokról public static final javax.microedition.lcdui.Command tovabb = new javax.microedition.lcdui.Command("Horgászat", javax.microedition.lcdui.Command.SCREEN, 1);
1.3.
A fejezet feladatainak összefoglalása
A feladatok mellett feltüntetett szám a feladat általunk feltételezett nehézségére utal. Az egy pont a jegyzetben mutatottak egyszer˝u megismétlését jelenti, a maximális húsz a teljesen egyéni munkát. 1. Éleszd fel Maven környezetben valamelyik megnyitott játékot! (2 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
20 / 19
2. Éleszd fel NetBeans környezetben valamelyik megnyitott játékot! (2 pont) 3. A pom.xml módosításával változtasd meg a generált JAD (Java Application Descriptor) adatait! (2 pont) 66 67 68 69 70
71 72 73 74 75 76 77
<jadAttributes> <MIDlet-Name>${project.name} <MIDlet-Icon>/ikon.png <MIDlet-Vendor>${project.organization.name} <MIDlet-Version>1.0.0 <MicroEdition-Configuration>CLDC-1.0 <MicroEdition-Profile>MIDP-2.0 Batfai Norbert <midlets> <MIDlet> ${project.name} /ikon.png
A FT
65
4. A NetBeans Refactor használatával nevezd át valamelyik játék MIDlet osztályát! (2 pont)
D R
5. Készíts egy új nyelvi portolást valamelyik megnyitott játékhoz! (5 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
21 / 19
2. fejezet
D R
A FT
A játékok er˝oforrásainak lecserélése
A FT Kivonat
Nagyon könnyen lehet sikerélményünk, ha ezt a fejezetet dolgozzuk fel. Mert tipikusan nem kell mást tennünk, mint kisétálni kedvenc horgászhelyünkre, ott kattintani néhányat digitális fényképez˝onkkel és gyakorlatilag szinte már kész is van egy új, egy saját portolásunk a horgász játékból! Tehát ebben a fejezetben
• megismered, hogy milyen képer˝oforrásokat és hogyan használunk a programokban • készíthetsz egy saját horgász játékot
D R
• vagy módosíthatod, lecserélheted a focis játék csapatait a sajátjaidra.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
„However, new winds blew in from the Hungarian Steppe. The Hungarian team played with two inside forwards in the front line and the center forward withdrawn” —Björn Bolling [Bolling] Football (Soccer) Handbook of Sports Medicine and Science
2.1.
Képek lecserélése „Az online közösségi játékok – amelyekben a fejlesztések f˝ohangsúlya a grafikáról a mesterségesintelligenciamegoldásokra helyez˝odik át – a valós és a virtuális világot összekapcsoló majdani globális méret˝u információs tér meghatározó részeként, a jelenleginél sokkal fontosabb tudatformáló tényez˝okké válnak.” —Köml˝odi Ferenc [NHIT] Égen-földön informatika: az információs társadalom technológiai távlatai
A FT
A szerepl˝o képer˝oforrások cseréjét igazán a horgász és a focis játék kapcsán értelmezhetjük. El˝obbi esetén a játékból készíthetünk olyan portolásokat, melyekben a saját horgászhelyünk, vagy akár saját halaink képe jelenik meg. Az el˝obbi feladat nem feltételezi, hogy a Java forráskódokhoz egyáltalán hozzányúljunk, az utóbbi esetén, ha újabb halfajokat is szerepeltetni akarunk, akkor némi visszakommentezést kell eszközölnünk a forrásokban. A foci játék esetén a labdarúgók mozgását (ez konkrétan most az állás és a futás) megadó kereteket cserélhetjük le könnyen. Ha viszont további mozgásokat is szeretnénk megjeleníteni: például a játékos megfordulását, fejelést, rúgást stb., akkor ennek az átalakításnak megfelel˝oen majd a kódhoz is hozzá kell nyúlnunk.
2.1.1.
Új horgászhelyes portolás elkészítése
D R
Tegyük fel, hogy készítettél néhány fotót kedvenc horgászhelyedr˝ol! Vágd ki a képnek azt a részét, amit a mobil játékba át akarsz tenni: hogy minél egyszer˝ubb legyen, ez a rész arányaiban jó, ha 240 pixel x 320 pixel méret˝u, mert majd ekkorára kell átméretezned, s ennek során nem torzul majd a kép. (Tipikus megoldás, hogy el˝oször átméretezed nagyjából és ebb˝ol az átméretezettb˝ol vágsz ki egy 240x320 méret˝u téglalapot.)
Majd vágd fel ezt a 240x320 méret˝u képedet két 240x160 méret˝u részre, azaz középen vágd ketté! Ezzel két képet kapsz: a horgászhely tetejét és alját.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
2 / 19
A FT
A fels˝o részt mentsd el hhely1.png, az alsót pedig hhely2.png néven. Ezzel majdnem kész is a saját portolásod el˝okészítése. Annyi van még, hogy az alsó kép tetejéb˝ol vágj ki egy szabálytalan darabot és ments el hhely2szel.png néven, ezt fogjuk majd picit mindig 1-2 pixellel máshova elmozgatva rárajzolni az alsó képre, hogy a víz enyhe mozgásának illúzióját keltsük az úszók körül.
Készen is vagy! Írd felül a res könyvtárad (vagy Maven használata esetén resources könyvtárad) képeit az új képekkel és máris mehet az újrafordítás. A képek kezelése
˝ GNU-s képfeldolgozó program, amelynek • Dolgozz a GIMP programmal! Ez egy szinte minden platformra letöltheto, használatát már a korábbi Nehogy már könyvben bevezettük. ˝ • A képfájlok méretét jelentosen csökkentheted, ha beindexelt színeket használsz. Alakíts ki egy megfelelo˝ méret/mi˝ noség arányt! A GIMP programban ehhez válaszd a Kép/Mód/Indexelt... menüt.
Saját horgászjátékod elkészítése
1. Az imént olvasottak alapján készítsd el saját horgászos játékod! Az alábbi pontokban magam is megteszem, hogy bemutassam, milyen egyszer˝u dologról van szó.
D R
2. Ma reggel zsebre vágtam a digitális fényképez˝ogépem (persze a mobilom is megtette volna) és a munkalyemre (a kép jobb fels˝o sarkában a fák mögött sápadtan dereng˝o sárga épület) jövet beugrottam az innen alig 100 méterre lév˝o egyetemi Botanikus Kertbe (http://botkert.unideb.hu/), ahol lefotóztam a tavat.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
3 / 19
D R
3. Ebb˝ol a fotóból átméterezés után kivágva elkészítettem az alábbi 240x320-as méret˝u képet.
4. Középen kettévágva elkészítettem a horgászhely tetejét és alját.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
4 / 19
5. Az alsó kép fels˝o részéb˝ol az úszók környékér˝ol kijelöltem egy szabálytalan darabot és külön kimentettem.
D R
6. Majd ezzel a három képpel felülírtam a projektben az eredeti képeket, újra buildeltem és íme alább az eredmény.
2.1. táblázat. Pillanatkép a most elkészített Saját horgász játékból
2.1.2.
Új focis portolás elkészítése
Technikailag ebben az esetben is ugyanúgy kell eljárnod, mint az el˝obbi, a horgászos példa esetén. Esetleg egy valami lehet meglep˝o, nevezetesen az, hogy a korábbi Nehogy már könyv keret alapú animációjánál is látott esett˝ol (azaz amikor a mozgás
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
5 / 19
A FT
2.2. táblázat. Pillanatkép egy kisebb kijelz˝oj˝u szimulátorban a Saját horgász játékból minden kerete egy állományban van összegy˝ujtve) eltér˝oen itt minden keretet külön állományba mentve találsz.
D R
(Az említett Nehogy már 7-es példában a MIDP 2-ben megjelent Game API Sp-
rite osztályát használtuk az animációknál.)
A szimmetrikus állapotokat tükrözzük, a többi csapat mezének színeit pedig az RGB kódok manipulálásával állítjuk el˝o a kódban, ezt majd kés˝obb bemutatjuk. A („saját ”, a magyar csapatbeli) labdarúgó futását (tükrözéseket nem számolva) kilenc keret alkotja.
2.3. táblázat. A „saját ” labdarúgó futásának keretei
A labdarúgó állását (tükrözéseket nem számolva) két keret alkotja.
A másik csapatbeli (az „ellen ”, a színei miatt a német csapatbeli) labdarúgó futását (tükrözéseket ugyancsak nem számolva) megint csak kilenc keret alkotja, ezek a következ˝ok. A másik csapatbeli labdarúgó állását is (tükrözéseket nem számolva) két keret alkotja.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
2.4. táblázat. A „ellen ” labdarúgó futásának keretei
N˝oi foci
A FT
1. Az imént olvasottak alapján készítsd el a játék n˝oi focis változatát! Nem kell mást tenned, mint mondjuk egy kamerával rögzíteni a futó hölgy futását állását és az imént felvillantott, szerepl˝o kereteket lecserélned a filmb˝ol kikockázottakra.
A focista kereteinek kivágása
˝ • Ha megvannak a mozgás új keretei, dolgozd fel oket a GIMP programmal! Néhány egérkattintással ki tudod jelölni a képeken a focista hölgyet, hogy aztán az útvonal szerint kijelölve betehesd egy transzparens keretbe.
D R
A játékban minden játékosnak egy aktuális kerete van kirajzolva, annak megfelel˝oen, hogy éppen áll vagy fut. Az imént a saját és az ellen jelz˝oket a csapatok el˝ott azért szerepeltettük idéz˝ojelek között, mert a játékos megválaszthatja, hogy éppen kivel akar lenni az aktuálisan egymásnak feszül˝o két csapat közül.
A fájlból betöltött keretek színeit (vörös, illetve fehér-fekete) viseli a magyar, illetve a német válogatott.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
A játékban szerepl˝o többi hat: francia, brazil, angol, amerikai, svéd és olasz nemzeti válogatottakat jellemz˝o mezszín˝u kereteket, mint említettük nem képfájlból töltjük be, hanem a szoftverben, a betöltött két csapatbeli játékoskeretekb˝ol kombináljuk ki a képpontok RGB kódjainak manipulálásával. Erre azért van szükség, mert a szerepl˝o két (természetesen beindexelt szín˝u) keret garnitúra mérete 14 kilobájt, ha a többi hat csapatot is képként töltenénk be, az további 42 kilobájtot jelentene. 1859 1860
protected int r, g, b;
1861 1862
protected void mezek(int sajat, int ellen) {
1863 1864
// RGB feldolgozas
1865
1867 1868 1869 1870 1871 1872 1873
int melyikbol = 0; // 0 vagy 1, hogy a ket betoltott csapatbol // melyiket kell atszinezni hozza int hanyadik = 0; // hogy melyik alg csinálja meg: // az els˝ ob˝ ol: /* 0 // eredeti // vörösök - magyarok */
A FT
1866
1874 1875 1876 1877 1878 1879 1880 1881
/* 1 //kékek - franciák r = (buffer[j] & 0x00ff0000) >> 16; g = (buffer[j] & 0x0000ff00) >> 8; b = buffer[j] & 0x000000ff; buffer[j] = r|g<<8|b<<16| 0xff000000; */
1882 1883 1884
/* 2 // sárga - brazilok
Bekommentezve láthatóak a majdani tényleges átalakítások. Az eredeti képpont R, G és B komponensének bájtját bemaszkoljuk, majd értékét rendre betesszük az r, g és b változókba, amelyekb˝ol kikombináljuk az új szint, amit most éppen a „kék felé” tolunk el. Színezzük a sajat 1936
switch (sajat) { case 0: // magyarok melyikbol = 0; hanyadik = 0; break; case 1: // francik melyikbol = 0; hanyadik = 1; break; case 2: ... . . . case 7: // olasz melyikbol = 1; hanyadik = 3; break;
D R
1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958
}
1959 1960
mez(melyikbol, hanyadik, 0);
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
8 / 19
és az ellen csapatot is. 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
switch (ellen) { case 0: // magyarok melyikbol = 0; hanyadik = 0; break; case 1: // francik melyikbol = 0; hanyadik = 1; break; case 2: ... . . . case 7: // olasz melyikbol = 1; hanyadik = 3; break;
1903 1904
}
1905 1906
mez(melyikbol, hanyadik, 1);
A
A színezést magát majd a meghívott
FT
1882
protected void mez (int kep , int alg , int melyikbe );
függvény végzi el, mely paraméterként kapja, hogy melyik képekb˝ol (a korábban mutatott vörös vagy fehér-fekete) végezzük a konverziót, pontosan hogyan történik a konverzió (ez volt fentebb kikommentezve mutatva a kékek - franciák esetben) és hová tesszük az eredményül kapott képet. 2038
protected void mez(int kep, int alg, int melyikbe) {
R
2039
A 2x9 futást tartalmazó kereten és 3 állást mutató kereten, azaz összesen 21 kereten dolgozunk, sorban egymás után. A buffer egész tömbbe beolvasunk egy keretet binárisan. 1882 1883 1884 1885
int[] buffer = new int[jKep[kep][i].getWidth() * jKep[kep][i].getHeight()]; jKep[kep][i].getRGB(buffer, 0, jKep[kep][i].getWidth(), 0, 0, jKep[kep][i].getWidth(), jKep[kep][i].getHeight());
D
1886
for (int i = 0; i < 21; ++i) {
1887
Majd végrehajtjuk az RGB kódolások megfelel˝o átalakítását.
1882 1883
switch (alg) {
1884 1885 1886 1887 1888
case 0: // eredeti // vörösök - magyarok break;
1889 1890 1891 1892 1893
case 1: //kékek - franciák r = (buffer[j] & 0x00ff0000) >> 16; g = (buffer[j] & 0x0000ff00) >> 8;
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
9 / 19
b = buffer[j] & 0x000000ff; buffer[j] = r | g << 8 | b << 16 | 0xff000000; break;
1894 1895 1896
Végül az átalakításból egy új képet készítünk az adott keretb˝ol. 1882
jKepOK[melyikbe][i] = javax.microedition.lcdui.Image.createRGBImage(buffer, jKep[kep][i].getWidth(), jKep[kep][i].getHeight(), true);
1883 1884
D R
A FT
Munkánk eredményét mutatja a következ˝o két ábrán látható csapatok mezeinek színe: a francia és az amerikai válogatott kék, illetve fekete-fehér és az olasz és a brazil válogatott fehér-kék , illetve sárga színei.
Keverj ki egy új csapatot
1. Cseréld le valamelyik nemzeti válogatottat és adj nekik megfelel˝o színt. Ez esetben a fentiek mintájára más, a forráskódban való módosításokkal kell kísérletezned!
2.2.
A fejezet feladatainak összefoglalása
A feladatok mellett feltüntetett szám a feladat általunk feltételezett nehézségére utal. Az egy pont a jegyzetben mutatottak egyszer˝u megismétlését jelenti, a tíz a teljesen egyéni munkát. 1. Készíts egy saját új horgászhelyes portolást! (4 pont) 2. A labdarúgó képeit (például magadról kamerával felvett futás kereteib˝ol készítettekkel) lecserélve készíts egy új focis portolást! (5 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
10 / 19
3. Készíts egy n˝oi focis portolást! (5 pont)
D R
A FT
4. Készíts saját világbajnokságot, válassz ki 8 csapatot, majd a zászlókat és a csapatot jellemz˝o színeket cseréld le a választásodnak megfelel˝oen! (8 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
11 / 19
rész II
D R
Szoftverfejlesztés
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
12 / 19
D R
A FT
Az el˝oz˝o részben láttuk, hogyan élesszük fel a megnyitott játékokat. Most azt vizsgáljuk meg, hogyan módosíthatjuk o˝ ket, nem er˝oforrásaikban, hanem a forráskódjukban.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
13 / 19
3. fejezet
D R
A FT
A játékok továbbfejlesztése
A FT Kivonat
Ebben a fejezetben annyira megismerkedünk a játékok forrásaival, hogy képesek legyünk belenyúlni a kódba. Ennek megfelel˝oen
• megismered a horgász játék vezérlését
• ezzel egyid˝oben mindhárom játék alapm˝uködését, mert ugyanazon egyszer˝u OO struktúra alapján vannak felépítve, de közülük is a horgász játék a legegyszer˝ubb, • majd belepillantasz a foci szimulátor m˝uködésébe
D R
• végül megismered a Ziv-Lempel algoritmus szófájának felépítését az ezoterikus játékban
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
„Csak akkor értesz valamit, ha be tudod programozni. Te magad és nem valaki más! Ha nem tudod beprogramozni, akkor csak úgy gondolod, hogy érted.” —Gregory Chaitin [METAMATH] META MATH! The Quest for Omega
3.1.
A játékok szervezése, megírása „Nem tudok kimerít˝o leírást adni arról, hogy hogyan tudsz megtanulni programozni -- nagyon összetett tudásról van szó. Egyet azonban elárulhatok: a könyvek és tanfolyamok nem érnek túl sokat (sok, valószín˝uleg a legtöbb hacker autodidakta). Aminek van értelme: (a) kódot olvasni és (b) kódot írni.” —Eric S. Raymond (fordította: Kovács Emese) [Hacker] Hogyan lesz az emberb˝ol Hacker
A FT
A mobil programozásban (és általában, amikor el˝otérbe toljuk a teljesítményt a karbantarthatósággal vagy újra felhasználhatósággal szemben) természetes, hogy a programok bár természetesen objektum orientáltak, de ez a jelleg egyáltalán nem er˝os. Például a focis programban hiába keressük a Player osztályt, vagy annak valami megfelel˝ot, nem találunk csak natív Java tömböket: ezekben jellemezzük a játékosok tulajdonságait. A játékok osztályszerkezetének kialakításakor is ennek szellemében jártunk el, így a megnyitott játékokat az alábbi, az ArgoUML-el legenerált osztály diagramok jellemzik. Mindhárom projektnek szinte teljesen azonos a szerkezete. Láthatóan nem használják a MIDP 2.0 megadta Game API-t, hanem klasszikusan (a Thread osztály konstruktorának egy Runnable interfészt implementáló objektumot átadva) saját játékszálat használnak.
D R
A 110% Nyári Kapitális NYFK osztálydiagramja csak annyiban különbözik a másik kett˝ot˝ol, hogy a vászonban magában foglalkozunk a vásznon keletkez˝o parancsokkal kapcsolatos eseménnyel.
254 255 256
/** Parancsok kezelése. */ public void commandAction(javax.microedition.lcdui.Command c, javax.microedition.lcdui. ←Displayable d) {
257
if (c == Parancs.kezeles) { midlet.segit0(); } else if (c == Parancs.kilep2) {
258 259 260 261
horgaszat = false; midlet.kivesz();
262 263 264
} else if (c == Parancs.madarak) { midlet.madarak(); }
265 266 267 268 269
}
Pontosabban csak visszahívjuk a MIDlet osztályunkat.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
2 / 19
A FT
A Focijáték Neked NYFK osztálydiagramjában annyi az újdonság, hogy például a fotózás során készített képeknél, azok mentésekor a felület átmenetileg lefagyna, ezért egy külön szálban végezzük ezeket a tevékenységeket.
A Hetedik Szem NYFK osztálydiagramja. Itt a Ziv-Lempel szófa felépítése és elemzése az id˝oigényes feladat, ezért ezt külön szálban implementáltuk. 1. Miért szeretjük az ArgoUML szoftvert?
Mert forrásokból is tud UML diagramokat generálni! Szerintem sokan értjük a választ, de félre a tréfával! Valóban érdemes tervezni, s˝ot a szóban forgó programforrást is képes generálni.
D R
A következ˝o néhány osztály diagramon a tartalmazási relációkat is feltüntettük. Így megismerkedhetünk néhány további osztállyal.
A 110% Nyári Kapitális NYFK osztálydiagramján megjelent a Hal osztály.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
3 / 19
A Focijáték Neked NYFK osztálydiagramja.
D R
A Hetedik Szem NYFK osztálydiagramján megjelent a rekurzív fa építés adatszerkezete, a (jól láthatóan önhivatkozó) TudatFa, illetve a statisztikai próbát megvalósító StatProba osztály.
A néhány megszemlélt diagram alapján távolról megismerkedtünk projektjeink osztályaival, a továbbiakban a forráskódok átnézésével folytatjuk.
3.1.1.
A 110% Nyári Kapitális OSE
A három játék közül ennek a játéknak a legegyszer˝ubb a szervezése. A KapitalisVaszon osztályból a Runnable interfész implementálásával majd egy szál objektumot készítünk, ez lesz a játékot vezérl˝o szál.
473 474 475
public class KapitalisVaszon extends javax.microedition.lcdui.Canvas implements Runnable, javax.microedition.lcdui.CommandListener {
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
4 / 19
Example 3.1 A játékot vezérl˝o szál elkészítése és elindítása a KapitalisMIDlet.java állományban 473 474
} else if (c == Parancs.tovabb) {
475 476
kimentBeallitasok(); 1v
477 478
kapitalisVaszon = new KapitalisVaszon(this); 2v t = new Thread(kapitalisVaszon); 3v t.start(); 4v
479 480 481 482
displayable = kapitalisVaszon; 5v display.setCurrent(displayable); 6v
483 484 485
v
1
v
2
v
3
v
4
A FT
} else if (c == Parancs.kilep) {
486
Meglehet, hogy a játékos már beállított valamit a splash képerny˝on, például kikapcsolta a madárdalt, ezért a defenzív taktika az, ha a kimentBeallitasok metódus hívásával mentjük az esetlegesen módosított beállításokat a továbblépés el˝ott. Elkészítjük a Runnable interfészt implementáló KapitalisVaszon vásznunkat: ezen a grafikus képerny˝on megy majd maga a horgászat, itt mozgatják az úszókat a halak stb. A KapitalisVaszon konstruktornak átadjuk a saját, azaz a MIDlet osztályunk this referenciáját, hogy adott esetben a vásznunk vissza tudja hívni a midlet metódusait. Elkészíti a játék logikájának szálját. Technikailag egy Runnable interfészt implementáló KapitalisVaszon objektumot adunk át a Thread konstruktornak. Nincs más hátra, mint az elkészített szál elindítása a Thread osztálybeli t példány start metódusának meghívásával. Technikailag ez a mi esetünkben a KapitalisVaszon osztálybeli kapitalisVaszon objektum run metódusának meghívását jelenti. Ide kell tehát kódolnunk a játék logikáját!
v, 6v Végül képerny˝ore helyezzük az elkészített vásznunkat.
5
A Focijáték Neked OSE bemutatása
D R
3.1.2.
A már megismert módon a FociVaszon osztályból a Runnable interfészt implementálásával majd egy szál objektumot készítünk, ez lesz a játékot vezérl˝o szál.
473 474 475
public class FociVaszon extends javax.microedition.lcdui.Canvas implements Runnable {
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
5 / 19
Example 3.2 A játékot vezérl˝o szál elkészítése és elindítása a FociMIDlet.java állományban A foci játék indulásánál vagy új meccset kezdünk, vagy egy korábban megkezdettet folytatunk, ezt mondja meg a meccsMegy tag. Ha újat kezdünk, akkor meghatározzuk a két játékra következ˝o csapatot, inicializáljuk az állást, az órát stb. Ezekt˝ol eltekintve a játék vezérlését ugyanazon módon szerveztük, mint amelyet megismertünk a horgász játék esetén. 663
} else if (c == Parancs.foci) {
664 665
if (!meccsMegy) {
666 667
669
670 671 672 673 674
}
675 676
A FT
FociVaszon.sajatCsapat = meccsek[meccsekI][csapatChoice.getSelectedIndex() ←]; FociVaszon.ellenCsapat = meccsek[meccsekI][(csapatChoice.getSelectedIndex() ←+ 1) % 2]; FociVaszon.allas[0] = 0; FociVaszon.allas[1] = 0; FociVaszon.jatekIdoVege = false; FociVaszon.tizenegyesekSzama = 0; FociVaszon.jatekIdo = 0l;
668
mezek(FociVaszon.sajatCsapat, FociVaszon.ellenCsapat);
677 678
fociVaszon = new FociVaszon(this); fociVaszon.addCommand(Parancs.segit); fociVaszon.addCommand(Parancs.kilep); fociVaszon.setCommandListener(this);
679 680 681 682 683
fociVaszonSzal = new Thread(fociVaszon); fociVaszonSzal.start();
684 685 686
kijelzore = fociVaszon; kijelzo.setCurrent(kijelzore);
687 688
Az EM foci szimulátora
D R
3.1.3.
A játékba épített foci szimulátort a szimulacio függvény tartalmazza.
1855 1856 1857 1858 1859
/** * EM MOTBALL Szimuláció */ protected void szimulacio() {
Ezt a függvényt a játékot vezérl˝o szál 155, 95 vagy 90 milliszekundumonként hívja meg, attól függ˝oen, hogy mekkora méret˝u pálya nézet van beállítva éppen a játékban. (Ezeket az id˝oket a megjelenés, a játék látható sebessége határozza meg, mert a vezérl˝o szál a szimulacio függvény hívása után a vásznat újra rajzoló repaint függvényt hívja majd meg.)
1157 1158 1159
protected long idos; protected final int varakozas[] = {155, 95, 90};
3.1.3.1.
˝ A szimuláció elokészítése
A szimulációban használt adatszerkezetek sajnos egyáltalán nem objektum orientált természet˝uek, tehát például nincs elegánsan egy játékos osztály, amelyeknek ilyen meg olyan tulajdonságai vannak, hanem a jobb teljesítmény elérése miatt, maximum tömbökkel dolgozunk. A szimuláció során a játékosokat a jatekosok nev˝u három dimenziós tömbbel jellemezzük. Az els˝o dimenzió azt mondja
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
meg, hogy a saját vagy az ellen csapat tagjáról van-e szó. A második dimenzió azonosítja a játékos mezszámát, a harmadik dimenzióban adjuk meg a tényleges tulajdonságokat: • a játékos oszlop pozíciója • sor pozíciója • a játékos cél oszlop pozíciója • sor pozíciója • labdatechnikája • játékérzéke
• melyik mozgás animációs keretet kell kirajzolni
FT
• gyorsasága
Láthatóan tehát a játékos van egy pozícióban a pályán és törekszik elérni egy másikat, ez a cél pozíció. Ezek és a jsebNegyzet szabják meg a pályán a játékos mozgásának alapjait. A pályán egy diszkrét rácsra szorított euklideszi világban élünk, sebességbeli megfontolásokból használunk négyzeteket, hogy elkerülhessük a gyökvonás szükségessését. 1286
1288 1289 1290 1291 1292 1293
1294
/* * A játékosok tulajdonságai */ protected int jx, jy, jcx, jcy, jdx, jdy, jdx2, jdy2; protected int jsebNegyzet = 49; protected int[][][] jatekosok = new int[2][10][8]; // [csapat: 0 v.1][tagok (játékosok): 0-9.][tulajdonságok: jx jy jcx jcy labdatechnika jatekerzek gyorsasag] // tulajdonságok: x y cx cy
A
1287
←-
1744 1745 1746 1747 1748 1749 1750
public static final int csapatTulajd[][][] = { { // a sajat csapat // {labda technika, játék érzék, gyorsaság} // a játékosok tömbben: ezek a 4. 5. 6. elemek {30, 60, 35}, // kapus
D
1751
R
Az iménti kódcsipet kapcsán említett jatekosok tömb labdatechnika, játékérzék és gyorsaság értékei, azaz azon két csapatnak a játékosainak az értékeim akik részt vesznek az aktuális szimulációban, vagyis, akik vívják a találkozót, a csapatTulajd tömbökben kerülnek el˝ozetesen meghatározásra.
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764
{90, {92, {89, {62, {78, {67, {55, {60, {56,
25, 24, 30, 62, 60, 60, 89, 91, 92,
90}, // csatársor 100}, 94}, 60}, // középpályás sor 62}, 58}, 58}, // hátvédsor 40}, 35}
}, { // az 1-es ellen csapat ...
A játékot azért végs˝o soron a labda hajtja meg, a labda mozgatja, ennek tükröz˝odnie kell a szimulációban is. A labda alapvet˝o állapotát a labdaAllapot rögzíti.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
1255
1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
/* * A labda tulajdonságai */ protected int labdaAllapot, lx, ly, lcx, lcy, ldx, ldy, ldx2, ldy2; protected final static int MOZGASBAN = 0; protected final static int KOZEPRE = 1; protected final static int KOZEPKEZDES = 2; protected final static int VEZETVE = 3; protected final static int KIRUGAS = 4; protected final static int GOLOROM = 5; protected final static int TALALKOZO_VEGE = 6; protected final static int SZOGLETHEZ = 7; protected final static int SZOGLET = 8; protected final static int TIZENEGYESHEZ = 9; protected final static int TIZENEGYES = 10; protected final static int MOZGASBAN11 = 11; protected final int lsebNegyzet = 300; protected int lbJatekos, lcJatekos; // labda birtokló és cél játékos // megjelenítés protected int lki = 0; // labda forgás anim
FT
1256
Alapvet˝o szerepet játszik a játékosok pályán történ˝o mozgásának szervezésében a felállás. Ez egyszer˝uen minden játékosnak egy olyan pozíciót t˝uz ki, amelyet igyekszik elfoglalni, ha éppen nem más feladatot hajt végre. 1294
1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311
protected int[][][] felallasok = { // [hányadik felállás][játékosok][cx cy] // 3x3x3 // kozépkezdéskori felállás // majd az ennek megfelel˝ o egész pályás felállás // 3x4x2 // kozépkezdéskori felállás // majd az ennek megfelel˝ o egész pályás felállás // 4x3x2 // kozépkezdéskori felállás // majd az ennek megfelel˝ o egész pályás felállás // 2x4x3 // kozépkezdéskori felállás // majd az ennek megfelel˝ o egész pályás felállás
A
1296
R
1295
// mindent a b.o.-i (SAJAT) csapatra vonatkozóan kell megadni, // az ELLEN majd PX - a megadott
D
Adott felálláshoz tartozik egy középkezdéskori pozíció halmaz
1294 1295 1296 1297 1298
{ // egy felállás, a csapat minden tagjának // taktikai (x,y) koordinatája: // ez a 3x3x3 felállás a középkezdéshez {10, 320}, // a kapus: 0.
1299 1300 1301 1302
{480, 470}, // 1-9 csatároktól a hátvédekig {495, 320}, // elhelyezkedes, mint a telefonon a num {470, 230}, // billentyuk
1303 1304 1305 1306 1307 1308
{310, {320, {310, {110, {170,
530}, // középpálya 310}, 100}, 400}, // hátvédsor 330},
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
8 / 19
{110, 240}
1309
},
1310
illetve egy egész pályás: 1328
{
1329
// ez a 3x3x3 egész pályás {10, 320}, // a kapus: 0.
1330 1331 1332
1334 1335 1336 1337 1338 1339 1340 1341
+ + + + + + + + +
365, 365, 365, 330, 330, 330, 300, 300, 300,
470}, // 1-9 csatároktól a hátvédekig 320}, 230}, 530}, 310}, 100}, 400}, 330}, 240}
FT
{480 {495 {470 {310 {320 {310 {110 {170 {110
1333
},
1342
De ugyanez a tömb írja le nem csak a felállásokat, hanem például a szögletnél a támadó és a véd˝o viselkedését, azaz tervezett helyezkedését is. A felállások mellett alapértelmezésben tételezünk fel emberfogást is, ezt a hozzárendelést a fogoJatekos tömb rögzíti. 1157
1160 1161 1162 1163 1164 1165 1166 1167
protected int[][] fogoJatekos = { { //0. 3x3x3 <-> 3x3x3 2, // ki megy a kapusra 7, 8, 9, 4, 5, 6, 1, 2, 3 //(ki megy a megfelel˝ o tömbindex˝ ure?) }, { //1. 3x3x3 <-> 3x4x2 1, // ki megy a kapusra 7, 8, 9, 4, 5, 6, 3, 1, 2 //(ki megy a megfelel˝ o tömbindex˝ ure?) }, ...
A
1159
3.1.3.2.
R
1158
A szimuláció futása
A labda a szimuláció során, a korábban ismertetett számos állapotban lehet. A szimuláció ennek az állapotnak a vizsgálatával kezd˝odik.
D
Ha a labda MOZGASBAN van, akkor végigmegyünk az összes játékoson 1858 1859
protected void szimulacio() {
1860 1861
switch (labdaAllapot) {
1862 1863
case MOZGASBAN:
1864 1865 1866 1867
// a játékosok mozgása for (int j = 0; j < jatekosok[kiLep].length; ++j) { if (j != lcJatekos) { // csapaton belüli játékosokon
1868
és minden játékos esetén el˝ovesszük az adatait 1868 1869
jx = jatekosok[kiLep][j][0];
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
9 / 19
jy = jatekosok[kiLep][j][1]; jcx = jatekosok[kiLep][j][2]; jcy = jatekosok[kiLep][j][3]; jsebNegyzet = jatekosok[kiLep][j][6];
1870 1871 1872 1873
a jelen és tervezett cél pozíciójából, sebességéb˝ol kiszámoljuk a következ˝o aktuális pozícióját, egészen pontosan az aktuálisat inkrementáljuk egy el˝ojelen növekménnyel. 1873
jdy2 = (jsebNegyzet * (jcy - jy) * (jcy - jy)) / ((jcx - jx) * (jcx ←- jx) + (jcy - jy) * (jcy - jy) + 1); jdx2 = jsebNegyzet - jdy2;
1874
1875 1876
jdx = gyok(jdx2) + 1; jdy = gyok(jdy2) + 1;
1877 1878
FT
1879
int jdxs = Math.abs(jcx - jx);
1880 1881
jdx = jdxs / jdx + 1; jdy = Math.abs(jcy - jy) / jdy + 1;
1882 1883 1884
jatekosok[kiLep][j][0] += ((jcx - jx) / jdx); jatekosok[kiLep][j][1] += ((jcy - jy) / jdy);
1885 1886
majd arról gondoskodunk, hogy a következ˝o kirajzoláskor a játékos mozgásának megfelel˝o mozgásfázis keretét rajzoljuk majd ki: 1157
if (jdxs != 0) { jatekosok[kiLep][j][7] = ((jcx - jx) / jdxs + 1) / 2 * 10 + ( ←ido + j) % 9; // *hol kezd˝ odik a 2. garnitúra futás // %hány kép a futás animáció } else { jatekosok[kiLep][j][7] = 20; }
A
1158 1159
1160 1161 1162 1163
R
1164
s ugyanezeket megtesszük a másik csapattal is. Majd a labda mozgásáról gondoskodunk 1933 1934 1935
D
1936
// a labda mozgása ldy2 = (lsebNegyzet * (lcy - ly) * (lcy - ly)) / ((lcx - lx) * (lcx - lx) + ←(lcy - ly) * (lcy - ly) + 1); ldx2 = lsebNegyzet - jdy2;
1937 1938 1939
ldx = gyok(ldx2) + 1; ldy = gyok(ldy2) + 1;
1940 1941 1942
ldx = Math.abs(lcx - lx) / ldx + 1; ldy = Math.abs(lcy - ly) / ldy + 1;
1943 1944 1945 1946
lx += ((lcx - lx) / ldx); ly += ((lcy - ly) / ldy); // a labda mozgása
miután a labda új pozíciót vesz fel, megnézzük, hogy történt-e valami esemény: gól, szöglet stb. Tehát ha a labda elhagyta a játékteret, akkor lehetett gól: 1947 1948
// kint van?
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
10 / 19
1949 1950 1951
if (lx < 0) { // elég redundáns itt a kód, annek ellenére, hogy a // tennivaló szimmetrikus a két fél esetében csak nem akartam vagyolni // az itteni if-ben
1952 1953
if (gol()) {
1954
golorom(SAJAT); // ki kapta, ez biztos, mert tudjuk, hogy // melyik oldalon van a labda, hogy ki rugta, az mar nem // ennyire egyertelmu... return;
1955 1956 1957 1958
vagy szöglet, ha mi rúgtuk ki 1958
1960 1961
} else if (kiLep == SAJAT) { // szoglet kiLep = ELLEN;
1962
if (ly < 284) { szoglet(3); } else { szoglet(0); }
1963 1964 1965 1966 1967 1968
return;
1969 1970
illetve kirúgás, ha az ellenfél: 1971 1972
A
1970
} else if (kiLep == ELLEN) { //kirugas
1973 1974
kiLep = SAJAT;
1975
1977
lbJatekos = 0; labdaAllapot = KIRUGAS;
R
1976
FT
1959
ha a labda nem ment ki, akkor meglehet, hogy éppen véget ér egy átadás, vagy az ellenfél szemfüles játékosa elcsípi a labdát, ennek vizsgálata következik. Ha itt a feltétel teljesül, azaz megfelel˝oen közelre ér a labda ahhoz, akinek az átadást szánták, akkor leveszi a labdát és vezetni kezdi. 2060 2061 2062
D
2063
// átvesz, elvesz if (lTavolsag(jatekosok[kiLep][lcJatekos][0], jatekosok[kiLep][lcJatekos][1]) < 10) { // 9 volt eddig
2064 2065 2066
lbJatekos = lcJatekos; labdaAllapot = VEZETVE;
2067 2068 2069
tamad(kiLep); ...
Ha a különben ág teljesül, akkor az ellen elcsípte a labdát:
2081 2082
} else { // megszerzi az ellenfél az átadást
2083 2084 2085
2086
masikCsapat = (kiLep + 1) % 2; for (int j = 0; j < jatekosok[masikCsapat].length; ++j) { // csapaton belüli játékosokon
←-
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
if (lTavolsag(jatekosok[masikCsapat][j][0], jatekosok[masikCsapat][j][1]) < 82) {
2087 2088 2089
kiLep = masikCsapat;
2090 2091
lbJatekos = j;
2092 2093
tamad(kiLep);
2094
Ezzel röviden áttekintettük, mi történhet a labdával, ha mozgásban van. További állapotokat nem vizsgálunk részletesen, csak felvillantjuk a VEZETVE állapot elejét. Itt azt láthatjuk, hogyan érvényesítjük a felállás mellett az emberfogást. 2225
2227
lki = (lki + 1) % 3;
2228 2229
FT
case VEZETVE:
2226
// fogó játékos rámegy masikCsapat = (kiLep + 1) % 2; jatekosok[masikCsapat][fogoJatekos[seFelallas][lbJatekos]][2] = jatekosok[ ←kiLep][lbJatekos][2]; jatekosok[masikCsapat][fogoJatekos[seFelallas][lbJatekos]][3] = jatekosok[ ←kiLep][lbJatekos][3]; // fogó játékos rámegy
2230 2231 2232
2233
2234 2235
3.1.4.
A
// a játékosok mozgása
2236
A Hetedik Szem NYFK bitmintáinak elemzése
Vezérlésben nincs újdonság a korábban tárgyalt két játék és e között. Ami viszont említést érdemel, az a felvett tudat-lenyomatok összehasonlítása, ezt nézzük meg ezekben az elkövetkez˝o pontokban.
R
Ennél a játéknál különösen indokolt a mobil használata, hiszen használata során feltételezzük, hogy a játékos egy megváltozott tudatállapotban, azaz mondjuk relaxálva „játszik”, s közben szabad akaratából nyomja a t˝uzgombot vagy nem nyomja a vizsgált id˝oszeletben. Döntéseib˝ol összeállítunk egy 2048 bites bináris mintát, az adott felvételi kontextust jellemz˝o úgynevezett „tudatlenyomatot”. Kérdés, hogyan tudjuk értelmes módon összehasonlítani az ilyen mintákat. Ezt a kérdést részletesen tárgyaljuk a szerz˝o [PHD] dolgozatában. Most elég annyi, hogy a például az [ALGORITMUSOK] könyvben is ismertetett Ziv-LempelWelch (LZW) algoritmus szófáját használjuk fel, miközben a [SZTOCHSZT] könyv utalására építünk, miszerint – az ismeretlen adatsorokkal való els˝o ismerkedés során – érdemes összevetni az LZW során épített szófa ághosszainak szórását. Esetünkben, bináris mintáról lévén szó, ez egy bináris fa lesz, amit a TudatFa.java forrás rekurzív szerkezetével építünk fel.
D
61 62
public class TudatFa {
63 64 65
TudatFa bo = null; TudatFa jo = null;
Az említett számításokat a TudatSzamitas.java forrásban végezzük. Az picit nehezítheti a kód olvasását, hogy a mobilon a halomnak mindig híján lévén, bitenként kezeljük a sorozatot, ezt segítik a bajtIndex és a bitIndex változók:
89 90
public TudatFa elemzes(byte [] t) {
91 92 93 94 95 96
// Fakezelés TudatFa gyoker = new TudatFa(); TudatFa fa = gyoker; // Mintán bitenként léptetés int bajtIndex = 0;
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
12 / 19
int bitIndex = 0; byte ertek = 0x01;
97 98
ezzel a megjegyzéssel már könny˝u olvasni, mert bitenként végigszaladunk a mintán: 99
for(int i=0; i>> (8-bitIndex-1))); // Fakezelés if(ertek == 0) {
100 101 102 103 104 105 106 107
if(fa.bo == null) {
109 110
fa.bo = new TudatFa(); fa = gyoker;
111 112 113
} else {
114 115
fa = fa.bo;
116
}
117 118
} else {
119 120
if(fa.jo == null) {
121 122
124 125
} else {
126 127
fa = fa.jo;
128
}
129 130
132
R
} // if(ertek == 0) {
131
} // Mintán bitenként léptetés
133 134
return gyoker;
135 136
A
fa.jo = new TudatFa(); fa = gyoker;
123
FT
108
}
miközben felépítjük az LZW algoritmusnak megfelel˝o szófát és visszaadjuk a felépített fa gyökerének referenciáját.
D
Az elkészített fát a klasszikus módon járjuk be 1 az elemzések során. Egy ilyen bejárást mutat például az ághosszak hosszának átlagát kiszámoló atlag függvény.
137 138 139 140
// az atlag() hívásakor is inicializálni kell ˝ oket, a // a rekurziv bejárás használja ˝ oket int atlagosszeg = 0, melyseg = 0, atlagdb = 0;
141 142
public void atlag(TudatFa fa) {
143
if(fa != null) { ++melyseg; atlag(fa.bo); atlag(fa.jo);
144 145 146 147
1 Ha
esetleg nem ismered ezt a bejárási módot, megtalálod a klasszikus [KERNIGHANC] C programozási tankönyvben.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
13 / 19
--melyseg;
148 149
if(fa.bo == null && fa.jo == null) {
150 151
++atlagdb; atlagosszeg += melyseg;
152 153 154
}
155 156
}
157 158 159
}
A FT
Az elemzést (tehát a fa felépítését és az ághosszak szórásának kiszámítását) mint id˝oigényes, tehát a felületet blokkolni képes tevékenységet, egy párhuzamos szálban valósítottuk meg: 183 184 185 186 187
/* * LZW fa ághosszainak átlaga és szórása, Hamming táv. */ public void run() {
188
// utólag bevett F próbához a korrigált empirikus szórásnégyzetek double szorasn1, szorasn2, szorasn3, szorasn4;
189 190 191
// LZW fák felépítése és feldolgozása
192 193
/* I. normál görbe */
194 195
/* LZW fa felépítése */ TudatFa gyoker = elemzes(midlet.tudatLenyomat[0][0]);
196 197 198
/* Átlagos szóhossz kiszámítása */ atlagosszeg = 0; melyseg = 0; atlagdb = 0; atlag(gyoker); atlag1 = atlagosszeg/atlagdb;
199 200 201 202 203
szoszam1 = atlagdb;
D R
204 205
/* Ághosszak szórásának kiszámítása */
206
S˝ot, utólag a szórások vizsgálatára (a két összehasonlított szerepl˝o egy-egy megfelel˝o fájának összehasonlításakor a két fából épített LZW szófa ághosszai szórásainak egyezésér˝ol szóló hipotézist vizsgáló) F statisztikai próbát is készítettünk, ennek beprogramozását a StatProba.java állományban találjuk meg.
3.2.
Továbbfejlesztések
,,Az Úr
Karod er\H{o}s - szíved emelkedett: Végetlen a tér, mely munkára hív,\textquotedblright{} —Madách Imre [EMBER]
Mindhárom játék esetén számos irányt meg tudunk jelölni, amerre érdemes elindulni a módosításokkal, most leírunk néhányat. • A horgász játékban sokszor terveztem, hogy a fárasztás mellé beteszek egy animációt, ami a horgászbot hajlását mutatja.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
14 / 19
• Ugyancsak a horgászban el tudnám képzelni, hogy maga a játék adna lehet˝oséget a horgászhely megadására: a kamerával készítjük magából a játékból a fotót, kettévágjuk szoftverb˝ol és kitesszük a korábban látott, de akkor kézimunkával elvégzett módon. • A focis játékban rögtön adódik számos fejlesztési cél, hiszen a Football(er) Simulation Markup Language (röviden FerSML) (http://sourceforge.net/projects/footballerml/) [FERSML] projektnél felhasználjuk az ezekb˝ol a forrásokból készített el˝ozetes elemzések eredményeit. Egy ilyet fogunk kibontani a következ˝o pontban. • Az ezoterikus játéknál a szerver oldali kiterjesztés lehet különösen érdekes: a minták összegy˝ujtése és elemzése. Eldöntend˝o, hogy lehetne-e a tudatlenyomatokra alapozottan - mondjuk egy közösségi portál keretein belül - egy újfajta kapcsolati hálót létrehozni. Ezek a kérdések Digitális Tudatlenyomatok Összehasonlító Könyvtára és Hetedik Szem alapú közösségi portál címszavak alatt mélyebben ki vannak bontva a [PHD] dolgozatban.
Két gépi játékos a foci játékban
FT
3.2.1.
,,Az Úr
A gép forog, az alkotó pihen. Év-milliókig eljár tengelyén,\textquotedblright{} —Madách Imre [EMBER]
A
Most a focis játékban fogunk egy olyan praktikus változtatást eszközölni, aminek a mobil játék kapcsán igaz nincs sok értelme, de annál inkább használható lesz az említett Football(er) Simulation Markup Language projekthez való tapasztalatgy˝ujtésre. Jelen pillanatban a focis játékban az emberi játékos játszik a gépi játékossal: mindketten a saját csapatuk játékosait irányítják közvetlenül azzal, hogy az átadás orientált játékban direktben megadják, kinek menjen a passz. Azt szeretnénk elérni, hogy a foci szimulátort tudjuk használni nagy számú mérk˝ozés legenerálására. Ehhez ugye az kell, hogy a játék interakcióját elvegyük, azaz ne várjon arra, hogy a játékos bármit nyomjon a felületen. Pontosabban figyelembe veheti a játékos interakcióját, de anélül is fusson automatikusan. Például ne várjon akár 10 percet is azért, hogy a játékos a középkörben a kezd˝orúgással egyáltalán elkezdje a mérk˝ozést, ne várjon egy labda birtokláskor arra, kinek kell átadni, vagy l˝oni: passzoljon vagy akár l˝ojön a játékost képvisel˝o gépi játékos! Ez az átalakítás annyiból viszont érdekes, hogy megismerjük vele immár teljes mélységében a foci szimulátor m˝uködését.
R
Maga az átalakítás egyébként viszonylag egyszer˝u, alig pár helyen kell beavatkoznunk és csupán a FociVaszon.java állomány forrásában. Ezek a (legf˝obb helyek) következ˝ok. A valódi játékos szükségességének megszüntetése 1. Az alábbi VEZETVE ágban 2225
case VEZETVE:
D
2226
találjuk azt a kódrészletet, ami megmondja, mit tegyen az ellenfél játékosa, aki (hiszen) eddig is saját „belátása” szerint játszott.
2307 2308 2309
// ellen taktika if (kiLep == ELLEN) {
2310 2311
2312
int r = rAbs(100); // vigyazni, hogy if(r...) után az r-t használva ←az már az emlitett if-el szurt r! int kinek = 5;
2313 2314
switch (lbJatekos) { //kinek?
2315 2316 2317
case 0: // a kapus nem taktikazik, esz nelkul // passzol valakinek
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
15 / 19
kinek = 7 + (r % 3);
2318 2319
lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek); break;
2320 2321 2322 2323 2324
case 7: // a hatvedsor viselkedese case 8: case 9:
2325 2326 2327 2328
if (r < jatekosok[kiLep][lbJatekos][5]) { // passzol
2329
FT
A játékos mezszáma alapján láthatjuk, ki miként fog viselkedni. Els˝o dolgunk tehát, hogy egy ilyen kódot kell beültetnünk a SAJAT játékosok vezérlésére. A kód láthatóan szimmetrizálható, azaz olyan általánosan van megírva, hogy a saját játékost azonnal hivatkozzák a kiLep és a lbJatekos változók megfelel˝o értékei. Egy probléma viszont lehet. Ha megfigyeljük a csatársor viselkedését leíró kódot: 2361
case 1: // csatársor viselkedése case 2: case 3:
2362 2363 2364 2365
int segedx = jatekosok[kiLep][lbJatekos][0];
2366 2367
// ötösnel közelebb, biztosan rál˝ o //if(segedx < 55 || segedx > PX-55) { a PX- nem kell, mert a terfelek fixek, // majd a sajat lovesnel kell if (segedx < 55) {
2368 2369
A
2370
←-
2371
ahol az 55 egy olyan érték, ami jellemzi a pálya egyik oldalát. S nekünk éppen a másik irányba kellene játszani. Ha így hagyjuk a kódot, akkor a feltételek sosem teljesülnek és a csatáraink ennek megfelel˝oen soha nem rúgnak rá, csak egymás között passzolgatnak, amíg le nem szerelik o˝ ket. A saját csatársornak megfelel˝o értékeket az eseménykezel˝oben, a FIRE gombhoz rendelt 619
621 622 623 624 625 626
if (kiLep == SAJAT) { if (labdaAllapot == VEZETVE) { // kapura lövés int segedx = jatekosok[SAJAT][lbJatekos][0];
D
627
case FIRE:
R
620
részben láthatjuk:
643 644
if (segedx > PX - 55) { // otos vonalan belul
645 646 647
lcx = 1010; lcy = 320 + r(Math.abs(320 - jatekosok[SAJAT][lbJatekos ←][1]) / 2 + 40);
648 649
} else if (segedx > PX - 165) { // 16-os vonalan belul
650 651 652
lcx = 1010; lcy = 320 + r(Math.abs(320 - jatekosok[SAJAT][lbJatekos ←][1]) / 2 + 100);
653 654
// legyen szöglet?
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
16 / 19
if (lcy < 282 || lcy > 358) {
655
Tehát a SAJAT játékosok vezérlésére az alábbi apró módosításokat kell elvégezni a másolt különben ágban:
FT
} // switch } // if ellen // ellen taktika else { . . . case 1: // csatársor viselkedése case 2: case 3: int segedx = jatekosok[kiLep][lbJatekos][0]; . . .
D
R
A
if (segedx > PX - 55) { . . . lcx = 1010; lcy = 320 + r(Math.abs(320 - jatekosok[SAJAT][lbJatekos ←][1]) / 2 + 40); . . . } else if (segedx > PX - 165) { . . . lcx = 1010; lcy = 320 + r(Math.abs(320 - jatekosok[SAJAT][ ←lbJatekos][1]) / 2 + 100); . . . } else if (segedx > PX - 180) { . . . lcx = 1010; lcy = 320 + r(315);
2. Ha ezek után tesztelünk, láthatóan a rögzített helyzetekkel, mint például triviálisan a középkezdéssel baj van. 2206 2207
case KOZEPKEZDES:
2208 2209
lki = 0;
2210 2211
if (kiLep == SAJAT) {
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
17 / 19
2212 2213
// várjuk a játékostól az inputot } else { // ELLEN
2214
int kinek = rAbs(2); kinek = 2 + (2 * kinek) - 1;
2215 2216 2217
lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek);
2218 2219 2220 2221 2222
}
2223 2224
break;
FT
itt láthatóan semmi nem is fog történni addig, amíg nem jön valami input a felhasználótól. Tehát szükséges a beavatkozásunk: egyszer˝uen blokk-másoljuk az ELLEN ág tartalmát! if (kiLep == SAJAT) { // várjuk a játékostól az inputot
/* Vártuk eddig, de most automatizáljuk a játék m˝ uködését: */ int kinek = rAbs(2); kinek = 2 + (2 * kinek) - 1;
A
lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek); } else { // ELLEN
int kinek = rAbs(2); kinek = 2 + (2 * kinek) - 1;
R
lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek);
}
break;
D
3. Ugyanígy kell eljárnunk a KIRUGAS esetén. case KIRUGAS: lki = 0;
if (kiLep == SAJAT) { // várjuk a játékostól az imputot /* Vártuk eddig, de most automatizáljuk a játék m˝ uködését: */ int kinek = 4 + rAbs(3); lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek);
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
18 / 19
} else { // ELLEN int kinek = 4 + rAbs(3); lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek); } break;
if (kiLep == SAJAT) {
FT
4. Még a SZOGLET és a TIZENEGYES esetén kell teljesen hasonlóan eljárnunk és készen is vagyunk, ezután a játék önjáróvá vált! Az utóbbi esetén így festhet az új kód:
jatekosok[ELLEN][0][7] = 19; //25; // oldalt fordul jatekosok[SAJAT][lbJatekos][7] = 9; //12; // oldalt fordul // várjuk a játékostól az imputot
/* Vártuk eddig, illetve ennyi volt eddig, de most automatizáljuk a játék m˝ uködését: */
A
kommentator.delete(0, kommentator.length()); kommentator.append(sajatNevek[SAJAT][lbJatekos]); kommentator.append(Szoveg.ellovi); ++jatekosStat[kiLep][lbJatekos][3]; midlet.startPassz(); lcx = -10; lcy = 320 + r(40);
R
labdaAllapot = MOZGASBAN11;
} else { // ELLEN
vannak igaz számok, de itt már egy kapuzunk, így nincs jelent˝oségük. Az el˝obbi, a SZOGLET esetében pedig így festhet:
D
case SZOGLET: lki = 0;
if (kiLep == SAJAT) { // várjuk a játékostól az inputot /* Vártuk eddig, de most automatizásás: */ int kinek = rAbs(2); kinek = 2 + (2 * kinek) - 1; lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek);
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
19 / 19
} else { // ELLEN int kinek = rAbs(2); kinek = 2 + (2 * kinek) - 1; lcx = jatekosok[kiLep][kinek][0]; lcy = jatekosok[kiLep][kinek][1]; atadas(kinek); } break;
3.3.
A FT
itt láthatóan teljesen ártatlan kódot vágtunk be, hiszen ez tulajdonképpen csak egy speciális átadás.
A fejezet feladatainak összefoglalása
A feladatok mellett feltüntetett szám a feladat általunk feltételezett nehézségére utal. Az egy pont a jegyzetben mutatottak egyszer˝u megismétlését jelenti, a tíz a teljesen egyéni munkát. 1. Készíts olyan változatot a focis játékból, ami nem vesz fel inputot a játékostól, hanem a két csapat automatikusan játszik benne! (10 pont) 2. Változtasd a focis játék feltételeit úgy, hogy az egymással automatikusan játszó csapatok közül az egyik sokkal jobban játsszon! Például jobban passzoljon, szereljen, l˝ojön kapura. (11 pont) 3. B˝ovítsd új elemekkel a foci szimulátort! Például egy szabálytalansággal és a szabálytalanságot követ˝o szabadrúgással. (14 pont) 4. Írd úgy át a horgász játékot, hogy az egyik bot fenekez˝o legyen! (12 pont)
5. Módosítsd úgy a horgász játék RMS (Record Management System) tárolóját, hogy a fogási naplóba elmentse a halfogás helyét is! (13 pont)
D R
6. Módosítsd úgy a horgász játékot, hogy a valódi id˝onek megfelel˝oen legyen nappali és éjszakai horgászat! (14 pont) 7. Készíts Java Servlet alapú szerver oldalt az ezoterikus játékhoz! Tárolja és hasonlítsa össza a többiek mintáival az aktuálisan feltöltöttet és az összehasonlítás eredménye alapján javasoljon ismer˝osöket a feltölt˝onek! (16 pont) 8. Hozz létre a mentális lenyomatokra alapozott új közösségi portált! (19 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
20 / 19
4. fejezet
D R
A FT
A játékok portolása
A FT Kivonat
Ebben a fejezetben a játékok portolására, azaz más környezetre való átalakítására láthatsz példát. Ilyen lehet például a
• Google Android mobil platformjára átírni,
• vagy asztali gépekre, Full Screen API-t használó Java SE, azaz teljes képerny˝os PC-s játékká alakítani
D R
• itt azt nézzük, meg, hogyan tudod a focit Java Appletként, azaz asztali böngész˝oben vagy alkalmazásként futtathatóra átírni.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
„Talk to other programmers; read other programs. This is more important than any book or training course.” —Peter Norvig [TenYears] Teach Yourself Programming In Ten Years
4.1.
Portolás ,,AZ ÚR Mondottam, ember: küzdj és bízva bízzál!\textquotedblright{} —Madách Imre [EMBER]
A FT
A portolás a Java ME világában nem ritka, mert jellemz˝o a platform töredezettsége. Például ha a MIDP 2 (játék API-jának teljes képerny˝os játékvászna) el˝ott a fejleszt˝o teljes képerny˝os játékot szeretett volna készíteni, ezt adott eszközcsalád tekintetében, a gyártó saját API felületét használva meg tudta tenni, más gyártók esetén pedig nem vagy ha valami általános „extra dolog” használata esetén igen, akkor inkompatibilis módon. Nem ismeretlen dolog ez a szabványosítással ellenkez˝o el˝ojel˝u folyamat az informatikában, csak egy példát említve: ugyanezzel küzdött a CORBA világa, amikor az ORB-ket szállító szoftvercégek, természetesen a felhasználói igényeket igyekezve kielégíteni, különböz˝o és nem kompatibilis termékekkel álltak el˝o, ezen a helyzeten segített a hordozható (POA) objektumadapter szabványosítása. De ennél prózaibb esetben is szükség lehet a portolásra: tegyük fel, hogy valami megy sok készüléken, hiba nélkül, de van egy, amin (mondjuk vélhet˝oen memóriakezelési okokból) mégsem. Kísérletezünk azzal, hogy olyan objektum gazdálkodást folytassunk a programozás során, amivel ugyanolyan szépen kéne mennie a programnak az eddigieken és mennie kéne a problémáson is, de eljöhet az id˝o, amikor jobban megéri kettéválasztani a forrásokat és használni valami eszköz specifikus stílust. Ez persze mindig nagyon megterhel˝o extrát jelent a fejlesztésben, de el˝ofordulhat. Ha persze egy másik platformot is megcélzunk a fejlesztéssel, akkor a portolás szükségessége egyértelm˝u.
4.1.1. Android platformos horgász
D R
Ha Androidra akarjuk átírni, az bizony abból a szempontból nem egyszer˝u, hogy ez nem Java ME, de vigasz, hogy legalább Java. Ez még mindig egyszer˝ubb átalakítást jelent, mint mondjuk a Nokia 60-as sorozatbeliekre natívban, azaz Symian C++-ba áttenni. A horgászból egy Androidos portolás egyébként nem túl nehéz, például a korábbi „Nehogy már...” könyv NehogyMar3-as példájából kiindulva elkezdhet˝o a platformmal való ismerkedés. De itt nem tervezzük bemutatni ezt a portolást, mert a jöv˝o félévt˝ol ez lesz a DDN-be való jelentkezés belép˝o feladata. Viszont, mivel a hallgatók többségének probléma a korábbi „Nehogy már...” könyv ezen Androidos példájának felélesztése, így teszünk néhány hasznos megjegyzést. A korábbi „Nehogy már...” könyv Androidos NehogyMar3 példájának felélesztése 1. El˝oször is: használd az Eclipse IDE-t! Sajnos hivatalos NetBeans plugin nincs. Például az Eclipse Classic 3.5.2 megfelel˝o lesz. 2. Az Android telepítésénél járj el a http://developer.android.com/sdk/installing.html utasításai szerint (az Android SDK és az Eclipse környezethez az ADT Plugin kell telepítened). 3. Ha megvan a korábbi „Nehogy már...” könyv, akkor abból sokminden kiderül, ha nincs, akkor a következ˝o ábrák megmondják majd, hogy az innen (http://www.eurosmobil.hu/NehogyMar) letöltött fájlok közül mit és hova másolj be.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
2 / 19
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
3 / 19
4. Mivel a könyv az Android születésekor íródott, így 1.5-ös példáin kicsit patkolnod kell, hogy menjenek a most 2.1-es platformon. Az XML forrásokban hajts végre az els˝o kett˝o, a Java forrásban a harmadik szöveges helyettesítést: • android:layout_toRight helyett android:layout_toRightOf • id helyett android:id
• android.view.animation.Animation.CYCLE helyett android.view.animation.Animation.RESTART
5. S futtatva máris itt az animáció:
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
4 / 19
A jelen „Nehogy már MEGINT...” könyv Androidos NehogyMar4 példája
A példa egy frame alapú animációt valósít meg. „Nehogy már...” szokásainkhoz híven az el˝oz˝o példából kindulva fejlesztjük ki. 1. Els˝o lépésben készítsd el a hozzávalókat, a korábbi könyv Java Game API alapú kereteit tartalmazó képet vágd fel 9 darab 120x150 méret˝u képre. (A jelen jegyzetben ezt a képet itt láttad.)
D R
2. Majd létrehozzuk a NehogyMar4 új projektet.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
R
A
FT
5 / 19
D
3. Felületünket csupán annyiban módosítjuk, hogy a NehogyMar3 esetében használt tenyér képének helyére a futás animálását helyezzük.
Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó er˝ oforrásokat, például képeket) letöltheted a http://www.tankonyvtar.hu címr˝ ol. -->
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
A FT
android:padding="5px"> <Button android:id="@+id/kilep_gomb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/fut" android:layout_toRightOf="@id/fut" android:text="@string/kilep_gomb" /> <Button android:id="@+id/fut_gomb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/fut" android:layout_toLeftOf="@id/fut" android:text="@string/fut_gomb" />
4. Az animációt a fut.xml állományban adjuk meg.
Bátfai Norbert: Nehogy már MEGINT a mobilod nyomkodjon Téged! [email protected]
D R
Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó er˝ oforrásokat, például képeket) letöltheted a http://www.tankonyvtar.hu címr˝ ol. -->
5. Szöveges er˝oforrásainknak csak a nevén változtatunk.
Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó er˝ oforrásokat, például képeket) letöltheted a http://www.tankonyvtar.hu címr˝ ol. --> <string name="app_name">Nehogy már 4 <string name="fut_gomb">Fut <string name="kilep_gomb">Kilépés
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
6. A vászon háttérszínéhez nem nyúlunk.
FT
Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó er˝ oforrásokat, például képeket) letöltheted a http://www.tankonyvtar.hu címr˝ ol. --> #00aa00
D
R
A
7. A felvilantott fut.xml, main.xml, szinek.xml, strings.xml források elhelyezését segíti a következ˝o, az Eclipse Package Explorer füléb˝ol kivágott kép.
8. Java forrásunk némiképp egyszer˝usödik, mert az eseménykezel˝oben csak elindítjuk az el˝okészített animációt (ett˝ol eltekintve a kód megegyezik az el˝oz˝o NehogyMar3 kódjával). /* * NehogyMar3Activity.java * * Bátfai Norbert: Nehogy már MEGINT a mobilod nyomkodjon Téged! * [email protected] * oforrásokat, * Ezt a forrásfájl (és a hozzá esetlegesen kapcsolódó er˝ például képeket) letöltheted a http://www.tankonyvtar.hu * ol. * címr˝ * */
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
8 / 19
package nehogy.mar4; /** o Android programozási példája, bemutat egy * A Nehogy már MEGINT könyv els˝ * frame alapú animációt. */ public class NehogyMar4Activity extends android.app.Activity { android.graphics.drawable.AnimationDrawable frameAnimation;
A FT
/** Az Activity elkészítésekor hívódik. */ @Override public void onCreate(android.os.Bundle bundle) { super.onCreate(bundle); /* on: a NehogyMar3/layout/main.xml fájl tartalma * Mi látszódjon a képerny˝ */ setContentView(R.layout.main); /* Hozzáférünk a képhez, amit animálni akarunk. */ android.widget.ImageView integetoKep = (android.widget.ImageView) findViewById(R.id.fut);
integetoKep.setBackgroundResource(R.anim.fut); frameAnimation = (android.graphics.drawable.AnimationDrawable) integetoKep.getBackground(); /* Hozzáférünk a Fut gombhoz. */ android.widget.Button futGomb = (android.widget.Button) findViewById(R.id.fut_gomb); futGomb.setOnClickListener( new android.widget.Button.OnClickListener() { // Ha a Fut gombra nyomtak, akkor public void onClick(android.view.View v) { frameAnimation.start();
D R
} });
/* Hozzáférünk a kilépés gombhoz. */ android.widget.Button kilepesGomb = (android.widget.Button) findViewById(R.id.kilep_gomb); kilepesGomb.setOnClickListener( new android.widget.Button.OnClickListener() { // Ha a Kilépés gombra nyomtak, akkor public void onClick(android.view.View v) { // befejezzük a futást. finish(); } });
}
}
9. S futtatva máris itt az animáció:
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
9 / 19
D R
Amit bemutatunk egy Motorola Droid készüléken is.
4.1.2.
˝ asztali alkalmazás Teljes képernyos
A teljes képerny˝ossé alakítást közösen nem végezzük el, mert ez a következ˝o Appletes változatból már könnyen el˝oállítható. Ehhez segítségül a Javát tanítok [JT] digitális szakkönyv Java a játékokban: egy teljes képerny˝os példa - Labirintus Játék cím˝u fejezetének tanulmányozását javasoljuk.
4.1.3.
Megvalósítás Java Appletként
Az apletté alakítást viszont most közösen is elvégezzük. Els˝o dolgunk a felhasználói input elnyomása, azaz az el˝oz˝o pontban kidolgozott két gépi játékossá alakítás. Ezt követ˝oen a mobiltelefonos vásznat a leend˝o Applet vásznává alakítjuk. Ez nem könny˝u, mert a mobilos játékban a megjelenítés és a logika nem váltak szét, hanem egy osztályban, a FociVaszon osztályban kerültek megvalósításra. Megoldásunkban a FociVaszon osztályt három osztályra bontottuk, pontosabban két osztályra, ezek az ASApplet (Automated Soccer Applet) és a FootballMatch, melyeket a ViewableField interfész köt össze oly egyszer˝u módon, hogy az ASApplet ennek draw és commentator módszereit implementálja, a FootballMatch osztály pedig konstruktorában megkapja ezt az applet osztályt. Így amikor a futball mérk˝ozés logika szerint történik valami rajzolandó, akkor a tartalmazott applet objektum implementálta említett függvényeket meg tudjuk hívni. Teljes megoldásunkban Automated Soccer Applet név alatt letölthet˝o a FerSML https://sourceforge.net/projects/footballerml/files/Automated%20Soccer%20Applet%20for%20FerSML/ lapjáról.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
10 / 19
4.1.3.1.
Szurkolói avatárok
Az Automated Soccer Applet alkalmazással nem állt meg a focis játék továbbfejlesztése, jelen pillanatban a FerSML platform még mindig ezeken a kódokon alapul, az aktuális változat a Public Resource Football Computing. Ez már arra is lehet˝oséget ad, hogy a szurkolók által megadott XML állományok (avatárok) hajtsák meg a szimulációkat. Ez ugyanúgy Maven forrás csomagban érhet˝o el, mint a Jávácska ONE mobil játékai. Az el˝oz˝o pontban említett osztályok még mindig hangsúlyosak, szerepük változatlan. 65 66
public interface ViewableField {
67
69 70 71 72 73 74
}
draw(); commentator(String msg); setSquadColours(int home, int away); setTeamLogo(int teamIdx, java.awt.Image logo);
A FT
void void void void
68
A módszerek listája két új metódussal b˝ovült a Automated Soccer Applet alkalmazáshoz képest. A setSquadColours metódust is a mobil játék ihlette, egészen pontosan ugyanazt a funkciót valósítja meg, ami a mobilos játékban is megvolt, színezi a csapatok mezét. 69 70 71 72 73
public class FootballMatch implements Runnable, FootballField, Text { protected ViewableField display = null;
Id˝oközben a SFApplet osztály elvesztette indító szerepét, illetve további interfészt, a SimulationType interfészt is megvalósít. Ez a szimulációk típusainak megfelel˝o konstans nevek használatát teszi lehet˝ové az osztályban. 78 79 80
/** A Football Match that must display in this Applet. */ FootballMatch footballMatch;
D R
81
public class SFApplet extends java.applet.Applet implements java.awt.event.KeyListener, FootballField, ViewableField, SimulationType ←{
82 83 84
Az indítás ebben a verzióban a JSFA swinges osztályra hárul. Szurkolói avatárok validálása GNU/Linux alatt
1. Els˝o lépés egy szurkolói avatár elkészítése, az egyszer˝uség kedvéért most letöltünk egyet. Például a Debreceni VSC 2010/2011 Bajnokok Ligája selejtez˝okbeli Basel FC ellen vívott márk˝ozése alapján készítettet: http://footballerml.sourceforge.net/ supporter_avatars/0.0.9/FerSML.Debrecen.avatar.xml $ wget http://footballerml.sourceforge.net/supporter_avatars/0.0.9/FerSML.Debrecen. ←avatar.xml
2. A letöltött XML állománynak egy Relax NG kompakt szintaxissal megfogalmazott nyelvtan szerint kell érvényesnek lennie. Az ilyen nyelvtanok alapján történ˝o validálást a jing-trang 20091111 verzójával tudjuk elvégezni. Innen töltsük le: http://jing-trang.googlecode.com/files/jing-20091111.zip Az alábbi két paranccsal letöltjük és kitömörítjük a jing csomagot. $ wget http://jing-trang.googlecode.com/files/jing-20091111.zip $ unzip jing-20091111.zip
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
3. Az avatár fájlokban tipikusan használt XInclude hivatkozások feloldásához szükségünk van a Xerces2 Java csomagra, töltsük le például err˝ol a tükörr˝ol: http://xenia.sote.hu/ftp/mirrors/www.apache.org//xerces/j/Xerces-J-bin.2.10.0.zip Az iménti lépéshez hasonlóan letöltjük és kicsomagoljuk a Xerces-t. $ wget http://xenia.sote.hu/ftp/mirrors/www.apache.org//xerces/j/Xerces-J-bin.2.10.0. ←zip $ unzip Xerces-J-bin.2.10.0.zip
4. Megvan mit akarunk levalidálni és megvan, amivel. Kell még az a nyelvtan, ami szerint validálni szeretnénk. Ezt a FerSML projekt SourceForge.net lapjáról töltjük le: https://sourceforge.net/projects/footballerml/files/Football%28er%29%20Simulation%
5. Nincs más hátra, mint kiadni a validáló parancsot.
FT
$ wget https://downloads.sourceforge.net/project/footballerml/Football%28er%29%20 ←Simulation%20Markup%20Language/FerSML0.0.9.zip $ unzip FerSML0.0.9.zip
$ java -Dorg.apache.xerces.xni.parser.XMLParserConfiguration="org.apache.xerces.parsers ←.XIncludeParserConfiguration" -classpath jing-20091111/bin/jing.jar:xerces-2_10_0/ ←xercesImpl.jar com.thaiopensource.relaxng.util.Driver -c 0.0.9/FerSML.avatar.rnc ←FerSML.Debrecen.avatar.xml
D
R
A
Az a jó, ha semmi választ nem ad a program, ez a jó UNIX filozófia1 szerint annyit tesz, hogy minden rendben. Tegyél egy próbát, rontsd a szurkolói avatár XML állományát, például törölj ki egy bezáró XML elemet és futtasd újra a parancsot!
A Public Resource Football Computing felélesztése GNU/Linux alatt 1. Az el˝oz˝o feladat validálási parancs el˝otti lépéseire most is szükséged van, hiszen a Public Resource Football Computing maga is elvégzi a GUI felületr˝ol a validálást. S természetesen kell maga FerSML projekt aktuális Public Resource Football Computing változata. Ez egy maven forrás csomag, amit a SourceForge.net lapjáról tölthetsz le: https://sourceforge.net/projects/footballerml/files/Public%20Resource%20Football%20Computing/ 1A
program hasznos épít˝okocka lehet mindenféle parancssorok felépítésében.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
12 / 19
$ wget --no-check-certificate https://downloads.sourceforge.net/project/footballerml/ ←Public%20Resource%20Football%20Computing/PublicResourceFCforFerSML-0.0.14-project. ←zip $ unzip PublicResourceFCforFerSML-0.0.14-project.zip
2. A már megismert módon készítheted el˝o futtatásra a projektet. $ cd PublicResourceFCforFerSML-0.0.14 $ mvn package
A FT
3. Végül nem marad más hátra, mint kiadni az indító parancsot.
D R
$ java -Dorg.apache.xerces.xni.parser.XMLParserConfiguration="org.apache.xerces.parsers ←.XIncludeParserConfiguration" -classpath ../jing-20091111/bin/jing.jar:../xerces-2 ←_10_0/xercesImpl.jar:target/PublicResourceFCforFerSML-0.0.14.jar hu.javacska.jsfa. ←JSFA
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
13 / 19
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
14 / 19
Szurkolói avatárok validálása és a Public Resource Football Computing felélesztése Windows alatt
1. Windows alatt egészen pontosan ugyanúgy kell eljárnod, mint ahogyan az imént GNU/Linux alatt bemutattuk. Azzal a különbséggel, hogy ebben az esetben a perek fordítva d˝olnek és kett˝ospont helyett pontosvessz˝ot írsz. Ezért csak a grafikus programot indító utolsó parancsot mutatjuk be.
D R
C:\Users\Norbi\Documents\TAMOP\PublicResourceFCforFerSML-0.0.14>java -Dorg.apache. ←xerces.xni.parser.XMLParserConfiguration="org.apache.xerces.parsers. ←XIncludeParserConfiguration" -classpath ..\jing-20091111\bin\jing.jar;..\xerces-2 ←_10_0\xercesImpl.jar;target\PublicResourceFCforFerSML-0.0.14.jar hu.javacska.jsfa. ←JSFA
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
15 / 19
4.2.
A fejezet feladatainak összefoglalása
1. Készíts Appletes portolást a focis játékból! (13 pont) 2. Készíts egy szurkolói avatárt és validáld parancssorban! (6 pont) 3. Készíts egy szurkolói avatárt és validáld a Public Resource Football Computing programmal! (6 pont) 4. Készíts teljes képerny˝os (Java Full Screen API alapú) portolást a focis játékból! (17 pont)
D R
A FT
5. Portold Androidra a focis játékot! (18 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
16 / 19
rész III
D R
MELLÉKLET
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
17 / 19
D R
A FT
Ebben a mellékletben gy˝ujtöttük össze a könyv azon részeit, amelyeket fontosnak éreztünk szerepeltetni, de korábbra beillesztve sokat rontott volna a jegyzet elképzelt kerekségén vagy olvashatóságán.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
18 / 19
5. fejezet
D R
A FT
Funkcionális képerny˝oképek
A FT Kivonat
Ebben a fejezetben bemutatjuk a játékok tipikus képerny˝oképeit: • 13 képet a 110% Nyári Kapitális NYFK játékból • 24 képet a Focijáték Neked NYFK játékból
D R
• és 10 képet a Hetedik Szem NYFK játékból.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
5.1.
Játék gráfok
A következ˝o három pontban felvillantjuk a játékok tipikus képerny˝oképei közül a leggyakoribbakat, s két képenként néhány mondatban megjegyzéseket is f˝uzünk a képekhez.
Funkcionális pillanatképek a 110% Nyári Kapitális NYFK játékból
A FT
5.1.1.
5.1. táblázat. A 110% Nyári Kapitális NYFK induló splash képerny˝oje
D R
A játék egy splash képerny˝ovel indul. Ez mindhárom játékra igaz, bár ezek nem valódi splash képerny˝ok, inkább csak a divat miatt kerültek a játékok elejére, hiszen egyik játék sem végez olyan hosszabb ideig tartó betöltést, amely indokolná a valódi használatukat. Ennek megfelel˝oen nem is külön szálban kerültek megvalósításra, hanem az els˝o induláskori betöltés alól változtatjuk az állapotjelz˝o értékét. A jobb oldali képen az innen elér˝o parancsokat mutatjuk meg.
5.2. táblázat. A 110% Nyári Kapitális NYFK Névjegy parancsának részlete
A Névjegy parancsot választva a program névjegyében a licenccel kapcsolatos információkat látjuk. Jobbra a szerelék összeállítását mutató u˝ rlapot. Itt a csali kiválasztásával folytatódik a szerelék összeállítása, illetve a játék vásznán a horgászhelyet látjuk. Ugyancsak a horgászhely, de mindkét botunk bedobva. A jobb oldali képen a telepített halak listája, ez fogási naplóként is szolgál, jelenleg üres, nincs semmi „kifogva” felirattal megjelölve.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
2 / 19
D R
5.3. táblázat. Csalizás a 110% Nyári Kapitális NYFK játékban
5.4. táblázat. A 110% Nyári Kapitális NYFK játék horgászhelye
5.5. táblázat. Halradar és kapás a 110% Nyári Kapitális NYFK játékban
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
3 / 19
5.6. táblázat. A 110% Nyári Kapitális NYFK játék horgász vásznán elérhet˝o parancsok
Halradar segíti a csali ígéretes helyre való bedobását. A másik képen egy b˝odületes nagy kapás van a bal oldali boton!
D R
Kapás a jobb oldalon is, illetve a vásznon él˝o parancsokat listáztuk.
5.7. táblázat. A madárdal ki-/bekapcsolásának lehet˝osége a 110% Nyári Kapitális NYFK játékban
És a néhány telefonon akár kellemetlenül is megszólalni képes madárdalt ki is tudjuk kapcsolni.
5.1.2.
Funkcionális pillanatképek a Focijáték Neked NYFK játékból
Bár itt több a képer˝oforrás, de a splash képerny˝o szerepe ugyanaz, mint a horgásznál. Ennél a játéknál láthatóan több parancsot használunk, illetve jobb oldalon a szokásos névjegy részlet. Listázhatjuk a saját csapatunk tagjainak aktuális labda technika, játék érzék és gyorsaság értékeit. A másik képen az eddigi VB-k statisztikáit látjuk. A bal oldalon az aktuális VB-t jellemz˝o adatokat mutattuk meg, a jobb oldalon az egyik „fan funkció”, a képkészítés a játékosról a telefon kamerájával. Itt az elkattintott képet látjuk, illetve a játék induló képerny˝ojét, ahol vagy a VB egy korábban félbehagyott mérk˝ozését folytathatjuk, vagy elölr˝ol indul éppen valamelyik. Ezen a képen az itt aktuális parancsokat mutattuk meg, illetve lekértük a VB menetrendjét.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
4 / 19
D R
5.8. táblázat. A splash képerny˝o a Focijáték Neked NYFK játékban
5.9. táblázat. A 110% Nyári Kapitális NYFK játék induló képerny˝ore helyezett parancsai
5.10. táblázat. Saját játékos labda technika, játékérzék és gyorsaság értékei Focijáték Neked NYFK játék foci szimulátorában
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
5 / 19
D R
5.11. táblázat. A Focijáték Neked NYFK játékban a telefon kamerája is fontos szerepet kap
5.12. táblázat. Indul egy mérk˝ozés Focijáték Neked NYFK játékbeli VB-n
5.13. táblázat. Ki-kivel játszik az aktuális sorsolás szerint a Focijáték Neked NYFK játékban
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
6 / 19
D R
5.14. táblázat. Olasz-brazil mez˝onyjáték a Focijáték Neked NYFK játékban
5.15. táblázat. Az aktuális olasz-brazil mérk˝ozés statisztikái Focijáték Neked NYFK játékban
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
Az olasz-brazil meccs mez˝onyjátékát és egy brazil gólt látunk.
A FT
A következ˝o mérk˝ozést ajánlja a játék, illetve az aktuális olasz-brazil statisztikáit (passzok, szerelések, gólok, lövések száma alakjában) mutatja.
5.16. táblázat. Új mérk˝ozés: indul a svéd-angol a Focijáték Neked NYFK játék VB-jének valóságában
D R
Indul a következ˝o meccs: a svéd-angol, illetve egy mez˝onyjátékot mutató kép nagyobb pályaméret nézetet kérve.
5.17. táblázat. Egy angol szöglet Focijáték Neked NYFK játékban
Ugyancsak mez˝onyjáték, illetve egy angol szöglet.
Egy védés a német-amerikai meccsr˝ol, illetve mez˝onyjáték a brazil-angolról. Egy tizenegyes párbaj és a mérk˝ozés végének mutatása az amerikai-angol összecsapásról.
5.1.3.
Funkcionális pillanatképek a Hetedik Szem NYFK játékból
Az el˝oz˝o két játék kapcsán is megemlített (a horgász esetén meg is indokolt) indító képerny˝o és azok parancsai láthatóak itt. A leíró képerny˝ok közül a szokásos, a játék névjegyének licenccel kapcsolatos részletét listázót mutatjuk, illetve a játék f˝o vászontartalma: egy grafikus menü a jobb oldalon. A vászon választható parancsai láthatóak. Bal oldalon a minta rögzítése, jobb oldalon az elemzés és a hipotézis vizsgálat eredménye szövegesen.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
8 / 19
D R
5.18. táblázat. Egy védés a német-amerikai meccsen Focijáték Neked NYFK játékban
5.19. táblázat. Tizenegyes párbaj Focijáték Neked NYFK játékban
5.20. táblázat. A Hetedik Szem NYFK játék indulása
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
9 / 19
D R
5.21. táblázat. A Hetedik Szem NYFK grafikus vászonra rajzolt menüje
5.22. táblázat. A Hetedik Szem NYFK vásznának parancsai
5.23. táblázat. A tudat-lenyomatok vizsgálata a Hetedik Szem NYFK játékban
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
10 / 19
5.24. táblázat. A tudat-lenyomatok vizsgálatának megjelenítése a Hetedik Szem NYFK játékban
D R
S ugyanez grafikusan box diagramal. (A diagramok és az elemzés matematikai hátterér˝ol részletesen a szerz˝o doktori disszertációjában olvashatsz [PHD].)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
6. fejezet
D R
A FT
A Google Android platform
A FT Kivonat
Ebben a fejezetben
• Kicsit közelebbr˝ol megismerkedsz a Google Android platform GNU/Linux kernelével
D R
• API szinten megismersz néhány tipikus Androidos Java példát.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
6.1.
A GNU/Linux kernel
6.2.
Az Androidos API-k használata
A korábbi pontokban már foglalkoztunk az Android fejleszt˝oi környezetének telepítésével, de a laboron szerzett tapasztalatunk azt mutatja, hogy érdemes ezt az aktuális verziókkal felfrissíteni, amit meg is teszünk rögtön az els˝o példa kapcsán.
6.2.1.
A városi hangya
A városi hangya példa felélesztése.
A FT
A példa elnevezésének ötletét at adta, hogy a bejárt utat jelöljük a térképen, ahogyan a hangyák feromon nyomot hagynak azon az úton, amelyet bejárnak. Látványos képeket tudtunk elkapni ebben a példában, amikor például autóbuszon teszteltük, ennek felvételét megtekintheti a kedves olvasó a YouTube-on is: http://youtu.be/QStgBZ6JfAU. Maga a példa elkészítése a hivatalos tutoriál „Hello, MapView” példáján alapszik és attól csak kevéssel bonyolultabb.
1. Szokásosan az Eclipse IDE-t használjuk. Most éppen az Eclipse Classic 3.7.2 az aktuális. A lerántott eclipse-SDK-3. 7.2-linux-gtk-x86_64.tar.gz állományt tömörítsd ki: [norbert@matrica Downloads]$ gunzip eclipse-SDK-3.7.2-linux-gtk-x86_64.tar.gz [norbert@matrica Downloads]$ tar xvf eclipse-SDK-3.7.2-linux-gtk-x86_64.tar
miután az eclipse/eclipse paranccsal indíthatod is a fejleszt˝oi környezetet.
2. Az Android SDK-t a http://developer.android.com/sdk/installing.html címr˝ol töltjük le, kicsimagoljuk [norbert@matrica Downloads]$ gunzip android-sdk_r18-linux.tgz [norbert@matrica Downloads]$ tar xvf android-sdk_r18-linux
majd a kicsomagolt gyökérben lév˝o Readme fájl utasítása szerint parancssorból izzítjuk be az SDK-t, ez azért id˝oben eltart egy darabig (amelyik API-hoz a telepít˝o fejleszt˝oi szájtos authentikációt kér, azt néhány üres enterrel át tudod ugrani).
D R
[[norbert@matrica Downloads]$ cd android-sdk-linux/ [norbert@matrica android-sdk-linux]$ tools/android update sdk --no-ui
3. A következ˝o lépés az Android ADT Plugin telepítése, ezt már az Eclipse környezetben kell megtenned, a telepít˝o doksi utasításai szerint járj el! Ez egyszer˝uen ADT Plugin néven a https://dl-ssl.google.com/android/eclipse/ tároló szokásos hozzáadását jelenti az IDE-ben a Install New Software alatt a Help f˝omenüpontban. Néhány sikeres kattintás után a ADT Plugin telepítése újraindítja az IDE-det, miután néhány további kattintással elvégzed a plugin konfigurálását. Amit kés˝obb a Preferences alatt a Window f˝omenüpontban is megtehetsz. A következ˝o képen mutatjuk azokat az API-kat, amelyeket az el˝oz˝o lépésben feltett SDK-val letöltöttünk.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
2 / 19
6.1. ábra. Az Android SDK letöltött API-jai.
4. Következhet a Városi hangya példa felélesztése, a New/Project... alatt a File f˝omenüpontban kell megadnod néhány adatot. Például az alkalmazásod nevét, csomagjának nevét. Ezek a beállítások a megnyíló párbeszédablakokban meguktól értet˝odnek. Ezután a /home/norbert/workspace/VarosiHangya/src/varosi/hangya könyvtárba (ami nálam a norbert felhasználói névb˝ol, a VarosiHangya projekt névb˝ol és a varosi.hangya csomagnévb˝ol adódik) másolhatod a VarosiHangyaActivity.java, VarosiHangyaItemizedOverlay.java és a VarosiHangyaLocationL java Java forrásokat (amelyeket itt találsz meg). Az XML er˝oforrásokat talán egyszer˝ubb az IDE-ben kitölteni.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
3 / 19
6.2. ábra. A Városi hangya projekt létrehozása.
D R
Két telefonon fogjuk tesztelni az alkalmazást. Egy Motorola Droidon és egy LG Optimus 2X készüléken. El˝obbin néhány kattintás után láthatjuk, hogy 2.2.1 Anrdoid rendszer, az utóbbin Android 2.2.2 rendszer van. Továbbá a Google Maps APIt használja az alkalmazásunk, ezért Google APIs 2.2 platformot jelöljük meg célplatformként. Ez egyben egy API szint választását is jelenti, ez mindig egy egész szám, most a 8. Jelen pillanatban ezek a szintek 1-t˝ol 14-ig választhatóak, majd a android:minSdkVersion és a android:targetSdkVersion tulajdonságok kitöltésénél magunk is megadunk API szinteket.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
4 / 19
6.3. ábra. Milyen célplatformra fejlesztjük az alkalmazást?
D R
El˝ore láthatólag semmit sem használunk majd, ami nem lenne már meg a hetes Google API-ban is, így a android:minSdkVersion értékét most erre állítjuk.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A
FT
5 / 19
6.4. ábra. A VarosiHangyaActivity megadása.
5. Az XML er˝oforrásokat talán egyszer˝ubb az IDE-ben kitölteni. Az AndroidManifest.xml állományban (bal oldalon a Project Explorer fülben kiválasztva, a jobb oldali munkaterületen a megnyílása után az XML nézet fület választva) az állomány tartalma a következ˝o legyen:
R
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="varosi.hangya" android:versionCode="1" android:versionName="0.0.11" >
D
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-library android:name="com.google.android.maps" />
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
Ebben az állományban az alkalmazás számos tulajdonságát állítjuk be. Az android:versionName értékét érdemes módosításonként emelni, hogy könnyebb legyen a tesztelés a valódi készüléken. A android:minSdkVersion és a android:targetSdkVersion tagokkal azt közöljük, hogy a nyolcas platformot céloztuk meg a fejlesztéssel és legalább hetesnek kell lennie a telefonnak, amelyre telepíteni akarjuk. Az android.permission.ACCESS_FINE_LOCATION és az android.permission.INTERNET manifeszt engedélyek azt jelzik, hogy az alkalmazásunk szeretne hozzáférni az Internethez és a GPS-hez. Végül az alkalmazás minden aktivitijét is le kell írnunk itt.
FT
6. Szintén az IDE-ben (a bal oldalon a Project Explorer fülben kiválasztva) a layout/main.xml az alábbiak szerint készítsük el.
A
R
<Button android:id="@+id/kilep" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="@string/kilep_gombra" />
D
ahol az android:apiKey értéke egy API kulcs, amelyet ezen a címen igényelhetsz. Ehhez annak a tanúsítványnak (ez van a debug.keystore-ban) az MD5 ujjlenyomatát kell beküldenünk a regisztrációs formon, amellyel majd aláírjuk az alkalmazásunkat. [norbert@matrica ~]$ cd .android/ [norbert@matrica .android]$ keytool -list -keystore debug.keystore -V Enter keystore password:
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
***************** WARNING WARNING WARNING ***************** * The integrity of the information stored in your keystore * * has NOT been verified! In order to verify its integrity, * * you must provide your keystore password. * ***************** WARNING WARNING WARNING ***************** Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry
A FT
Alias name: androiddebugkey Creation date: Apr 12, 2012 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US Serial number: 525e2768 Valid from: Thu Apr 12 11:45:42 CEST 2012 until: Sat Apr 05 11:45:42 CEST 2042 Certificate fingerprints: MD5: F7:64:A6:B5:3C:C7:96:BB:1F:CC:27:9D:B9:11:BC:95 SHA1: A6:2E:27:EA:51:F4:9D:66:83:72:5F:7B:07:8A:77:16:3F:04:BC:01 SHA256: 23:13:7C:3C:0D:8C:9F:56:D7:11:B4:12:C2:F3:46:C0:12:DA:1E:69:49:E6:1E:4 ←D:0A:7C:F1:7B:A2:80:35:B9 Signature algorithm name: SHA256withRSA Version: 3 Extensions:
.’.........).:.N ..Cq
D R
#1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 92 27 A9 E9 B6 9F B5 BA B4 8A 8B 29 85 3A D1 4E 0010: 05 EF 43 71 ] ]
******************************************* *******************************************
Ebben a -V kapcsolóval kért kimenetben az MD5:
F7:64:A6:B5:3C:C7:96:BB:1F:CC:27:9D:B9:11:BC:95
sor az MD5 ujjlenyomat.
7. Ugyancsak az IDE-ben (a bal oldalon a Project Explorer fülben kiválasztva) a values/strings.xml állományt így szerkesszük meg: <string name="app_name">Városi hangya <string name="kilep_gombra">Kilépés <string name="udv">Mozogj és mutatom, nagyíthatsz, ha a képerny˝ ore böksz.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
8 / 19
8. A res/drawable- * könyvtárakba másoljunk be egy képet jatekos.png néven, a focis projektben szerepl˝o egy játékos megteszi, amelyet külön innen is letölthetsz. (De találsz ezekben a különböz˝o könyvtárakban különböz˝o méret˝u Android robot képeket, ezekb˝ol lesz az alkalmazás ikonja, akár ezt is beteheted a példa els˝o kipróbálásra, a NorbARActivity. java állományban a jatekos képnév lecserélésével.) Viszont feln˝ove alkalmazásunk nevéhez a Jávácska projekt egy hangyáját használjuk fel a térképen és az alkalmazás ikonjaként is.
A FT
6.5. ábra. Az alkalmazás és a térkép ikonja. 9. Ha minden jól ment, innent˝ol már nem látsz automatikusan generálódó hibajelzéseket az IDE-ben. Ha mégis, akkor azt persze javítanod kell. Ilyen lehet például, ha a Properties/Java Compiler alatt a Project f˝omen˝opontban a Compiler compilance level-nek nem az 1.6 van beállítva, mert innent˝ol van annotálás a Javában, amelyet mi is használunk a kódban (a android.location.LocationListener interfészt implementáló metódusok jelölésénél a NorbARLocationListener osztályban). Ha tehát nincs hiba, jöhet egy Ctrl+F11 kombóval a futtatás.
D R
10. A Ctrl+F11-re, ha még a AVD Manager alatt a Window f˝omen˝opontban nem állítottál be Android Virtual Device-t, akkor most kell megtenned.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
D R
A FT
9 / 19
6.6. ábra. Egy AVD beállítása.
11. S ha minden jól ment, akkor máris láthatod az eredményt a szimulátorban:
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
10 / 19
6.7. ábra. A Városi hangya példa a szimulátorban, éppen a DEIK új épületének tetején állok.
12. A következ˝o lépés az elkészített példa valódi telefonra töltése. A Google Maps API használata itt annyiban nehezíti meg a dolgunkat, hogy ahhoz a tanúsítványhoz, amellyel majd aláírjuk az alkalmazásunkat kell kérnünk egy új API kulcsot. A teszteléshez, a kért debug.keystore-beli tanúsítványhoz kapott API kulcs itt nem megfelel˝o (ezt onnan fogod tapasztalni, hogy az eddig most használt a debug release-t feltöltve a telefonra, a térkép szolgáltatást nem tudod igénybe venni, csak a szürke háttér látszik majd a térkép helyett).
D R
[norbert@matrica ~]$ cd .android/ [norbert@matrica .android]$ keytool -genkey -alias vh -keystore varosihangya.keystore Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: Norbert Batfai What is the name of your organizational unit? [Unknown]: DEIK What is the name of your organization? [Unknown]: University of Debrecen What is the name of your City or Locality? [Unknown]: Debrecen What is the name of your State or Province? [Unknown]: HB What is the two-letter country code for this unit? [Unknown]: HU Is CN=Norbert Batfai, OU=DEIK, O=University of Debrecen, L=Debrecen, ST=HB, C=HU ←correct? [no]: yes Enter key password for (RETURN if same as keystore password): [norbert@matrica .android]$
Ezzel megvan az önmagunk által aláírt tanúsítványunk.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
13. Most az elkészített tanúsítványhoz ugyanúgy kérünk API kulcsot, ahogyan azt a debug.keystore-beli esetén tettük. [norbert@matrica .android]$ keytool -list -keystore varosihangya.keystore -V Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry
Extensions:
A FT
Alias name: vh Creation date: Apr 13, 2012 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Norbert Batfai, OU=DEIK, O=University of Debrecen, L=Debrecen, ST=HB, C=HU Issuer: CN=Norbert Batfai, OU=DEIK, O=University of Debrecen, L=Debrecen, ST=HB, C=HU Serial number: 4d637975 Valid from: Fri Apr 13 09:34:13 CEST 2012 until: Thu Jul 12 09:34:13 CEST 2012 Certificate fingerprints: MD5: 2A:6B:CD:47:61:AD:D0:4F:99:C8:E0:C0:6C:3A:D2:FC SHA1: 76:58:2D:28:77:59:04:95:15:84:B5:B6:BC:C2:42:4B:06:21:7C:0F SHA256: 12:EB:1E:EA:B9:15:FC:71:07:50:87:33:E2:63:BD:DE:62:54:09:26:E5:82:2D:8 ←B:37:C4:11:10:A2:E8:55:31 Signature algorithm name: SHA1withDSA Version: 3
D R
#1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 0C FD 95 D8 1A 0A AC B6 34 D2 F9 73 F8 56 F8 0E 0010: E8 83 94 FD ] ]
........4..s.V.. ....
******************************************* *******************************************
Ahonnan a kimásolt MD5 ujjlenyomattal kérhetjük az API kulcsot a lapon és a válaszul visszkapott kulcsot kell az alkalmazásunk main.xml állományában a com.google.android.maps.MapView tag android:apiKey paramétere értékéül adnunk.
14. Az alkalmazás aláírását elvégezhetjük az IDE-b˝ol a Export.../Export Android Application alatt a File f˝omenüpontból.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
12 / 19
6.8. ábra. Az alkalmazás aláírásának megkezdése.
D R
Tallózd ki az imént parancssorban elkészített varosihangya.keystore-t, ez tartalmazza azt a tanúsítványt, amellyel alá szeretnénk írni at alkalmazást.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
13 / 19
D R
6.9. ábra. A tanúsítványt tartalmazó kulcskészlet kitallózása.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
14 / 19
6.10. ábra. A tanúsítványhoz tartozó nyilvános kulcs alias-ának megadása.
D R
Innen nincs más dolgod, mint az aláírt alkalmazást tartalmazó VarosiHangya.apk csomagot a telefonra tölteni és ott elvégezni a telepítést.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
15 / 19
6.11. ábra. A telefonra tölthet˝o elkészült apk fájl.
D R
A telefonon a telepítéshez a legtöbb esetben szükséged lesz egy fájlmenedzser programra, amelyet az Android Marketb˝ol tudsz letölteni (a Markethez való csatlakozáshoz egy Gmail-es accounttal kell rendelkezned.)
6.2.2.
A városi hangya tesztelése
6.2.2.1.
Szimulátorban
A tesztelés nehézségét az adja, hogy a GPS résszel történ˝o kísérletezéshez mozognunk kell, szerencsére ez a szimulátorból is megtehet˝o. Vagy magában az IDE-ben váltunk a munkaterületen DDMS nézetre és magadjuk a kívánt koordinátákat.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
16 / 19
6.12. ábra. GPS koordináták megadása a szimulátorban.
Vagy parancssorból tesszük meg ugyanezt. Most a 21.638818 47.549482 koordinátákat megadva a debreceni futball stadionba ugrunk. [norbert@matrica ~]$ telnet localhost 5554 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is ’^]’. Android Console: type ’help’ for a list of commands OK help geo allows you to change Geo-related settings, or to send GPS NMEA sentences
D R
available sub-commands: geo nmea send an GPS NMEA sentence geo fix send a simple GPS fix OK geo fix 21.638818 47.549482 OK
A kiadott geo fix 21.638818 47.549482 parancsanak megfelel˝oen máris a pályán vagyunk a szimulátorban.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
17 / 19
6.13. ábra. A geo fix 21.638818 47.549482 parancs eredménye.
Telefonon
D R
6.2.2.2.
6.14. ábra. Tesztelés a Motorola Milestone készüléken.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
FT
18 / 19
D
R
A
6.15. ábra. Tesztelés az LG Optimus 2X készüléken.
6.2.3.
6.16. ábra. Tesztelés egyszerre a két készüléken.
A városi hangya forráskódjai
A Java források három forrásállományban találhatók, ezek a VarosiHangyaActivity.java, VarosiHangyaItemizedOverl java és a VarosiHangyaLocationListener.java források. 6.2.3.1.
A VarosiHangyaActivity osztály
/* * VarosiHangyaActivity.java
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
19 / 19
FT
* * Dr. Bátfai Norbert: Mobil programozás példaprogramja * (az 1.0.4-verziótól) * [email protected] * * A példa ötletét (GPS+térkép használata) a hivatalos Android doksi * "Hello, MapView" bevezetése adta: * http://developer.android.com/guide/tutorials/views/hello-mapview.html * * Copyright (C) 2012, Dr. Bátfai Norbert * * This program is free software: you can redistribute it and/or modify * ... */ package varosi.hangya; public class VarosiHangyaActivity extends com.google.android.maps.MapActivity { android.widget.LinearLayout linearLayout; com.google.android.maps.MapView mapView; com.google.android.maps.MapController mapController;
java.util.List mapOverlays; android.graphics.drawable.Drawable hangya; VarosiHangyaItemizedOverlay itemizedOverlay; android.widget.TextView szoveg;
boolean created = false;
A
VarosiHangyaLocationListener varosiHangyaLocationListener;
void norbiIsOnTheMove(com.google.android.maps.GeoPoint geoPoint) {
R
com.google.android.maps.OverlayItem overlayitem = new com.google.android.maps. ←OverlayItem( geoPoint, "", ""); itemizedOverlay.ujReteg(overlayitem); mapController.animateTo(geoPoint);
szoveg.setText(geoPoint.getLatitudeE6() / 1E6 + " " + geoPoint.getLongitudeE6() / 1E6); }
D
@Override protected boolean isRouteDisplayed() { return false; }
@Override public void onCreate(android.os.Bundle bundle) { super.onCreate(bundle); if (!created) { setContentView(R.layout.main); linearLayout = (android.widget.LinearLayout) findViewById(R.id.zoomview); mapView = (com.google.android.maps.MapView) findViewById(R.id.mapview); mapView.setSatellite(true); mapView.setStreetView(true);
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
20 / 19
mapView.setTraffic(true); mapView.setBuiltInZoomControls(true); mapController = mapView.getController(); mapOverlays = mapView.getOverlays(); hangya = this.getResources().getDrawable(R.drawable.hangya); itemizedOverlay = new VarosiHangyaItemizedOverlay(hangya); mapOverlays.add(itemizedOverlay); szoveg = (android.widget.TextView) findViewById(R.id.szoveg);
FT
norbiIsOnTheMove(new com.google.android.maps.GeoPoint(47542157, 21639625)); varosiHangyaLocationListener = new VarosiHangyaLocationListener( this);
final android.location.LocationManager locationManager; locationManager = (android.location.LocationManager) getSystemService(android.content ←.Context.LOCATION_SERVICE); locationManager.requestLocationUpdates( android.location.LocationManager.GPS_PROVIDER, 500, 1.0f, varosiHangyaLocationListener);
}
6.2.3.2.
R
} }
A
android.widget.Button kilepesGomb = (android.widget.Button) findViewById(R.id.kilep); kilepesGomb .setOnClickListener(new android.widget.Button.OnClickListener() { public void onClick(android.view.View v) { locationManager .removeUpdates(varosiHangyaLocationListener); finish(); } }); created = true;
A VarosiHangyaItemizedOverlay osztály
D
package varosi.hangya;
public class VarosiHangyaItemizedOverlay extends com.google.android.maps.ItemizedOverlay { java.util.Queue retegek = new java.util.LinkedList< ←com.google.android.maps.OverlayItem>(); public VarosiHangyaItemizedOverlay(android.graphics.drawable.Drawable hangya) { super(boundCenterBottom(hangya)); } @Override public boolean onTouchEvent(android.view.MotionEvent event, com.google.android.maps.MapView mapView) {
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
21 / 19
if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) { com.google.android.maps.GeoPoint geoPoint = mapView.getProjection() .fromPixels((int) event.getX(), (int) event.getY()); android.widget.Toast.makeText( mapView.getContext(), geoPoint.getLatitudeE6() / 1E6 + " " + geoPoint.getLongitudeE6() / 1E6, android.widget.Toast.LENGTH_SHORT).show(); } return false; }
FT
public void ujReteg(com.google.android.maps.OverlayItem overlay) { if (retegek.size() < 200) retegek.offer(overlay); else { retegek.poll(); retegek.offer(overlay); } populate(); }
@Override public int size() { return retegek.size(); }
6.2.3.3.
R
}
A
@Override public com.google.android.maps.OverlayItem createItem(int i) { return ((java.util.LinkedList) retegek) .get(i); }
A VarosiHangyaLocationListener osztály
package varosi.hangya;
class VarosiHangyaLocationListener implements android.location.LocationListener {
D
VarosiHangyaActivity vhActivity; android.location.Location prevLocation = null; public VarosiHangyaLocationListener(VarosiHangyaActivity vhActivity) { this.vhActivity = vhActivity; } @Override public void onLocationChanged(android.location.Location location) { if (prevLocation == null) prevLocation = location; android.widget.Toast.makeText( vhActivity.getBaseContext(), "Norbi mozog: " + location.getLatitude() + " " + location.getLongitude(),
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
22 / 19
android.widget.Toast.LENGTH_SHORT).show(); if (location.distanceTo(prevLocation) > 1.0) { prevLocation = location; com.google.android.maps.GeoPoint p = new com.google.android.maps.GeoPoint( (int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6)); vhActivity.norbiIsOnTheMove(p); } }
A FT
@Override public void onProviderDisabled(String provider) {
android.widget.Toast.makeText(vhActivity.getBaseContext(), "GPS letiltva: " + provider, android.widget.Toast.LENGTH_SHORT) .show(); }
@Override public void onProviderEnabled(String provider) {
android.widget.Toast.makeText(vhActivity.getBaseContext(), "GPS engedélyezve: " + provider, android.widget.Toast.LENGTH_SHORT).show(); }
@Override public void onStatusChanged(String provider, int status, android.os.Bundle extras) {
D R
String s = null;
if (status == android.location.LocationProvider.AVAILABLE) s = "GPS elérhet˝ o: " + provider; else if (status == android.location.LocationProvider.OUT_OF_SERVICE) s = "GPS nem elérhet˝ o: " + provider; else // android.location.LocationProvider.TEMPORARILY_UNAVAILABLE) s = "GPS átmenetileg nem elérhet˝ o: " + provider; android.widget.Toast.makeText(vhActivity.getBaseContext(), s, android.widget.Toast.LENGTH_SHORT).show();
}
}
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
23 / 19
7. fejezet
D R
A FT
LEGO robotok Java programozása
A FT Kivonat
Ebben a fejezetben megismerkedsz a LEGO robotok Java programozásával. • Megismered a processzor téglát és a hozzávalókat • lecseréled a tégla operációs rendszerét
• elkészítesz egy viselkedés alapú robotvezérl˝o programot
D R
• majd egy PC-s és mobilos Bluetooth alapú távírányító programmal zárod le a melléklet feldolgozását.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
1 / 19
7.1.
LEGO© NXT
A korábbi LEGO© Mindstorms® Robotics Invention System (RIS 2.0) csomaghoz hasonlóan az NXT esetén is lehet˝oségünk van lecserélni az eredeti operációs rendszert és egy Java virtuális gépet, a leJOS rendszert tölteni a téglára. Ez megnyitja az utat, hogy Java nyelven készíthessük el robotos programjainkat. Két lehet˝oséget kínál a leJOS: vagy a roboton fut a vezérl˝o programunk (NXJ API), vagy egy távoli egységen (PC API), mondjuk asztali gépen, vagy akár egy mobilon és ekkor USB vagy Bluetooth kapcsolaton keresztül vezérli a téglát. A megfelel˝o API-k a projekt lapján böngészhet˝oek: • NXJ API • PC API
Elso˝ leJOS osztályaim
FT
7.1.1.
A RobotCarRacing osztály három névtelen osztályt tartalmaz, melyek egy-egy viselkedést reprezentálnak. Feltételezzük, hogy a robotunk két motorja (az A és a B) a két hátsó kereket hajtja meg. A harmadik kerék pedig egy bolygókerék. S az autó elejére van helyezve az (1-es portba csatlakoztatott) ultrahangos érzékel˝o. A leJOS rendszerben lehet˝oségünk van viselkedés alapú megközelítésre (behavior-based robotics, subsumption architecture [AI], [LEGO]) a robotprogramok fejlesztésénél. Ebben a példában megmutatjuk, hogyan élhetünk ezzel a lehet˝oséggel. 1
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/** o Matyi2Elso.java egyszer˝ u módosításával * A program a bevezet˝ * készült. Célja bemutatni olyanoknak a LEGO Javás viselkedéses * API-t, akik még sosem láttak ilyet. Feltesszük, hogy a robot * bolygókerekes. * * A Matyi2Elso.java a leJOS Viselkedés API-t bemutató példaprogram. * A program vezérelte MATYI-2 robot képei és videója itt * található: http://dev.inf.unideb.hu:8080/web/bnt * o osztályból áll, ezek növekv˝ o priorítás szerint a * A program három bels˝ ok: * következ˝ - megy el˝ ore (mindig) * - fordul (ha az ultrahangos szenzor jelez) * - leáll (ha megnyomják az ESC gombot a proci téglán) * *
D
23
/* * RobotCarRacing.java * * Operációs rendszerek, Mobil programozás példaprogram. * http://dev.inf.unideb.hu:8080/web/api * * Copyright (C) 2008 Bátfai Norbert, [email protected] * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */
A
3
R
2
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
2 / 19
40 41 42 43 44 45
* @author Bátfai Norbert, [email protected] * @version 0.0.1 * @see Matyi2Elso * @see Matyi2Masodik */ public class RobotCarRacing {
46 47 48
50
v
1
51 52 53 54
v
2
55 56 57 58 59
public boolean takeControl() { return true; }
v
public void suppress() { lejos.nxt.Motor.A.stop(); lejos.nxt.Motor.B.stop(); }
3
public void action() { lejos.nxt.Motor.A.forward(); lejos.nxt.Motor.B.forward();
60 61 62 63
} };
64 65 66
lejos.robotics.subsumption.Behavior fordulViselkedes = new lejos.robotics.subsumption.Behavior() {
67 68
70 71
v
4
74 75 76 77 78 79 80 81 82 83 84
v
public boolean takeControl() { return (ultrasonicSensor.getDistance() < 30); }
5
public void suppress() { lejos.nxt.Motor.A.stop(); lejos.nxt.Motor.B.stop(); }
public void action() { lejos.nxt.Motor.A.forward(); 6v lejos.nxt.Motor.B.backward();
D
85
lejos.nxt.UltrasonicSensor ultrasonicSensor = new lejos.nxt.UltrasonicSensor( lejos.nxt.SensorPort.S1);
R
73
A
69
72
FT
49
public static void main(String[] args) { lejos.robotics.subsumption.Behavior megyViselkedes = new lejos.robotics.subsumption.Behavior() {
86 87 88
} };
89 90 91
lejos.robotics.subsumption.Behavior leallViselkedes = new lejos.robotics.subsumption.Behavior() {
92 93 94 95
public boolean takeControl() { return lejos.nxt.Button.ESCAPE.isPressed(); }
96 97 98
public void suppress() { } 7v
99 100 101
public void action() { System.exit(0);
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
3 / 19
} 8v }; lejos.robotics.subsumption.Behavior[] behaviors = {megyViselkedes, fordulViselkedes, leallViselkedes 9v }; new lejos.robotics.subsumption.Arbitrator(behaviors).start();
102 103 104 105 106 107 108
} 10v
109
}
v
10
A tömbben elfoglalt hely mutatja az adott viselkedés priorítását. Legkisebb a megyViselkedes objektum, legnagyobb a leallViselkedes mutatta objektum priorítása.
v
A megyViselkedes viselkedést feltétel nélkül hajtjuk végre, azaz, ha nincs fontosabb, akkor a robot menni fog.
v
Menni fog, méghozzá azáltal, hogy egyszer˝uen bekapcsoljuk a motorokat.
1
3
v
2
A FT
110
Ha ezt a „megy” viselkedést le kell állítani, nincs más dolgunk, mint a motorok leállítása (de itt állítanánk le az akció függvényben indított szálat is például).
v
A fordulViselkedes viselkedés akkor aktiválódik, ha 30 centinél közelebbinek észlel bármit az érzékel˝o.
v
Ekkor a kormányt kezel˝o motor bekapcsolásával kanyarodunk.
v
A kanyarodás leállítása kapcsán nincs további tennivalónk, így a suppress függvényt üres testtel implementáltuk.
v
A „leall” viselkedés fontosságát ne becsüljük alá! Ha nem lenne, minden alkalommal resetelhetnénk a téglát „kilépéskor”.
v
Akciója a virtuális gép leállítása.
v
S itt már (a szó szoros értelmében) nincs mit tenni...
4
6
5
7
9
8
A RobotCarRacing osztály felélesztése Windows alatt
D R
1. Els˝o lépés a leJOS beszerzése és beállítása: töltsd le a projekt lapjáról! Itt én most a leJOS_NXJ_0.8.5-Setup.exe állományt választottam. Ez egy GUI alapú telepít˝o, ami utolsó lépésként a tégla eredeti operációs rendszerét (firmware) is lecseréli Javára. Fontos, hogy ehhez USB kapcsolat kell a tégla és a PC között (feltöltésre és kommunikációra majd alternatívaként már a Bluetooth kapcsolatot is használhatod). Ezért a leJOS telepít˝o el˝ott, követve a tutorial útmutatását, telepítsd a megfelel˝o USB meghajtót a gépedre! 2. A telepít˝o esetemben a c:\Program Files (x86)\leJOS NXJ könyvtárba csomagolta ki a leJOS rendszert.
3. Beállítom ennek megfelel˝oen az NXJ_HOMEváltozót, illetve módosítom a PATH-ot az alábbiak szerint. Az az NXJ_HOME változót a kicsomagolt PATH=c:\Program Files (x86)\leJOS NXJ könyvtárra állítom, az elérési utat pedig a c:\Program Files (x86)\leJOS NXJ\bin könyvtárával frissítem, parancssorból például a set PATH=c:\Program Files (x86)\leJOS NXJ\bin;%PATH%
paranccsal. Fontos, hogy a JAVA_HOME is legyen beállítva, ennek kapcsán további infót találhatsz a korábbi „Nehogy már...” könyvben, de elég annyi, hogy ránts le egy JDK-t és állítsd a könyvtárára a JAVA_HOME és ennek bin-jével b˝ovítsd az elérési utat! Parancssorból az alábbi utasításokkal tudod lefordítani, majd a téglára tölteni a RobotCarRacing osztályt.
C:\Users\Norbi\Documents\TAMOP\robot>nxjc RobotCarRacing.java C:\Users\Norbi\Documents\TAMOP\robot>nxjlink -v RobotCarRacing -o RobotCarRacing.nxj C:\Users\Norbi\Documents\TAMOP\robot>nxjupload RobotCarRacing.nxj
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
4 / 19
7.1.2.
R
A
FT
A feltöltés aktuális módja attól függ, hogy be van-e dugva az USB kábel, vagy ezt mell˝ozve már párosítottad a téglát, mint Bluetooth eszközt.
Kormányzott autó viselkedésekkel
D
A BehaviorCarRacing osztály úgy készült, hogy a RobotCarRacing osztály három névtelen osztályát „nevesítettük”, külön fordítási egységbe helyeztük és egy további viselkedést adtunk a projekthez. Az itt feltételezett autó els˝o két kereke a C motorral kormányzott. A tapasztalatok szerint élmény tekintetében ez a projekt kissé elmarad a bolygókerekes el˝odjét˝ol, de szabadon engedve a „teszt dobozok” és falrészletek alkotta alkalmi „pályán” (néha egy bogár makacsságát is belelátható) életszer˝u viselkedést mutat. A BehaviorCarRacing osztályban annyi újdonsággal találkozunk, hogy a viselkedések priorításos tömbjében megjelenik az új, a FordulViselkedes osztálybeli hátratolató viselkedés. A szenzort felhasználó viselkedéseknek konstruktoraikban átadjuk ennek az objektumnak a referenciáját, hogy a viselkedések vissza tudják hívni, mert az ultrahangos szenzor lekérdezését itt valósítottuk meg. (Mert a szenzor helyes m˝uködése kapcsán keresve több helyen, például itt is találkozunk azzal a tanáccsal, hogy id˝oben ne kérdezzük le folyamatosan az érzékel˝ot.)
1 2 3 4 5 6 7
/* * * * * * *
BehaviorCarRacing.java Operációs rendszerek, Mobil programozás példaprogram. http://dev.inf.unideb.hu:8080/web/api A BehaviorCarRacing névtelen osztályainak nevesítése és további
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
5 / 19
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
* viselkedés felvétele. * * Copyright (C) 2008 Bátfai Norbert, [email protected] * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */
FT
8
25
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
public static final int MEGY = 0; public static final int FORDUL = 1; public static final int HATRA = 2; protected int allapot = MEGY; protected lejos.nxt.UltrasonicSensor ultrasonicSensor; lejos.robotics.subsumption.Behavior[] viselkedesek;
D
53
/** u módosításával * A program a BehaviorCarRacing.java egyszer˝ * készült. Célja bemutatni olyanoknak a LEGO Javás viselkedéses * API-t, akik még sosem láttak ilyet. Feltesszük, hogy a robot nem * bolygókerekes, hanem kormányzott. * * A Matyi2Elso.java a leJOS Viselkedés API-t bemutató példaprogram. * A program vezérelte MATYI-2 robot képei és videója itt * található: http://dev.inf.unideb.hu:8080/web/bnt * o osztályból áll, ezek növekv˝ o priorítás szerint a * A program három bels˝ következ˝ o k: * - megy el˝ ore (mindig) * - hátra (ha valami nagyon közel került) * - fordul (ha valami elég közel került) * - leáll (ha megnyomják az ESC gombot a proci téglán) * * * @author Bátfai Norbert, [email protected] * @version 0.0.1 * @see Matyi2Elso * @see Matyi2Masodik * @see BehaviorCarRacing */ public class BehaviorCarRacing {
A
27
R
26
54 55 56 57 58
public BehaviorCarRacing() {
59 60 61 62
ultrasonicSensor = new lejos.nxt.UltrasonicSensor( lejos.nxt.SensorPort.S1);
63 64 65 66 67 68 69
viselkedesek = new lejos.robotics.subsumption.Behavior[]{ new MegyViselkedes(this), new HatraViselkedes(this), new FordulViselkedes(this), new LeallViselkedes() };
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
6 / 19
70
lejos.nxt.Motor.A.setSpeed(200); lejos.nxt.Motor.B.setSpeed(200);
71 72 73
}
74 75
int elottem = 255; private long elozoMeresIdeje = 0;
76 77 78
public int getElottem() {
79 80
82 83 84 85 86
return elottem;
87
}
88 89
public int getAllapot() { return allapot; }
90 91 92 93
public void setAllapot(int allapot) { this.allapot = allapot; }
94 95 96 97
public void start() { new lejos.robotics.subsumption.Arbitrator(viselkedesek).start(); }
98
A
99 100 101
103 104 105 106 107 108 109
R
public void log(String uzenet) { lejos.nxt.LCD.clear(); lejos.nxt.LCD.drawString(uzenet, 0, 0); lejos.nxt.LCD.drawInt(allapot, 0, 1); lejos.nxt.LCD.drawInt(elottem, 0, 2); lejos.nxt.LCD.refresh(); }
102
public static void main(String[] args) { new BehaviorCarRacing().start(); }
110 111 112 113
FT
long ido = System.currentTimeMillis(); if (ido - elozoMeresIdeje > 250) { elozoMeresIdeje = ido; elottem = ultrasonicSensor.getDistance(); }
81
}
D
A feltétel nélküli el˝ore haladást módosítottuk, akkor megy el˝ore a robot, ha el˝otte 1 méterre tiszta az út.
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15
/* * * * * * * * * * * * * * *
MegyViselkedes.java
A Nehogy már MEGINT a mobilod nyomkodjon Téged! példaprogramja. Copyright (C) 2008 Bátfai Norbert, [email protected] This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
7 / 19
* GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */
16 17 18 19 20 21 22 23
public class MegyViselkedes implements lejos.robotics.subsumption.Behavior {
24
BehaviorCarRacing behaviorCarRacing;
25 26
public MegyViselkedes(BehaviorCarRacing behaviorCarRacing) { this.behaviorCarRacing = behaviorCarRacing; }
27 28 29 30
32 33
FT
public boolean takeControl() { return (behaviorCarRacing.getElottem() > 100); }
31
34
public void suppress() { }
35 36 37
public void action() { behaviorCarRacing.log("Megy"); behaviorCarRacing.setAllapot(BehaviorCarRacing.MEGY); lejos.nxt.Motor.A.forward(); lejos.nxt.Motor.B.forward(); }
38 39 40 41 42 43
}
A
44
Hátra akkor tolat a robot, ha valami túlságosan, 20 centiméternél közelebb került hozzá. 2 3 4 5 6 7 8 9 10 11 12 13
public class HatraViselkedes implements lejos.robotics.subsumption.Behavior {
D
14
/* * HatraViselkedes.java * * A Nehogy már MEGINT a mobilod nyomkodjon Téged! példaprogramja. * * Copyright (C) 2008 Bátfai Norbert, [email protected] * * This program is free software: you can redistribute it and/or modify ... * along with this program. If not, see . */
R
1
15 16
BehaviorCarRacing behaviorCarRacing;
17 18 19 20
public HatraViselkedes(BehaviorCarRacing behaviorCarRacing) { this.behaviorCarRacing = behaviorCarRacing; }
21 22 23 24
public boolean takeControl() { return (behaviorCarRacing.getElottem() < 20); }
25 26 27 28 29 30
public void suppress() { lejos.nxt.Motor.A.stop(); lejos.nxt.Motor.B.stop(); }
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
8 / 19
public void action() { behaviorCarRacing.setAllapot(BehaviorCarRacing.HATRA); behaviorCarRacing.log("Hatra"); lejos.nxt.Motor.A.backward(); lejos.nxt.Motor.B.backward(); }
31 32 33 34 35 36 37
}
A kormány forgatásával úgy el˝ore, mint hátramenetben akkor próbálkozik a robot, ha az el˝otte lév˝o tereptárgyat 30 és 60 centiméter közötti közelségbe méri. 2 3 4 5 6 7 8 9 10 11
/* * FordulViselkedes.java * * A Nehogy már MEGINT a mobilod nyomkodjon Téged! példaprogramja. * * Copyright (C) 2008 Bátfai Norbert, [email protected] * * This program is free software: you can redistribute it and/or modify ... * along with this program. If not, see . */
12 13 14
FT
1
public class FordulViselkedes implements lejos.robotics.subsumption.Behavior {
15
BehaviorCarRacing behaviorCarRacing;
16 17
A
public FordulViselkedes(BehaviorCarRacing behaviorCarRacing) {
18 19
this.behaviorCarRacing = behaviorCarRacing;
20
}
21 22
public boolean takeControl() {
23 24
26
}
27 28
R
int tav = behaviorCarRacing.getElottem(); return ((tav < 60) && (tav > 30));
25
public void suppress() { }
29 30 31
public void action() {
32 33
behaviorCarRacing.setAllapot(BehaviorCarRacing.FORDUL); behaviorCarRacing.log("Fordul");
34
D
35 36
lejos.nxt.Motor.C.rotate(220); lejos.nxt.Motor.C.rotate(-220);
37 38 39
}
40 41
}
A leállító viselkedésen nem módosítottunk, csak külön osztályban adtuk meg.
1 2 3 4 5 6 7
/* * LeallViselkedes.java * * A Nehogy már MEGINT a mobilod nyomkodjon Téged! példaprogramja. * * Copyright (C) 2008 Bátfai Norbert, [email protected] *
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
9 / 19
* This program is free software: you can redistribute it and/or modify ... * along with this program. If not, see . */
8 9 10 11 12 13 14
public class LeallViselkedes implements lejos.robotics.subsumption.Behavior {
15
public boolean takeControl() { return lejos.nxt.Button.ESCAPE.isPressed(); }
16 17 18 19
public void suppress() { }
20 21 22
24 25 26 27 28 29
FT
public void action() { lejos.nxt.LCD.clear(); lejos.nxt.LCD.drawString("LEALL", 0, 0); lejos.nxt.LCD.refresh(); System.exit(0); }
23
}
A példa kipróbálásánál figyelj arra, hogy a téglára töltend˝o fájl neve (BehaviorCar.nxj) kevesebb legyen 20 karakternél.
7.1.3.
A
C:\Users\Norbi\Documents\TAMOP\LEGO\kormányos>nxjc BehaviorCarRacing.java C:\Users\Norbi\Documents\TAMOP\LEGO\kormányos>nxjlink -v BehaviorCarRacing -o BehaviorCar. ←nxj C:\Users\Norbi\Documents\TAMOP\LEGO\kormányos>nxjupload BehaviorCar.nxj
Bluetooth alapú távirányító
7.1.3.1. 1 2
A BTHelloNXT osztály
public class BTHelloNXT {
public static void main(String[] args) {
D
3
R
Amíg az el˝oz˝o példában a programunk a téglán futott, most annak egy része (a Bluetooth master része) fut majd a téglán, másik része, a BT kliens, pedig a PC-n vagy mobiltelefonon. A változatosság kedvéért ezt a példát Linuxon élesztjük fel. Bevezetésként két egyszer˝u osztályt készítünk. A BTHelloNXT a PC fut majd és beköszön a téglának, ahol a BTHelloPC figyel és ezt követ˝oen visszaválaszol a PC-nek.
4 5 6
lejos.pc.comm.NXTConnector nxt = new lejos.pc.comm.NXTConnector();
7 8 9
10 11
if (!nxt.connectTo("btspp://00:16:53:07:49:A0")) { System.out.println("Nincs kapcsolat..."); System.exit(-1); }
12 13 14
java.io.DataOutputStream kimenoCsatorna = nxt.getDataOut(); java.io.DataInputStream bejovoCsatorna = nxt.getDataIn();
15 16
try {
17 18 19
String hello = "Hello, NXT!"; byte[] hellob = hello.getBytes("US-ASCII");
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
10 / 19
20
kimenoCsatorna.writeInt(hello.length()); kimenoCsatorna.write(hellob, 0, hellob.length); kimenoCsatorna.flush();
21 22 23 24
int meret = bejovoCsatorna.readInt(); byte[] uzenet = new byte[meret]; bejovoCsatorna.read(uzenet, 0, meret);
25 26 27 28
System.out.println(new String(uzenet));
29 30
bejovoCsatorna.close(); kimenoCsatorna.close(); nxt.close();
31 32 33 34
36 37
}
38 39
}
7.1.3.2.
A BTHelloPC osztály
1 2
public class BTHelloPC {
3 4
public static void main(String[] args) {
6 7 8
A
5
lejos.nxt.LCD.clear(); lejos.nxt.LCD.drawString("Kekules...", 0, 0); lejos.nxt.LCD.refresh();
9 10
try {
11
13 14 15 16 17 18 19 20
java.io.DataInputStream bejovoCsatorna = pc.openDataInputStream(); java.io.DataOutputStream kimenoCsatorna = pc.openDataOutputStream(); int meret = bejovoCsatorna.readInt(); byte[] uzenet = new byte[meret];
bejovoCsatorna.read(uzenet, 0, meret);
D
21
lejos.nxt.comm.BTConnection pc = lejos.nxt.comm.Bluetooth.waitForConnection();
R
12
FT
} catch (java.io.IOException e) { System.out.println(e.getMessage()); }
35
22 23
String valasz = new String(uzenet);
24 25 26 27
lejos.nxt.LCD.clear(); lejos.nxt.LCD.drawString(valasz, 0, 0); lejos.nxt.LCD.refresh();
28 29
String hello = "Hello, PC!";
30 31 32 33 34
kimenoCsatorna.writeInt(hello.length()); byte[] hellob = hello.getBytes("US-ASCII"); kimenoCsatorna.write(hellob, 0, hellob.length); kimenoCsatorna.flush();
35 36 37
bejovoCsatorna.close(); kimenoCsatorna.close();
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
11 / 19
pc.close();
38 39
Thread.sleep(1000);
40 41
} catch (Exception e) {
42 43
lejos.nxt.LCD.clear(); lejos.nxt.LCD.drawString(e.getMessage(), 0, 0); lejos.nxt.LCD.refresh();
44 45 46 47
}
48
}
49 50
}
A FT
A példa felélesztése GNU/Linux alatt 1. Mivel a jelen fejlesztési szintünkön a Windows parancssor nem tér el a Linuxos parancssortól, így a korábban ismertetett letöltést, kicsomagolást nem ismertetjük. A néhány szintaktikai különbség miatt (nem set, hanem export; nem pontosvessz˝o, hanem kett˝ospont) viszont bemutatjuk a parancssorban most kiadott utasításokat. norbi@sgu:~/robot$ export NXJ_HOME=/home/norbi/robot/lejos_nxj/ norbi@sgu:~/robot$ export PATH=/home/norbi/robot/lejos_nxj/bin/:$PATH norbi@sgu:~/robot$ export CLASSPATH=$CLASSPATH:.:/home/norbi/robot/lejos_nxj/3rdparty/ ←lib/bluecove-gpl.jar:/home/norbi/robot/lejos_nxj/lib/pccomm.jar:/home/norbi/robot/ ←lejos_nxj/3rdparty/lib/bluecove.jar
D R
2. A téglán elindítom az el˝oz˝o lépésben rátöltött BTHelloPC osztályt.
3. Lefordítom a téglára töltend˝o osztályt, majd a téglára töltöm. norbi@sgu:~/robot$ nxjc BTHelloPC.java norbi@sgu:~/robot$ nxjlink -v BTHelloPC -o BTHelloPC.nxj norbi@sgu:~/robot$ nxjupload BTHelloPC.nxj leJOS NXJ> Failed to load USB comms driver: Cannot load USB driver BlueCove version 2.1.0 on bluez leJOS NXJ> Connected to NXT leJOS NXJ> Upload successful in 5703 milliseconds BlueCove stack shutdown completed
4. A PC-s részt a javac paranccsal fordítom és a PC-n futtatom. norbi@sgu:~/robot$ javac BTHelloNXT.java norbi@sgu:~/robot$ java BTHelloNXT BlueCove version 2.1.0 on bluez Hello, PC!
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
12 / 19
BlueCove stack shutdown completed
5. A lejos.pc.comm.NXTConnector osztály connectTo metódusának paraméterét fel tudod deríteni például a hcitool parancs használatával. norbi@sgu:~$ hcitool scan Scanning ... 00:16:53:07:49:A0
A fejezet feladatainak összefoglalása
A FT
7.2.
NXT
1. Telepítsd fel a saját gépedre és tégládra a leJOS rendszert! (2 pont) 2. Fordítsd le és futtasd a RobotCarRacing osztályt! (2 pont)
3. Építs új szenzort a robotodra és írj hozzá egy viselkedést! Például sötétben menjen hátrafelé. (7 pont) 4. A RobotCarRacing osztály viselkedéseit b˝ovítsd a hártatolatás képességével. (9 pont)
5. Találj ki és valósíts meg komplexebb viselkedést az action függvényben! Például egy új szálban. (10 pont) 6. Fordítsd le és futtasd a távirányítós példa osztályait! (3 pont)
7. Módosítsd úgy a a távirányítós példa osztályait, hogy implementáljanak egy egyszer˝u protokollt. A protokoll PC fel˝oli utasításkészlete legalább olyan gazdag legyen, hogy tartalmazza a következ˝o parancsokat: START (A|B|C), STOP (A|B|C), ROTATE (A|B|C), EXIT. (9 pont) 8. Lásd el grafikus felülettel a távirányítót, azaz legyen lerajzolva! (9 pont)
D R
9. Alakíts olyan istállót, amely sikerrel tudja róni a köröket valamelyik Jávácska kupa rögzítette pályán! (20 pont)
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
A FT
13 / 19
rész IV
D R
Irodalomjegyzék
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
14 / 19
7.3.
Idézetek
[Bolling]
Ekblom (editor), Bjorn, Football (Soccer) Handbook of Sports Medicine and Science, ISBN 0 632 03328 2, Blackwell Scientific Publications , 1994.
[EMBER]
Madách, Imre, AZ EMBER TRAGÉDIÁJA, http://mek.niif.hu/00800/00849/html/01.htm#15 , 2010.
[Gartner]
Gartner Highlights Key Predictions for IT Organisations and Users in 2008 and Beyond, http://gartner.com/it/page.jsp?id=593207 , 2010.
[Hacker]
Raymond, Eric S., How To Become A Hacker (Hogyan lesz az emberb˝ol Hacker), http://catb.org/~esr/faqs/hacker-howto.html http://esr.fsf.hu/hacker-howto.html , 2010.
[KERNIGHANP] Kernighan, Brian W. és Plauger, P. J., A programozás magasiskolája, M˝uszaki, 1982. Marx, György, Gyorsuló id˝o, Typotex , 2005.
A FT
[MARX]
[METAMATH] Chaitin, Gregory, META MATH! The Quest for Omega, http://www.cs.auckland.ac.nz/CDMTCS/chaitin/omega.html . [NHIT]
Dömölki (editor), Bálint, Égen-földön informatika: az információs társadalom technológiai távlatai, Typotex, 2008.
[Stallman]
Stallman, Richard, Free and Open Source Java, http://www.sun.com/software/opensource/java/http://mediacast.sun.com/share/tmarble/stallman3.ogg , 2010.
[TenYears]
Norvig, Peter, Teach Yourself Programming In Ten Years, http://norvig.com/21-days.html , 2010.
7.4.
Szórakoztató ismeretterjesztés
[KAPCSOLAT1] Zemeckis, Robert, Contact, http://www.imdb.com/title/tt0118884/ , 1997. [KAPCSOLAT2] Sagan, Carl, Kapcsolat, Édesvíz, 1993.
D R
[KVANTUM1] Arntz, William és Chasse, Betsy, What the #$*! Do We (K)now!? Mi a csudát tudunk a világról?, http://www.imdb.com/title/tt0399877/ http://www.whatthebleep.com/ , 2004. [KVANTUM2] Penrose, Roger és Hawking, Stephen, A nagy, a kicsi és az emberi elme, Akkord, 2003.
7.5.
Programozás
[JT]
Bátfai, Norbert és Juhász, István, Javát tanítok, Bevezetés a programozásba a Turing gépekt˝ol a CORBA technológiáig, Kempelen Farkas Digitális Fels˝ooktatási Tankönyvtár http://www.tankonyvtar.hu/site/upload/pdf/b10108.pdf http://www.tankonyvtar.hu/informatika/javat-tanitok-javat-080904 , 2007.
[KERNIGHANC] Kernighan, Brian W. és Ritchie, Dennis M., A C programozási nyelv, M˝uszaki, 1993.
[NEHOGY]
Bátfai, Norbert, Nehogy már a mobilod nyomkodjon Téged!, ISBN 978 963 473 094 1, Debrecen, DEENK http://www.eurosmobil.hu/NehogyMar , 2008.
[NEHOGY2]
Bátfai, Norbert, Nehogy már megint a mobilod nyomkodjon Téged! (keziratban), Kempelen Farkas Digitális Fels˝ooktatási Tankönyvtár http://www.tankonyvtar.hu , A szerz˝o honlapján elérhet˝o a saját pdf, html és epub konverziója: http://www.inf.unideb.hu/~nbatfai/konyvek , 2010.
[PARP]
Bátfai, Norbert, Párhuzamos programozás GNU/Linux környezetben: SysV IPC, P-szálak, OpenMP, Kempelen Farkas Digitális Fels˝ooktatási Tankönyvtár http://www.tankonyvtar.hu , A szerz˝o honlapján elérhet˝o a saját pdf, html és epub konverziója: http://www.inf.unideb.hu/~nbatfai/konyvek , 2011.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
15 / 19
[PHD]
Bátfai, Norbert, Mobiltelefonos játékok tervezése és fejlesztése, other Doktori (PhD) értekezés, uri http://www.inf.unideb.hu/~nbatfai/phd2/, Debrecen, DE IK http://www.inf.unideb.hu/~nbatfai/phd2/ , 2010.
[POPR]
Bátfai, Norbert, Paternoster of Programmers Reloaded: C, C++, Java, Python and AspectJ Case Studies, Kempelen Farkas Digitális Fels˝ooktatási Tankönyvtár http://www.tankonyvtar.hu , A szerz˝o honlapján elérhet˝o a saját pdf, html és epub konverziója: http://www.inf.unideb.hu/~nbatfai/konyvek , 2011.
[PP]
Bátfai, Norbert, Programozó Páternoszter, http://www.inf.unideb.hu/~nbatfai/ProgramozoPaternoszter.pdf , 2007.
[PROP]
Bátfai, Norbert, Programozó Páternoszter újratöltve: C, C++, Java, Python és AspectJ esettanulmányok, Kempelen Farkas Digitális Fels˝ooktatási Tankönyvtár http://www.tankonyvtar.hu , A szerz˝o honlapján elérhet˝o a saját pdf, html és epub konverziója: http://www.inf.unideb.hu/~nbatfai/konyvek , 2011.
7.6.
Mobil
A FT
[REVOLUTION] Bátfai, Norbert, Bátfai, Erika, és Psenáková, Ildikó, Jávácska One: Open Source Mobile Games to Revolutionize Education of Programming (submitted), 2010.
[EUROSMOBIL] EUROSMOBIL JÁTÉKOK - Eleve mobilra kitalált eredeti játékok!, http://www.eurosmobil.hu , 2007.
7.7.
Gyerekeknek
[J]
7.8.
Bátfai, Norbert és Bátfai, Erika, Fantasztikus programozás, Debreceni Egyetem Egyetemi és Nemzeti Könyvtár http://javacska.lib.unideb.hu/konyv/bv-naploja-kezirat-I-5_0_0.pdf , 2004.
Foci
[FERSML]
Bátfai, Norbert, Footballer and Football Simulation Markup Language and related Simulation Software Development, Journal of Computer Science and Control Systems http://electroinf.uoradea.ro , 2010. Journal of Computer Science and Control Systems, 2, 13-18, 2010.
Bátfai, Norbert és Bátfai, Erika, Kis XML állományok gy˝ujteményeinek kezelése a labdarúgásban (beküldve), 2010.
D R
[KAVATAR]
7.9.
Tudat
[ALGORITMUSOK] Rónyai, Lajos, Ivanyos, Gábor, és Szabó, Réka, ALGORITMUSOK, Typotex, 1998. [Kornhuber]
Kornhuber et. al., Hans H., Voluntary finger movement in man: Cerebral potentials and theory
Biological Cybernetics, 23, 1976.
[Libet]
Libet et. al., Benjamin, Subjective referral of the timing for a conscious sensory experience
Brain, 102, 193-224, 1979.
[SZTOCHSZT] Tusnády, Gábor, Sztochasztikus számítástechnika, Kossuth Egyetemi Kiadó, 1996.
7.10. [AI]
Robotok Brooks, Rodney A., Intelligence without representation Artificial Intelligence, 47, 139-159, 1991.
[LEGO]
Bagnall, Brian, Maximum Lego NXT: Building Robots with Java Brains, Variant Press, 2009.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
16 / 19
7.11.
Futball
[DEIKFOCI]
Bátfai, Norbert, Ispány, Márton, Jeszenszky, Péter, Széll, Sándor, és Vaskó, Gábor, A Debreceni Egyetem labdarúgást szimuláló szemináriuma, Híradástechnika http://www.hiradastechnika.hu/data/upload/file/2011/2011_01_01magyar/batfain.pdf , 2011.
D R
A FT
Híradástechnika, 66/1, 32-36, 2011.
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
17 / 19
8. fejezet
Tárgymutató
D R
A Activity, 11 ADT Plugin, 20 Android ADT Plugin, 11 Android SDK, 20 android.permission.ACCESS_FINE_LOCATION, 11 android.permission.INTERNET, 11 android:minSdkVersion, 11 android:targetSdkVersion, 11 android:versionName, 11 Apache licenc, 3 API, 3 API kulcs, 11 API level, 11 apiKey, 11 Applet, 20 ArgoUML, 13 Automated Soccer Applet, 20 B Basel FC, 20 Behavior API, 23 behavior-based robotics, 23 Bluetooth, 3, 23 Bouncy Castle, 3 C CLDC, 3
D Debreceni VSC, 20 debug.keystore, 11 DocBook, 3 DocBook XML 5.0, 3 E Eclipse, 11, 20
F FerSML, 13, 20 Focijáték Neked NYFK, 18
G Game API, 20 geo fix, 11 GeoPoint, 11 GIMP, 21 Google Android, 20 Google Maps API, 11
A FT
_ 110% Nyári Kapitális NYFK, 18 110% Summer Capital OSE, 18
H hcitool, 23 Hetedik Szem NYFK, 18 I ItemizedOverlay, 11
J Jávácska ONE, 3, 20 jad, 3 jar, 3 Java Application Descriptor, 3 Java ME, 3 Javacska ONE, 3 Jing, 20 jing-trang, 20 JSR, 3 K képerny˝oképek, 18 keytool, 11 L LEGO, 23 leJOS, 23 LG Optimus 2X, 11 Linux kernel, 11 LocationListener, 11 M MapActivity, 11 MapController, 11 MapView, 11 Maven, 3 Maven plugin, 3 MIDI, 21 MIDlet, 3
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
18 / 19
MIDP, 3 Motorola, 3, 20 Motorola Droid, 11, 20 Motorola Milestone, 11
O obfuscation, 3 obfuscator, 3 OverlayItem, 11
A FT
N NetBeans, 3 Nokia, 3, 20 NXJ, 23 NXJ API, 23 NXT, 23
P PC Suite, 3 pillanatfelvételek, 18 pom.xml, 3 pox.xml, 3 Proguard, 3 Public Resource Football Computing, 20 pyx4me, 3 R RDF, 3 Record Management System, 3 Relax NG, 3, 20 RELAX NG kompakt szintaxis, 20 RIS, 23 RMS, 3 Robotics Invention System, 23
D R
S screen shot, 18 Seventh Eye OSE, 18 Soccer Game 4u OSE, 18 Sony Ericsson, 3, 20 SourceForge.net, 20 SPARQL, 3 subsumption architecture, 23 szemantikus web, 3 szurkolói avatár, 20 X Xerces2 Java, 20 XInclude, 20
Ed. Egyetemi jegyzet, verzió 1.0.9
Mobil programozás
˝ KIADÁS S ZERZ OI
19 / 19
Végszó
A FT
A tananyag a TÁMOP-4.1.2-08/1/A-2009-0046 számú Kelet-magyarországi Informatika Tananyag Tárház projekt keretében készült. A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósult meg.
D R
A jelen jegyzetet és a jegyzet környezetének további könyveit a szerz˝o igyekszik azok szerz˝oi kiadásában folyamatosan ápolni, karban tartani. Ezek a szerz˝oi kiadások megtalálhatóak a http://www.inf.unideb.hu/~nbatfai/konyvek/ lapon.