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