做好了菜單。現在我們該考慮怎麼實現直升飛機了。
J2ME已經在Javax.microedtion.game.Sprite提供了專門的精靈類
Sprite類繼承自Javax.microedtion.game.layer,而如前文所述,layer是游戲畫面繪制的重要元素.
Sprite類有以下幾個常用的方法(顯然從字面上就能知道這些方法是做什麼的):
move(int x,int y);
setPosition(int x,int y);
setVisible();
paint(Graphics g);
但實際上不是特別方便實用,我們必須得每次指定如何更新幀,同時這個類僅僅表示了一組幀而已,我們需要更多的功能,這裡我引用了網上一篇教程中的東西,(來源:http://www.yesky.com/370/1871370.sHtml 作者:favoyang )
一個封裝了Sprite的GameObject類;
public class GameObject {
public Sprite sprite;//內置的Sprite
public boolean alive;//存活標記
private int lifecount=0;//生命周期計數器
public int lifetime=0;//生命周期,以桢為單位
public int
speed=0;//動畫桢更新速度,(0至無窮,0代表每一桢跟新一個畫面)
private int animcount=0;// /動畫桢更新計數器
public GameObject(Image img,int width,int height){
sprite=
new Sprite(img,width,height);
reset();
}
public void move(int dx,int dy){//相對移動
sprite.move(dx,dy);
}
public void moveto(int x,int y){//絕對移動
sprite.setPosition(x,y);
}
public void update(){//更新狀態,動畫桢更新,生命周期更新
if(!alive)
return;
if(++animcount>speed){
animcount=0;
sprite.nextFrame();
if(lifetime!=0 && ++lifecount>lifetime)
alive=false;
}
}
public void paint(Graphics g){//Paint
if(!alive)
return;
sprite.paint(g);
}
public void reset(){//復位
alive=true;
lifecount=0;
animcount=0;
sprite.setFrame(0);
}
}
可以明顯感覺到這個類比Sprite類的進步,我們可以控制它的生命周期,而不是要去一幀一幀的調整,更可方便地設置GameObject中Sprite的更新速度.
在我這個游戲裡直升飛機是個復雜的運動體:螺旋槳在旋轉,機身不做變化.所以我用一個Helicopter類封裝了兩個GameObject,一個GameObject 叫 heliBody(機身),另一個叫heliScrew(螺旋槳) .同時,還有一個額外的部分,
GameObject exploit,用於在飛機墜毀後顯示爆炸效果.
機身圖片
一組機翼圖片
import Javax.microedition.lcdui.Image;
import Javax.microedition.lcdui.Graphics;
import Java.io.*;
public class Helicopter {
public boolean alive; // 飛機是否存活,如果dying == true,依然認為飛機還存活
private GameObject heliBody = null;
private GameObject heliScrew = null;
private GameObject exploit = null;
private Image img;
private Rect playerRect = null; //自定義的Rect類,用來傳送當前單元所占的空間范圍.
public boolean dying = false; // 指示飛機是不是處在爆炸過程中
public Helicopter() {
alive = true;
try {
img = Image.createImage("/res/helicopter.png");
}
catch (IOException ioe){
ioe.printStackTrace();
}
heliBody = new GameObject(img,12,28);
heliBody.lifetime = 1;
try{
img = Image.createImage("/res/screws.png");
}catch (IOException ioe){
ioe.printStackTrace();
}
heliScrew = new GameObject(img,8,24);
heliScrew.lifetime = 7;
img = null;
try {
img = Image.createImage("/res/exploit.png");
}catch(IOException ioe){
ioe.printStackTrace();
}
exploit = new GameObject(img,30,30);
exploit.lifetime = 4; // 爆炸效果有 4 幀
exploit.speed = 1;
playerRect = new Rect(0,0,0,0);
}
public void update(){
if(dying == true){
if(exploit.alive == true)exploit.update(); // 如果是dying則更新爆炸效果
else alive = false; // 爆炸結束後飛機生命結束
return;
}
if(heliScrew.alive == true)heliScrew.update(); //正常情況下,循環更新螺旋槳,使其不停轉動
else heliScrew.reset();
}
public void moveto(int x,int y){ // 移動飛機位置,在按鍵處理中會調用
playerRect.top = y;
playerRect.left = x;
playerRect.right = x + 16;
playerRect.bottom = y + 34; /// 調整飛機所占空間范圍
exploit.moveto(x,y);
heliScrew.moveto(x,y);
heliBody.moveto(x+4,y+6);
}
public void paint(Graphics g){ /// 繪圖
if(dying == true && alive == true){
exploit.paint(g);
return;
}
if (!alive)
return;
heliBody.paint(g);
heliScrew.paint(g);
}
public Rect getPlayerRect(){ /// 范圍飛機位置范圍,在碰撞檢測中會用到
return playerRect;
}
}