程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME游戲之旅——精靈

J2ME游戲之旅——精靈

編輯:J2ME
做好了菜單。現在我們該考慮怎麼實現直升飛機了。
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;
    }
   
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved