02 Midp Game Class

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 02 Midp Game Class as PDF for free.

More details

  • Words: 2,410
  • Pages: 58
MIDP Game Class • Canvas – Canvas with Command – Canvas with Keycode – Canvas with Thread

• • • • • •

GameCanvas Sprite Layer LayerManager TiledLayer Game Interface

Canvas • Canvas เป็น base class สำำหรับกำรเขียน low-level event • ในโปรแกรมอำจมีกำรสลับ Screen ระหว่ำง high-level และ low-level เช่น จำก List ให้เลือกว่ำจะเล่นเกมใด List (High-level) GameA Canvas (Low –level) GameB Canvas (Low –level)

Canvas • Canvas มี method สำำหรับ handle game action, key event นั่นคือเรำสำมำรถเขียนโปรแกรมให้รับรู้กำรกดปุ่มบนมือถือได้ โดยใช้ Canvas • นอกจำกนั้น Canvas ยังสำมำรถ regist CommandListener ได้เหมือนกับ Displayable อื่นๆ • แต่ ที่สำำคัญคือ Canvas เป็น abstract class ดังนั้น เรำต้องสร้ำง class อื่นๆให้ extends Canvas เช่น class MyCanvas extends Canvas แล้วจำกนั้นจึงสร้ำง object MyCanvas เพื่อนำำไปวำงบน Screen

public class HelloCanvasMIDlet extends MIDlet { Display display; HelloCanvas canvas; public HelloCanvasMIDlet() { canvas = new HelloCanvas(); } protected void destroyApp(boolean arg0) { } protected void pauseApp() { }

}

protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); display.setCurrent(canvas); canvas.repaint(); }

class HelloCanvas extends Canvas{ protected void paint(Graphics g) { g.drawString("HelloCanvasWorld", 5, 5,Graphics.TOP | Graphics.LEFT); } }

Canvas Idea class: MyCanvas • เรำสร้ำงคลำส MyCanvas extends Canvas • งำนต่ำงๆที่เรำต้องกำรวำดบน Canvas ให้สั่งใน paint() class: MainMIDlet • สร้ำง object MyCanvas (เช่นให้ชื่อ canvas) และ setDisplay(canvas) • เมื่อต้องกำรให้ Canvas แสดงผลกำรวำด เรียก canvas.repaint()

Canvas Method int int String void void void void void void

getGameAction(int keyCode) getKeyCode(int gameAction) getKeyName(int keyCode) keyPressed(int keyCode) keyReleased(int keyCode) keyRepeated(itn keyCode) paint(Graphics g) repaint() repaint(int x, int y, int width, int height)

Canvas Attribute DOWN FIRE GAME_A GAME_B GAME_C GAME_D KEY_NUM0 KEY_NUM1 KEY_NUM2

KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_POUND KEY_STAR

LEFT RIGHT UP

Graphics class : method void void void void void void void void void void void void

clipRect(int x, int y, int w, int h) drawArc(itn x, int y int w, int h, int startAngle, int arcAngle) drawChar(char ch, int x, int y, int anchor) drawImage(image img, int x, int y, int anchor) drawLine(int x1, int y1, int x2, int y2) drawRect(int x, int y, int w, int h) drawString(String str, int x, int y, int anchor) fillRect(int x, int y, int w, int h) fillTriangle(int x1, int y1, int x2, int y2, int x3 ,int y3) setColor(int rgb) setColor(int r, int g, int b) setGrayScale(itn vlaue)

Graphics class : Attribute BASELINE BOTTOM DOTTED HCENTER LEFT RIGHT SOLID TOP VCENTER

Lab 2.1 CanvasDemo2.java • สร้ำง MIDlet โปรแกรม โดยให้แสดง Canvas บน screen • ใน Canvas ให้เพิ่ม Command exit และ swap • ทุกครั้งที่มีกำรกดปุ่ม ran ให้ random ตำำแหน่ง ขนำด และสีของสีเหลี่ยม และวำดสีเ่ หลี่ยมใหม่ พร้อมทั้งให้แสดงตัวเลขจำำนวนครั้งที่วำดที่มุมล่ำงซ้ำย

Lab 2.1 CanvasDemo2 IDEA • สร้ำงคลำส MyDrawingCanvas extends Canvas • สร้ำง static int count เพือ่ นับจำำนวนรอบที่วำดรูป • method paint() ของ MyDrawingCanvas จะต้อง – random ค่ำต่ำงๆ โดยใช้ Random (javax.util.Random) – ค่ำสี r, g,b จะต้องมีค่ำไม่เกิน 255 – ค่ำ x, y, w, h ที่จะวำดสี่เหลี่ยม จะต้องไม่เกินค่ำ width, height ของ screen • int

getWidth(),

int getHeight() ใช้เช็คค่ำควำมกว้ำงและสูงของ screen

– เปลีย่ นสีของ screen โดยใช้ g.setColor() – ล้ำง screen ให้เป็นสีดำำโดยใช้ method fillRect() วำดสีเ่ หลีย่ มให้เต็ม screen

public class CanvasDemo2 extends MIDlet { Display display; MyDrawingCanvas canvas; public CanvasDemo2() { canvas = new MyDrawingCanvas(this); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); display.setCurrent(canvas); } }

class MyDrawingCanvas extends Canvas implements CommandListener{ MIDlet mainMID; Command ran,exit; int w,h; static int count=0; MyDrawingCanvas(MIDlet midlet){ w = this.getWidth(); h = this.getHeight(); mainMID = midlet; ran = new Command("swap",Command.SCREEN,1); exit = new Command("exit",Command.EXIT,1); this.addCommand(ran); //add command ลงบน canvas ตัวนี้ this.addCommand(exit); this.setCommandListener(this); } public void commandAction(Command command, Displayable d) { if(command==ran){ repaint(); } else if(command==exit){ mainMID.notifyDestroyed(); } } .........................

…………………… protected void paint(Graphics gh) { count++; gh.setColor(0); gh.fillRect(0, 0, w, h); // วำดสีเ่ หลี่ยมสีดำำเต็มจอ เป็นกำรล้ำง screen int r,g,b,x,y,ws,hs; Random ran = new Random(); // สร้ำง คลำส Random r = Math.abs(ran.nextInt()%255); // กำำหนดค่ำสีไม่เกิน 255 และเป็นค่ำบวก g = Math.abs(ran.nextInt()%255); b = Math.abs(ran.nextInt()%255); x = Math.abs(ran.nextInt()%w/2); y = Math.abs(ran.nextInt()%h/2); ws = Math.abs(ran.nextInt()%w/2); hs = Math.abs(ran.nextInt()%h/2);

}

}

gh.setColor(r,g,b); gh.fillRect(x, y, ws, hs); gh.drawString(count+"", 0, h, Graphics.BOTTOM|Graphics.LEFT);

Lab 2.2 • จำก Lab 2.1 ให้แก้ไขโปรแกรมเฉพำะคลำส MyDrawingCanvas โดยให้ – เมือ่ กดปุ่ม ran ให้ random รูปที่จะแสดงด้วย โดยรูปที่แสดงสำมำรถเป็น • • • • • •

สี่เหลี่ยมโปร่ง วงกลมโปร่ง เส้น สำมเหลี่ยม สี่เหลี่ยมทึบ วงกลมทึบ

Lab 2.3 CanvasDemo3.java • ให้สร้ำง MIDlet สลับ canvas สองตัวบน screen • Canvas ทั้งสองตัวมีสี background ต่ำงกัน • (ต้องกำรให้ใช้ Command สลับกำรแสดงผล canvas เท่ำนั้น)

Canvas , keyCode IDEA • หำกเรำต้องกำรให้ Canvas มีกำรทำำงำนเมื่อกดปุ่มบนมือถือ เรำต้องสร้ำง method ให้ทำำงำนคือ keyPressed(int keyCode) keyReleased(int keyCode) keyRepeated(int keyCode)

• parameter keyCode คือ ปุ่มต่ำงๆที่โดนกดนั่นเอง • เรำสำมำรถเช็คค่ำ keyCode กับ attribute ต่ำงๆของ Canvas เช่น KEY_NUM0, KEY_NUM1

Lab 2.4 CanvasDemo4.java • สร้ำง Canvas โดยให้มีกำรกดปุ่ม 1,2,3 และ 4 โดยที่หำกกดปุ่ม 1. วำดสี่เหลี่ยมสีแดง 2. วำดเส้นสีเขียว 3. วำดสำมเหลี่ยมสีฟ้ำ 4. แสดงรูปที่กลำง screen มือถือ

class MyDrawingCanvas2 extends Canvas{ int mode=0; MyDrawingCanvas2(){ } protected void paint(Graphics g) { if(mode==1) .................... else if(mode==2) .................... else if(mode==3) .................... else if(mode==4) ....................

}

} public void keyPressed(int keyCode){ if(keyCode== KEY_NUM1) mode = 1; else if(keyCode== KEY_NUM2) mode = 2; else if(keyCode== KEY_NUM3) mode = 3; else if(keyCode== KEY_NUM4) mode = 4; repaint(); }

javax.microedition.lcdui.game.* • • • • •

GameCanvas Layer LayerManager Sprite TiledLayer

GameCanvas • Different of GameCanvas & Canvas – Graphics buffering • flushGraphics()

– Query key state

• IDEA— สร้ำง class XX extends GameCanvas implements Runnable นัน่ คือให้คลำสเป็น thread และสร้ำง Thread เพือ่ รัน game loop โดย game loop มีกำรเช็คกำร input (กดปุ่ม) และ game logic ต่ำงๆ แล้วแสดงผลบน ui

GameCanvas- Method & KeyStroke • Constructor GameCanvas(boolean suppressKeyEvents)

• Methods void void Graphics int void

flushGraphics() flushGraphics(int x, int y, int w, int h) getGraphics() getKeyStates() paint(Graphics g)

• Attribute GAME_A_PRESSED GAME_B_PRESSED GAME_C_PRESSED GAME_D_PRESSED

DOWN_PRESSED FIRE_PRESSED LEFT_PRESSED RIGHT_PRESSED UP_PRESSED

GameCanvas IDEA • template ของ game loop ใน GameCanvas Graphics g = getGraphics();

//get off-screen graphics

while(running){ int keyState = getKeyStates(); if(keyState==LEFT_PRESSED) //code เมื่อมีกำรกดปุ่มซ้ำย else if(keyState==RIGHT_PRESSED) //code เมื่อมีกำรกดปุ่มขวำ ......... g.setColor(0); g…………….. flushGraphics(); }

//clear screen // draw graphic on screen // flush off-screen graphics

Lab 2.5 GameCanvas & keyPressed GameCanvasAndKeyPressedDemoMIDlet.java • สร้ำงคลำสเพื่อดูกำรทำำงำนของ keyPressed() ใน GameCanvas • สังเกตุ key ทีส่ ำมำรถเกิด keyPressed() ใน GameCanvas

class GameCanvasWithKeyPressed extends GameCanvas{ Graphics g; public GameCanvasWithKeyPressed() { super(true); g = getGraphics(); } public void keyPressed(int keyCode){ String keyName = getKeyName(keyCode); display(g,keyCode, keyName); }

}

public void display(Graphics g,int keyCode, String keyName){ g.setColor(255,255,255); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(255, 0, 0); g.drawString(keyCode+" : "+keyName, 0, getHeight(), Graphics.BOTTOM | Graphics.LEFT); flushGraphics(); }

Lab 2.6 GameCanvas & keyState GameCanvasAndKeyStateDemoMIDlet.java • สร้ำง GameCanvas โดยให้มี game loop รับค่ำกำรกด keyState • สังเกตุ key ทีร่ ับจำก getKeyStates() ใน GameCanvas

class GameCanvasWithKeyStroke extends GameCanvas implements Runnable{ Graphics g; boolean running; protected GameCanvasWithKeyStroke() { super(true); g = getGraphics(); } public void display(int keyState,String name){ g.setColor(255,255,255); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(255, 0, 0); g.drawString(keyState+":"+name, 0, getHeight(), Graphics.LEFT | Graphics.BOTTOM); flushGraphics(); } public void start(){ running = true; Thread t = new Thread(this); t.start(); } ……………..

…………………….. public void run() { int keyState; String keyName; while(running){ keyState = getKeyStates(); if(keyState ==LEFT_PRESSED) display(keyState,"LEFT"); else if(keyState==RIGHT_PRESSED) display(keyState,"RIGHT"); else if(keyState==UP_PRESSED) display(keyState,"UP"); else if(keyState==DOWN_PRESSED) display(keyState,"DOWN"); else if(keyState==FIRE_PRESSED) display(keyState,"FIRE"); else if(keyState==GAME_A_PRESSED) display(keyState,"A"); else if(keyState==GAME_B_PRESSED) display(keyState,"B"); else if(keyState==GAME_C_PRESSED) display(keyState,"C"); else if(keyState==GAME_D_PRESSED) display(keyState,"D"); } } }

//end class

Lab 2.7 GameCanvasMIDletDemo • สร้ำง MyGameCanvas extends GameCanvas โดย – canvas มีกำรเช็คกำรกดปุ่ม เมื่อมีกำรกดปุ่ม ขึ้น ลง ซ้ำย ขวำ จะขยับกล่องสีแดงไปตำมปุ่มที่กด – กล่องสีแดงต้องไม่หลุดออกจำก screen

• ลองเปลี่ยนจำกกล่องแดง เป็น Image

public class GameCanvasMIDletDemo extends MIDlet { GameCanvasDemo1 canvas =new GameCanvasDemo1(); public GameCanvasMIDletDemo() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { }

}

protected void startApp() throws MIDletStateChangeException { Display d = Display.getDisplay(this); canvas.start(); d.setCurrent(canvas); }

public class GameCanvasDemo1 extends GameCanvas implements Runnable { boolean playing; // เช็คสถำนะกำรรันเกม int delay; // delay กำรวำดภำพ graphics int cx,cy; // ตำำแหน่ง (x,y ) ปัจจุบันของกล่องแดง int w,h; // width และ height ของ screen public GameCanvasDemo1() { super(true); // init ค่ำ attribute ต่ำงๆ } public void start(){ //automatic start thread เมื่อมีกำรเรียก canvas.start() playing = true; Thread t = new Thread(this); t.start(); } public void stop(){ // หยุดเกม เมื่อมีกำรเรียก canvas.stop() playing = false; } public void run() { // loop เกม โดยมีกำร getInput() และ drawScreen() } void getInput(){ // เช็ค keyStates หรือปุ่มที่กด กำำหนดค่ำ cx, cy ใหม่ จำกกำรกดปุ่ม } void drawScreen(Graphics g){ // วำดกล่องแดงที่ตำำแหน่ง cx,cy } }

public class GameCanvasDemo1 extends GameCanvas implements Runnable { boolean playing; int delay; int cx,cy; int w,h; public GameCanvasDemo1() { super(true); w = getWidth(); h = getHeight(); cx = w/2; cy = h/2; delay = 20; } public void start(){ playing = true; Thread t = new Thread(this); t.start(); } public void stop(){ playing = false; } ………….

…………. public void run() { Graphics g = getGraphics(); //getGraphics() เพื่อใช้ในกำรวำดภำพใน drawScreen() while(playing){ getInput(); drawScreen(g); try {Thread.sleep(delay);} catch (InterruptedException e) { } } } void getInput(){ int keyStates = getKeyStates(); if(keyStates== LEFT_PRESSED) cx = Math.max(0, cx-1); else if(keyStates==RIGHT_PRESSED) cx = Math.min(w, cx+1); else if(keyStates==UP_PRESSED) cy = Math.max(0, cy-1); else if(keyStates==DOWN_PRESSED) cy= Math.min(h, cy+1); } void drawScreen(Graphics g){ g.setColor(0); g.fillRect(0, 0, w, h); g.setColor(255, 0, 0); g.fillRect(cx, cy, 5, 5); flushGraphics(); //flush off-screen buffer } }

Lab 2.8 GameCanvas & Thread • BouncingBallMIDlet.java • สร้ำง GameCanvas ให้แสดง bouncing ball ทุกครั้งที่ ball ชนขอบ screen ให้เปลี่ยนสี ball ด้วย • GameCanvas ให้มีปุ่มสองปุ่มคือ start, stop เพื่อเริ่มและหยุดกำรทำำงำนของ Thread

public void run() { Graphics g = getGraphics(); Random r = new Random(); int re = Math.abs(r.nextInt()%255); int gr = Math.abs(r.nextInt()%255); int bl = Math.abs(r.nextInt()%255); int dx = 2; int dy = -1; boolean hit = false; int radius = 30; while(running){ g.setColor(0); g.fillRect(0, 0, w, h); g.setColor(re,gr,bl); g.fillArc(cx, cy, radius, radius, 0, 360); try {Thread.sleep(10);} catch (InterruptedException e) { cx+=dx; cy+=dy; if(cx<=0 || cx>=w-radius){dx=-dx; hit = true;} if(cy<=0 || cy>=h-radius){dy=-dy; hit = true;} if(hit){

}

}

//change color if there is a hit hit=false; re = Math.abs(r.nextInt()%255); gr = Math.abs(r.nextInt()%255); bl = Math.abs(r.nextInt()%255);

} flushGraphics();

}

Sprite • • • • • •

Sprite Sprite Frames Frame sequence Sprite transforms Sprite drawing Sprite collision

Sprite : Constructor Sprite(Image image) สร้ำง single frame sprite, non-animated

Sprite(Sprite sprite) สร้ำง sprite จำก sprite ตัวอื่น

Sprite(Image image, int frameWidth, int frameHeight) สร้ำง animated-sprite จำก Image โดยสร้ำงเป็น frame จำก image

frameHeight

frameWidth

frame index

0

1

2

3

4

5

6

7

8

9 10 11

12 13 14 15

NOTE !! • Really be careful !!!! • ตอนที่เรำสร้ำง Sprite จำก constructor Sprite(Image image, int frameWidth, int frameHeight)

• ถ้ำ frameWidth, frameHeight ไม่ลงตัวกับ Image ที่สร้ำง Sprite จะเกิด IllegalArgumentException • เช่นถ้ำ Image มีขนำด 40*80 แต่เรำสร้ำง Sprite s = new Sprite(im,24,7) แบบนี้ ไม่ได้

Sprite: method boolean collidesWith(Sprite s, boolean pixelLevel) boolean collidesWIth(TiledLayer t, boolean pixelLevel) void defineCollisionRectangle(int x, int y, int w, int h) void defineReferencePixel(int x, int y) int getFrame() int getFrameSequenceLength() void nextFrame() void paint(Graphics g) void prevFrame() void setFrame(int sequenceIndex) void setFrameSequence(int[] sequence) void setTransform(int transform)

Lab 2.9 SpriteDemoMIDlet1.java • สร้ำง GameCanvas ให้แสดง Sprite สองจุด โดยใช้ method nextFrame() และ prevFrame() ในกำรแสดงผล 128 pixels

192 pixels

class GameCanvasSprite1 extends GameCanvas implements Runnable{ Sprite hero, hero2; boolean running; protected GameCanvasSprite1() { super(true); Image im = null; try { im = Image.createImage("/sprites/c1.png"); } catch (IOException e) { } hero = new Sprite(im,32,48); //frame width = 32 hero2 = new Sprite(im,32,48); //frame height = 48 }

......

public void start(){ running = true; Thread t = new Thread(this); t.start(); }

.................

public void run() { Graphics g = getGraphics(); int delay = 80; while(running){ drawScreen(g); hero.nextFrame(); //hero แสดง nextFrame hero2.prevFrame(); //hero2 แสดง prevFrame try {Thread.sleep(delay);} catch (InterruptedException e) { } } } void drawScreen(Graphics g){ int w = getWidth(); int h = getHeight(); g.setColor(0); g.fillRect(0, 0, w, h); hero.setPosition(w/2-50, h/2); hero.paint(g); hero2.setPosition(w/2+50, h/2); hero2.paint(g);

}

}

flushGraphics();

//กำำหนดตำำแหน่ง และวำด sprite

Lab 2.10 SpriteDemoMIDlet2.java • สร้ำง GameCanvas ให้แสดง Sprite โดยแสดงตำำแหน่งและทิศทำง ตำม key ที่กดคือ – – – –

left right up down

Lab 2.10 : IDEA • สร้ำง int[] ของ direction แต่ละตัว เช่น

– int[] frontDirection = {0,1,2,3}; – int[] leftDirection = {4,5,6,7}; ** ขึ้นอยู่กบั รูป sprite ของเรำว่ำหันไปทิศทำงใดก่อน**

• สร้ำง thread ให้รับค่ำ input และ drawScreen โดยหำกมีกำรกด key ให้เช็คว่ำ keyใดถูกกด เปลี่ยน direction ไปในทิศทำงนั้น และใช้ method sprite.setFrameSequence(int[]) เพือ่ เปลี่ยน frame index ของ sprite ในกำรแสดงผล • **ในตัวอย่ำงเรำสร้ำงเป็น int[][] เพื่อเก็บ sequence เพื่อให้เขียน code ง่ำยขึ้น **

class GameCanvasSprite2 extends GameCanvas implements Runnable{ static int FRONT_DIRECTION = 0; //สร้ำง static int เพือ่ ใหง่ำยในกำรเขียน code static int LEFT_DIRECTION = 1; static int RIGHT_DIRECTION = 2; static int BACK_DIRECTION = 3; Sprite hero; boolean running; int[][] sequence = { {0,1,2,3}, //front {4,5,6,7}, //left {8,9,10,11}, //right {12,13,14,15}}; //back int w, h; int cx,cy; int currentDirection = FRONT_DIRECTION; protected GameCanvasSprite2() { super(true); Image im = null; try {im = Image.createImage("/sprites/c1.png");} catch (IOException e) { } hero = new Sprite(im,32,48); w = getWidth(); h = getHeight(); cx = w/2; cy = h/2; hero.setFrameSequence(sequence[0]); }

public void start(){ running = true; Thread t = new Thread(this); t.start(); } public void run() { Graphics g = getGraphics(); int delay = 40; while(running){ getInput(); drawScreen(g); hero.nextFrame(); try {Thread.sleep(delay);} catch (InterruptedException e) { } } void drawScreen(Graphics g){ int w = getWidth(); int h = getHeight(); g.setColor(0); g.fillRect(0, 0, w, h); hero.setPosition(cx, cy); hero.paint(g); flushGraphics(); }

}

}

void getInput(){ int keyState = getKeyStates(); int cDirection = currentDirection; // เก็บทิศทำงปัจจุบนั ไว้ เพือ่ เช็คว่ำมีกำรเปลีย่ นทิศทำงหรือไม่ if(keyState== LEFT_PRESSED){ cx--; cx = Math.max(0, cx); currentDirection= LEFT_DIRECTION; } else if(keyState== RIGHT_PRESSED){ cx++; cx = Math.min(cx, w); currentDirection= RIGHT_DIRECTION; } else if(keyState== UP_PRESSED){ cy--; cy = Math.max(0, cy); currentDirection= BACK_DIRECTION; } else if(keyState== DOWN_PRESSED){ cy++; cy = Math.min(cy, h); currentDirection= FRONT_DIRECTION; } if(cDirection != currentDirection){ //เช็คว่ำมีกำรเปลีย่ น direction หรือเปล่ำ หำกเปลีย่ นให้ setFrameSequence // ใหม่เพือ่ ให้ได้ frame sequence ที่ตรงกับทิศทำงเดิม hero.setFrameSequence(sequence[currentDirection]); } }

Sprite & collide • SpriteCollideDemoMIDlet3.java • สร้ำง GameCanvas โดยให้แสดง sprite สองตัว • หำก sprite ชน อีกตัว ให้หยุดเดิน

LayerManager

LayerManager methods void append(Layer l) Layer getLayerAt(int index) int getSize() void insert(Layer l, int index) void paint(Graphics g, int x, int y) void remove(Layer l) void setViewWindow(int x, int y, int w, int h) ** leyer ที่ append ก่อน จะอยู่ด้ำนบนสุด

Lab 2.11 LayerManagerDemoMIDlet1.java • สร้ำง GameCanvas โดยสร้ำง LayerManger เพื่อโหลดภำพ background และ sprite

class MyGameCanvas1 extends GameCanvas implements Runnable{ boolean running; int delay = 50; int cx, cy, w, h; Sprite player; Sprite background; LayerManager layerManager; protected MyGameCanvas1() { super(true); w = getWidth(); h = getHeight(); cx = w/2; cy = h/2; Image playerImage=null,bgImage=null; try { playerImage = Image.createImage("/sprites/c3.png"); bgImage = Image.createImage("/sprites/bg1.png"); } catch (IOException e) { } player = new Sprite(playerImage,32,48); background = new Sprite(bgImage);

}

layerManager = new LayerManager(); layerManager.append(player); layerManager.append(background);

public void start(){ running = true; Thread t = new Thread(this); t.start(); } public void run() { Graphics g = getGraphics(); while(running){ input(); drawScreen(g); try {Thread.sleep(delay);} catch (InterruptedException e) {} } } void input(){ ……………….. } void drawScreen(Graphics g){ g.setColor(0); g.fillRect(0, 0, w, h);

}

}

player.setPosition(cx, cy); layerManager.paint(g, 0, 0); flushGraphics();

not setting anything

setViewWindow(100,0, w, h)

setViewWindow(100,30,w, h);

LayerManager and Scrolling background • Idea ของกำรทำำ scrolling background คือใช้ method setViewWindow(sx,sy,w,h) • โดย sx, sy คือตำำแหน่ง viewpoint บน background ที่ต้องกำรแสดงบน screen. (sx,sy)

Lab 2.12 LayerManagerDemoMIDlet1.java • สร้ำง GameCanvas โดยให้แสดง sprite และ background เมื่อตัว sprite ชนขอบ screen ให้เลื่อน background ไปหน้ำถัดไป จนกว่ำจะถึงปลำย background

TiledLayer mao[] ={ 4,5,5,5,5,5,5,4,4,4, 4,5,5,5,5,5,5,5,5,4, 4,5,5,5,2,2,5,5,5,4, 4,5,5,5,2,2,5,5,5,4, 4,4,5,5,2,2,5,5,5,4, 4,4,4,5,5,2,2,2,5,4, 1,1,3,3,5,5,2,2,5,4, 3,1,3,3,3,5,5,5,5,4, 3,1,1,3,3,3,5,5,1,1, 3,3,1,1,1,1,1,1,1,3, 3,3,3,3,3,3,3,3,3,3}

Related Documents

02 Midp Game Class
November 2019 16
09 Scmad Midp Game Api
November 2019 14
Midp
November 2019 13
Class 02
November 2019 19
Midp 2
November 2019 11
Midp 1
November 2019 13