国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2ME 2D小游戲入門之周邊工具類

2019-11-18 15:39:52
字體:
來源:轉載
供稿:網友

  二、完善周邊工具類(圖象、GameObject、Font)

  雖然我們有了midp2.0的支持,但是有時還是需要一些輔助工具,方便我們使用。這怕是在進行真正的游戲設計之前最有趣的了。

  1、首先是一個ImageTools工具類,提供一個方法幫助調用Image

public class ImageTools {
 PRotected ImageTools() {}

 public static Image getImage(String str){
  Image img=null;
  try {
   img = Image.createImage(str);
  }
  catch (Exception ex) {
   System.out.println(ex);
  }
  finally{
   return img;
  }
 }
}
  2.GameObject,提供一個通用的游戲對象。

  有了Sprite類,為什么還要GameObject呢?其實我們一般是將Sprite,看作成一個高級的Image,往往一個Sprite要被多個游戲對象調用,GameObject其實就是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);
 }
}

  3.封裝字體類,你需要漂亮的字體嗎?

  我們經常需要用圖片來輸出文字,一個方便的字體類是必須的。我們希望僅僅提供一個圖片,一個圖片所描述的字符的數組,來初始化一個字體類。字體類提供一個類似Textout的方法,方便得在一個位置輸出信息。先封裝一個簡單的版本,只支持英文和數字,并且輸出不能自動換行。可能你有一個簡單的思路,就是簡單的保存字符數組,當打印的時候遍歷數組,來查找每個字符在sprite的frameseq中的index,但當我們打印一個字符串的時候就會發現,太多的遍歷操作耽誤了寶貴時間,這里我們使用一個小技巧用容量換取速度,我們知道Character. hashCode()可以返回字符的ascii編碼,常用字符將返回1-127;利用這一點,我們開辟一個128的數組charhash,將輸入的字符c所在圖片index存入charhash[c. hashCode()]中。以后也用這種映射方法來讀取字符。charhash的元素初值為-1,以后只要數值大于0就是有效值。

public class Font {
 Sprite sprite; //Sprite
 int width,height; //每個char的尺寸
 int[] charhash; //儲存1-127個常見字符在sprite的frameseq中的位置
 Graphics g;
 public Font(Graphics g,Image img, int width, int height, char[] chars) {
  this.g=g;
  sprite=new Sprite(img,width,height);
  this.width=width;
  this.height=height;
  charhash=new int[128];
  for (int i = 0; i < charhash.length; i++) {
   charhash[i]=-1;//沒有代表此字符的圖片
  }
  Character c;
  for (int i = 0; i < chars.length; i++) {
   c=new Character(chars[i]);
   charhash[c.hashCode()]=i;
  }
 }
public void drawChar(char ch, int x, int y){
 Character c=new Character(ch);
 int hashcode=c.hashCode();
 sprite.setPosition(x,y);
 if(hashcode>=0){
  sprite.setFrame(charhash[hashcode]);
  sprite.paint(g);
 }
}

public void drawString(String str, int x, int y){
 int length=str.length();
 for (int i = 0; i < length; i++) {
  drawChar(str.charAt(i),x+width*i,y);
 }
}

}
  這樣只要有一個實例font,就可以調用font.drawString(“hello”,0,0);

  在0,0位置輸出漂亮的圖片字符串。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 微山县| 雷波县| 婺源县| 西丰县| 武城县| 博乐市| 临江市| 黄梅县| 梨树县| 隆子县| 普陀区| 宜良县| 琼结县| 肇源县| 玉林市| 湟源县| 新野县| 大方县| 德格县| 临湘市| 遂溪县| 樟树市| 通榆县| 枞阳县| 鄄城县| 鄂托克旗| 乃东县| 屏东市| 凤凰县| 榆树市| 阳山县| 彰化县| 滨海县| 玉环县| 桃园县| 平果县| 安西县| 永丰县| 镇巴县| 浦江县| 峨边|