J2ME遊戲開發例項講解

javaprogramers發表於2005-03-25
    
       跳過J2ME,我們先來講點遊戲的理論.具體到華容道這個遊戲,主要有三個方面,貼

圖.遊戲操作.邏輯判斷.這裡講講貼圖,其他兩方面放在概要設計和詳細設計裡講.所謂的

貼圖,其實就是畫圖,就是在要顯示圖形的位置上輸出一副圖片,(要是牽扯到動畫就要麻煩

一些,可以使用TimerTask.Thread或Rannable之類的技術),這副圖片可以是事先準備好的也

可以是臨時處理的.在J2ME中有一個Image類,專門用於管理圖片,它有createImage()方

法,可以直接讀取圖片檔案(J2ME只支援PNG格式的圖片),也可以擷取已有的圖片的一部分

(這樣我們可以把很多圖片放在一起,然後一張一張的截下來,好處是節省儲存空間和檔案讀

取時間,對於手機這兩者都是效能的瓶頸).
       J2ME還有一個Graphics類,專門用於繪圖,它有drawImage()方法,可以把一副圖片在

指定的位置上顯示出來,它還有drawRect()方法和setColor()方法,這兩個方法在後面我們進

行遊戲操作時就會用到,這裡先交代一下.有了圖片和繪圖的方法,還需要知道把圖畫到誰身

上,J2ME提供了一個Canvas類,字面意思就是畫布,它有一個paint()方法用於重新整理頁面,還

有一個repaint()方法用於呼叫paint()方法.聽著有些糊塗是吧,不要緊,我來結合具體程式

講解一下.為了今後程式設計的方便,我們建立兩個類Images和Draw,Images用於儲存一些常量

值和圖片,Draw主要是用於畫圖,這兩個類的原始碼如下。

Images類的原始碼如下:



package huarongroad; 
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;



public class Images {//儲存常量
//繪圖位置常量
public static final int UNIT = 32;//方塊的單位長度
public static final int LEFT = 10;//畫圖的左邊界頂點
public static final int TOP = 9;//畫圖的上邊界頂點
//地圖位置常量
public static final int WIDTH = 4;//地圖的寬度
public static final int HEIGHT = 5;//地圖的高度
//地圖示記常量
public static final byte CAOCAO = (byte) /'a/'; <A href="file://曹">file://曹</A>操的地圖示記
public static final byte MACHAO = (byte) /'b/';//馬超的地圖示記
public static final byte HUANGZHONG = (byte) /'c/';//黃忠的地圖示記
public static final byte GUANYU = (byte) /'d/';//關羽的地圖示記
public static final byte ZHANGFEI = (byte) /'e/';//張飛的地圖示記
public static final byte ZHAOYUN = (byte) /'f/';//趙雲的地圖示記
public static final byte ZU = (byte) /'g/';//卒的地圖示記
public static final byte BLANK = (byte) /'h/';//空白的地圖示記
public static final byte CURSOR = (byte) /'i/';//游標的地圖示記
//地圖組合標記常量
public static final byte DLEFT = (byte) /'1/'; <A href="file://組">file://組</A>合圖形左邊標記
public static final byte DUP = (byte) /'2/'; <A href="file://組">file://組</A>合圖形上邊標記
public static final byte DLEFTUP = (byte) /'3/'; <A href="file://組">file://組</A>合圖形左上標記
//圖片常量
public static Image image_base;//基本圖片
public static Image image_Zhaoyun;//趙雲的圖片
public static Image image_Caocao;//曹操的圖片
public static Image image_Huangzhong;//黃忠的圖片
public static Image image_Machao;//馬超的圖片
public static Image image_Guanyu;//關羽的圖片
public static Image image_Zhangfei;//張飛的圖片
public static Image image_Zu;//卒的圖片
public static Image image_Blank;//空白的圖片
public static Image image_Frame;//遊戲框架的圖片



public Images() {//建構函式
}



public static boolean init() {//初始化遊戲中用到的圖片
try {
image_base = Image.createImage("/huarongroad/BITBACK.png");
image_Frame = Image.createImage(image_base, 126, 0, 145, 177,
Sprite.TRANS_NONE);
//Sprite類是用來翻轉圖片的,是MIDP2.0新新增加的支援遊戲的特性
image_Zhaoyun = Image.createImage(image_base, 0, 0, UNIT, 2 * UNIT,
Sprite.TRANS_NONE);
image_Caocao = Image.createImage(image_base, UNIT, 0, 2 * UNIT,
2 * UNIT, Sprite.TRANS_NONE);
image_Huangzhong = Image.createImage(image_base, 3 * UNIT, 0, UNIT,
2 * UNIT,
Sprite.TRANS_NONE);
image_Machao = Image.createImage(image_base, 0, 2 * UNIT, UNIT,
2 * UNIT,
Sprite.TRANS_NONE);
image_Guanyu = Image.createImage(image_base, UNIT, 2 * UNIT,
2 * UNIT, UNIT,
Sprite.TRANS_NONE);
image_Zhangfei = Image.createImage(image_base, 3 * UNIT, 2 * UNIT,
UNIT, 2 * UNIT,
Sprite.TRANS_NONE);
image_Zu = Image.createImage(image_base, 0, 4 * UNIT, UNIT, UNIT,
Sprite.TRANS_NONE);
image_Blank = Image.createImage(image_base, 1 * UNIT, 4 * UNIT,UNIT,
UNIT,
Sprite.TRANS_NONE);



return true;
}catch (Exception ex) {
return false;
}
}
}

Draw類的原始碼如下:



package huarongroad;

import javax.microedition.lcdui.*;


public class Draw {
//繪製遊戲中的圖片
public Draw(Canvas canvas) {//建構函式
}



public static boolean paint(Graphics g, byte img, int x, int y) {
//在地圖的x,y點繪製img指定的圖片
try {
paint(g, img, x, y, Images.UNIT);//把地圖x,y點轉化成畫布的絕對座標,繪圖
return true;
}
catch (Exception ex) {
return false;
}
}



public static boolean paint(Graphics g, byte img, int x, int y, int unit) {
try {case Images.CAOCA//畫曹操
//變成絕對座標,並做調整
g.drawImage(Images.image_Caocao, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.GUANYU://畫關羽
g.drawImage(Images.image_Guanyu, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.HUANGZHONG://畫黃忠
g.drawImage(Images.image_Huangzhong, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.MACHA//畫馬超
g.drawImage(Images.image_Machao, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZHANGFEI://畫張飛
g.drawImage(Images.image_Zhangfei, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZHAOYUN://畫趙雲
g.drawImage(Images.image_Zhaoyun, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZU://畫卒
g.drawImage(Images.image_Zu, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.BLANK://畫空白
g.drawImage(Images.image_Blank, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.CURSOR://畫游標
g.drawRect(Images.LEFT + x * unit,
Images.TOP + y * unit,Images.UNIT,Images.UNIT);
break;
}
return true;
}catch (Exception ex) {
return false;
}
}
}

相關文章