為節省 JAR 空間,遊戲常需以單一圖片經程式翻轉產生鏡像幀(如角色朝左/右)。本文提供水平/垂直翻轉完整演算法與可直接執行的 MIDlet 範例。
i 欄繪製原圖第 w-1-i 欄i 列繪製原圖第 h-1-i 列關鍵技巧:Graphics.setClip(x, y, w, h) 限制繪製區域,配合 drawImage() 偏移座標實現像素級複製。
package imageflip;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class FlipDemoMIDlet extends MIDlet {
private Display display;
private FlipCanvas canvas;
protected void startApp() {
display = Display.getDisplay(this);
canvas = new FlipCanvas();
display.setCurrent(canvas);
}
protected void pauseApp() {}
protected void destroyApp(boolean u) {}
}
class FlipCanvas extends Canvas {
private Image srcImg;
public FlipCanvas() {
try { srcImg = Image.createImage("/leaf.png"); }
catch (Exception e) { e.printStackTrace(); }
}
protected void paint(Graphics g) {
// 清背景
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
int imgW = srcImg.getWidth();
int imgH = srcImg.getHeight();
int gap = 5;
// 1. 原圖
g.drawImage(srcImg, 0, 0, Graphics.TOP | Graphics.LEFT);
// 2. 水平翻轉
drawHFlip(g, srcImg, 0, imgH + gap);
// 3. 垂直翻轉
drawVFlip(g, srcImg, 0, 2*imgH + 2*gap);
}
// 水平翻轉:左右鏡像
private void drawHFlip(Graphics g, Image img, int x, int y) {
if (img == null) return;
int w = img.getWidth();
int h = img.getHeight();
for (int i = 0; i < w; i++) {
g.setClip(x + i, y, 1, h); // 單欄裁剪區
// 原圖對應欄:w-1-i,drawImage x 座標需抵銷
g.drawImage(img, x - w + 1 + 2*i, y, Graphics.TOP | Graphics.LEFT);
}
}
// 垂直翻轉:上下鏡像
private void drawVFlip(Graphics g, Image img, int x, int y) {
if (img == null) return;
int w = img.getWidth();
int h = img.getHeight();
for (int i = 0; i < h; i++) {
g.setClip(x, y + i, w, 1); // 單列裁剪區
g.drawImage(img, x, y - h + 1 + 2*i, Graphics.TOP | Graphics.LEFT);
}
}
}

由上而下:原圖 → 水平翻轉 → 垂直翻轉
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 即時 Clip 翻轉(本文) | 零額外記憶體、單一源圖 | 每幀 CPU 開銷 O(w+h) | 小圖片、幀率要求不高、極度省空間 |
| 預處理建立翻轉 Image | 繪製極快、無運算 | 記憶體 ×2~4 | 大圖片、高幀率、記憶體充足 |
| Sprite/MIDP 2.0 GameCanvas | 硬體加速、內建 transform | 需 MIDP 2.0 | 現代裝置首選 |
(x, y) → (y, w-1-x),同樣用 Clip 逐像素DirectGraphics)createRGBImage() + getRGB()/drawRGB() 處理 ARGB,記憶體/CPU 雙重壓力大