J2ME 碎片化嚴重:MIDP 1.0 無圖片變換 API,Nokia UI 有專有 DirectGraphics,MIDP 2.0 引入 Sprite 並定義標準變換常量。為了讓遊戲邏輯層不用關心底層差異,本文提供一套統一介面的工具類,封裝裁剪、鏡像翻轉、旋轉功能,並自定義常量屏蔽平台差異。
| 操作 | 自定義常量 | Nokia UI | MIDP 2.0 (Sprite) |
|---|---|---|---|
| 直接繪製 | 0 | 0 | TRANS_NONE (0) |
| 繞 Y 軸鏡像(水平翻轉) | 0x2000 | FLIP_HORIZONTAL (0x2000) | TRANS_MIRROR (7) |
| 繞 X 軸鏡像(垂直翻轉) | 0x4000 | FLIP_VERTICAL (0x4000) | TRANS_MIRROR_ROT180 (1) |
| 順時針 90° | 90 | ROTATE_270 (270) | TRANS_ROT90 (5) |
| 順時針 180° | 180 | ROTATE_180 (180) | TRANS_ROT180 (3) |
| 順時針 270° | 270 | ROTATE_90 (90) | TRANS_ROT270 (6) |
上層邏輯統一使用自定義常量,工具類內部完成映射。
// 繪製整張圖片(支持翻轉)
void drawClipImage(Graphics g, int x, int y, Image img, int mode)
// 繪製圖片指定區域(不變換)
void drawClipImage(Graphics g, int x, int y, Image img,
int clipX, int clipY, int clipW, int clipH)
// 繪製指定區域 + 翻轉/旋轉
void drawClipImage(Graphics g, int x, int y, Image img,
int clipX, int clipY, int clipW, int clipH, int mode)
無硬件加速,逐列/逐行設置 Clip 區域並偏移繪製實現鏡像:
// 水平翻轉示例
for (int i = 0; i < clipW; i++) {
g.setClip(x + i, y, 1, clipH);
g.drawImage(img, x + i - clipX - clipW + i + 1, y - clipY, 0);
}
旋轉效率極低,建議美術直接提供旋轉後的素材圖。
獲取 DirectGraphics,映射常量後調用 drawImage(img, x, y, 0, mode)。需注意座標修正:翻轉/旋轉後圖片錨點位移,需根據 clip 區域重新計算繪製座標 (x, y)。
創建 Sprite,setTransform() 設置變換,setPosition() 定位,最後 paint(g)。Sprite 內部自動處理邊界與透明像素,代碼最簡潔。
createImage 產生大量小圖片對象導致內存碎片。