
|
A
NehogyMar7Vaszon.java
forrás letöltése,
a kapcsolódó jatekos.png kép letöltése, a hatter.png kép letöltése és a jatekos2.png kép letöltése.
Illetve alább bemutatjuk a forrás szÃnesen
formázott és besorszámozott
változatát. ErrÅ‘l talán könnyebb Ãgy
kérdezni és beszélni róla, mint a
könyvben lévő formázatlanról.
1 /*
2 * NehogyMar7Vaszon.java
3 *
4 * Bátfai Norbert: Nehogy már a mobilod nyomkodjon Téged!
5 * nbatfai@gmail.com
6 *
7 * Ezt a forrásfájlt (és a hozzá esetlegesen kapcsolódó erőforrásokat,
8 * például képeket) letöltheted a http://www.eurosmobil.hu/NehogyMar/
9 * cÃmrÅ‘l.
10 *
11 */
12 /**
13 * A könyv NehogyMar5Vaszon játék-vásznának olyan továbbfejlesztése,
14 * amelyben csempézett hátteret használunk.
15 *
16 * @author Bátfai Norbert, nbatfai@gmail.com
17 * @version 0.0.1
18 */
19 public class NehogyMar7Vaszon extends javax.microedition.lcdui.game.GameCanvas
20 implements Runnable {
21 /** A csempézett háttér. */
22 javax.microedition.lcdui.game.TiledLayer hatter;
23 /** A háttér szerkezetének megadásához. */
24 int [][] palya;
25 /** A szprájtok kereteit tartalmazó képek. */
26 javax.microedition.lcdui.Image kep, kep2;
27 /** A szprájtkat reprezentáló objektumok. */
28 javax.microedition.lcdui.game.Sprite jatekos, jatekos2;
29 /** A vásznat felépÃtÅ‘ konstruktor, betölti a képet
30 * és elkészÃti belÅ‘le a szprájtot.
31 */
32 public NehogyMar7Vaszon() {
33 super(true);
34 /* A háttér szerkezetének megadása. */
35 palya = new int [][]{
36 {1, 2, 3, 1, 1, 1, 2, 3, 1, 2, 3, 2, 3, 1, 1, 1, 2, 3},
37 {1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1, 1, 2, 3, 1, 2, 3, 1},
38 {4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6}
39 };
40 /** A háttér kereteit tartalmazó kép. */
41 javax.microedition.lcdui.Image csempek = null;
42 try { // megpróbálkozok
43 kep = // a jatekos.png nevű kép betöltésével
44 javax.microedition.lcdui.Image.createImage("/jatekos.png");
45 kep2 = // a jatekos2.png nevű kép betöltésével
46 javax.microedition.lcdui.Image.createImage("/jatekos2.png");
47 csempek = // a hatter.png nevű kép betöltésével
48 javax.microedition.lcdui.Image.createImage("/hatter.png");
49 } catch(java.io.IOException e) {// ha nem sikerült, most ezt a hibát
50 // sem kezelem
51 }
52 // A csempézett háttér elkészÃtése (szélesség, magasság,
53 // kereteket tartalmazó kép, egy keret szélessége, magassága)
54 hatter = new javax.microedition.lcdui.game.TiledLayer(
55 palya[0].length, palya.length, csempek, 40, 40);
56 // Kezdetben minden háttércsempe legyen az "égbolt"!
57 hatter.fillCells(0, 0, palya[0].length, palya.length, 1);
58 // Aztán beállÃtjuk a korábban megadott szerkezetet:
59 for(int i=0; i<palya.length;++i)
60 for(int j=0; j<palya[0].length;++j)
61 hatter.setCell(j, i, palya[i][j]);
62 // Egy keret a képben: 120x150
63 jatekos = new javax.microedition.lcdui.game.Sprite(kep,
64 120, 150);
65 jatekos2 = new javax.microedition.lcdui.game.Sprite(kep2,
66 120, 150);
67 // Kilenc fázisből áll össze a mozgás, ebben a sorrendben:
68 jatekos.setFrameSequence(new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8});
69 // A két futó mozgása nincs "fázisban"
70 jatekos2.setFrameSequence(new int[]{3, 4, 5, 6, 7, 8, 0, 1, 3});
71 // Ennél a pontnál ragadjuk meg a kereteket
72 jatekos.defineReferencePixel(60, 75);
73 jatekos2.defineReferencePixel(60, 75);
74 // A vászon közepére rajzoljuk az egyik futót,
75 jatekos2.setRefPixelPosition(getWidth()/2, getHeight()/2);
76 // a jobb szélére pedig a másikat.
77 jatekos.setRefPixelPosition(getWidth(), getHeight()/2);
78 // Az animáció mozgás, ezt egy külön szál (Thread objektum) vezérli
79 new Thread(this).start(); // amit most egybÅ‘l indÃtottunk is, illetve
80 // átadtuk neki "magunkat" (this), hogy majd minket kell mozgatni,
81 // azaz a start() a mi run() módszerünk meghÃvását is jelenti egyben.
82 }
83 /** Az animáció vezérlése.
84 */
85 public void run() {
86 // El kell érjük a grafikus objektumot, mert
87 // rajzolni akarunk a vászonra:
88 javax.microedition.lcdui.Graphics g = getGraphics();
89 // Hová rajzoljuk a játékost
90 int jatekosOszlop = getWidth();
91 // Hová (honnan) rajzoljuk ki a hátteret?
92 int hatterIndex = - (palya[0].length * 40 - getWidth());
93 // Ezt rajzoljuk le, hogy megértsük! (Kis segÃtség:
94 // A palya[0].length * 40 a futópálya hátterének szélessége.)
95 // Végtelen ciklusban (később majd kerüljük)
96 while(true) {
97 // Megvizsgáljuk nyomtak-e gombot?
98 int lenyomottBillenytu = getKeyStates();
99 if((lenyomottBillenytu
100 // Ha a kurzor jobbra gombot nyomták
101 &javax.microedition.lcdui.game.GameCanvas.RIGHT_PRESSED)
102 != 0) {
103 // és még tud jobbra "lemaradni" a játékos, akkor
104 if(jatekosOszlop+3 < getWidth() + jatekos.getWidth())
105 // 3 pixellel hátrábbra rajzoljuk ki
106 jatekosOszlop += 3;
107 } else if((lenyomottBillenytu
108 &javax.microedition.lcdui.game.GameCanvas.LEFT_PRESSED)
109 != 0) {
110 if(jatekosOszlop-3 > - jatekos.getWidth())
111 jatekosOszlop -= 3;
112 }
113 // Töröljük a vásznat
114 g.setColor(0xffffff);
115 g.fillRect(0, 0, getWidth(), getHeight());
116 // Mozgatjuk a hátteret:
117 if(hatterIndex < 0)
118 ++hatterIndex;
119 else // a végén kicsit ugrani fog, de a kód finomÃtásával
120 // ez könnyen kiküszöbölhető
121 hatterIndex = - (palya[0].length * 40 - getWidth());
122 hatter.setPosition(hatterIndex, 0);
123 // és kirajzoljuk
124 hatter.paint(g);
125 // A játékos legyen az új pozÃcióban!
126 jatekos.setRefPixelPosition(jatekosOszlop, getHeight()/2 - 4);
127 // A korábbi ég és föld határvonalát kirajzoljuk
128 g.setColor(0x000000);
129 g.drawLine(0, 2*getHeight()/3, getWidth(), 2*getHeight()/3);
130 // Kirajzoljuk a szprájtokat
131 jatekos.paint(g);
132 jatekos2.paint(g);
133 // Jöhet a következő fázisuk egyben
134 jatekos.nextFrame();
135 jatekos2.nextFrame();
136 // Amit rajzoltunk, az ténylegesen menjen a vászonra
137 flushGraphics();
138 try { // megpróbálunk a másodperc tizedrészéig
139 Thread.sleep(100); // semmit sem csinálni
140 } catch(InterruptedException e) {}
141 // aztán ismételjük: következő keret és kirajzolása...
142 }
143 }
144 }
145
|