作者對建立了一些在游戲制作中常用的工具。封裝的很不錯,和有借鑒作用。
二、完善周邊工具類(圖象、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位置輸出漂亮的圖片字符串。怎麼樣還挺好使的吧:)