#眉標=Java #副標=如何簡化遊戲的設計 #大標=Game API進階(下)   ================================ 程式1 MyGameWithSpriteRotateCanvas3.java import javax.microedition.lcdui.* ; import javax.microedition.lcdui.game.* ; public class MyGameWithSpriteRotateCanvas3 extends GameCanvas implements Runnable { private LayerManager lm; private TankSprite2 c1 ; public MyGameWithSpriteRotateCanvas3() { super(true) ; lm = new LayerManager(); c1 = createTank("/pic/tank.png") ; c1.setPosition(10,10); lm.append(c1); } private TankSprite2 createTank(String pic) { Image img = null ; try { img = Image.createImage(pic); }catch(Exception exp) { System.out.println(exp); } return new TankSprite2(img,32,32,128,128) ; } boolean conti = true ; int rate = 100 ; public void run() { long st = 0 ; long et = 0 ; Graphics g = getGraphics() ; while(conti) { st = System.currentTimeMillis() ; input() ; render(g) ; et = System.currentTimeMillis() ; if((et-st)============== ================================= 程式2 TankSprite2.java import javax.microedition.lcdui.* ; import javax.microedition.lcdui.game.* ; public class TankSprite2 extends Sprite { int bx = 0 ; int by = 0 ; public TankSprite2(Image img,int w,int h,int bx,int by) { super(img,w,h); this.bx = bx ; this.by = by ; defineReferencePixel(w / 2,h / 2); } public void moveUp() { move(0,-4) ; //判斷上邊界 if( getY() <= 0 ) { setPosition(getX(),0) ; } } public void moveDown() { move(0,4) ; //判斷下邊界 if( getY() > (by - getHeight()) ) { setPosition(getX(),(by - getHeight())) ; } } public void moveLeft() { move(-4,0) ; //判斷左邊界 if( getX() <= 0 ) { setPosition(0,getY()) ; } } public void moveRight() { move(4,0) ; //判斷右邊界 if( getX() > (bx - getWidth()) ) { setPosition((bx - getWidth()),getY()) ; } } int state = 0 ; public void rotate() { state++ ; if(state > 11) state = 0 ; setTankDirection(state) ; } public void setTankDirection(int state) { switch(state) { case 0 : setTransform(TRANS_NONE) ; setFrame(0) ; break ; case 1 : setTransform(TRANS_NONE) ; setFrame(1) ; break ; case 2 : setTransform(TRANS_NONE) ; setFrame(2) ; break ; case 3 : setFrame(0) ; setTransform(TRANS_ROT90) ; break ; case 4 : setFrame(1) ; setTransform(TRANS_ROT90) ; break ; case 5 : setFrame(2) ; setTransform(TRANS_ROT90) ; break ; case 6 : setFrame(0) ; setTransform(this.TRANS_ROT180) ; break ; case 7 : setFrame(1) ; setTransform(this.TRANS_ROT180) ; break ; case 8 : setFrame(2) ; setTransform(this.TRANS_ROT180) ; break ; case 9 : setFrame(0) ; setTransform(this.TRANS_ROT270) ; break ; case 10 : setFrame(1) ; setTransform(this.TRANS_ROT270) ; break ; case 11 : setFrame(2) ; setTransform(this.TRANS_ROT270) ; break ; } } } ==================================== #圖2 執行結果。   ========================== 程式3 BadSprite.java import javax.microedition.lcdui.* ; import javax.microedition.lcdui.game.* ; import java.util.* ; public class BadSprite extends Sprite { int bx = 0 ; int by = 0 ; public BadSprite(Image img,int w,int h,int bx,int by) { super(img,w,h); this.bx = bx ; this.by = by ; } Random r = new Random(new Date().getTime()) ; public void AI() { int i = r.nextInt() % 4 ; switch(i) { case 0: moveUp() ; break; case 1: moveDown() ; break; case 2: moveLeft() ; moveLeft() ; moveLeft() ; break; case 3: moveRight() ; moveRight() ; moveRight() ; break; } } public void moveUp() { move(0,-4) ; //判斷上邊界 if( getY() <= 0 ) { setPosition(getX(),0) ; } } public void moveDown() { move(0,4) ; //判斷下邊界 if( getY() > (by - getHeight()) ) { setPosition(getX(),(by - getHeight())) ; } } public void moveLeft() { move(-4,0) ; //判斷左邊界 if( getX() <= 0 ) { setPosition(0,getY()) ; } } public void moveRight() { move(4,0) ; //判斷右邊界 if( getX() > (bx - getWidth()) ) { setPosition((bx - getWidth()),getY()) ; } } } ============================= #圖5 =============================== 程式4 MyGameWithColliCanvas.java import javax.microedition.lcdui.* ; import javax.microedition.lcdui.game.* ; public class MyGameWithColliCanvas extends GameCanvas implements Runnable { private LayerManager lm; private TankCanFireSprite c1 ; private BadSprite bad ; public MyGameWithColliCanvas() { super(true) ; lm = new LayerManager(); c1 = createTank("/pic/tank.png") ; c1.setPosition(80,100); lm.append(c1); bad = createBad("/pic/bad.png") ; bad.setPosition(20,0); lm.append(bad); } private TankCanFireSprite createTank(String pic) { Image img = null ; try { img = Image.createImage(pic); }catch(Exception exp) { System.out.println(exp); } return new TankCanFireSprite(img,32,32,128,128) ; } private BadSprite createBad(String pic) { Image img = null ; try { img = Image.createImage(pic); }catch(Exception exp) { System.out.println(exp); } return new BadSprite(img,64,64,128,128) ; } boolean conti = true ; int rate = 100 ; public void run() { long st = 0 ; long et = 0 ; Graphics g = getGraphics() ; while(conti) { st = System.currentTimeMillis() ; input() ; bad.AI(); if(collidect()) { render(g) ; break ; } render(g) ; et = System.currentTimeMillis() ; if((et-st)========================