水波紋是經典粒子系統特效,隨 CLDC 1.1 支援浮點運算,可在 J2ME 直接實現。本文提供完整實作碼,並針對 CLDC 1.0 無浮點環境提出兩種替代方案。
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class SplashCanvas extends Canvas implements Runnable {
private Image img; // 原始圖片
private Image imgBuff; // 雙倍寬緩衝圖片
private Graphics ibg; // 緩衝繪圖上下文
private int w, h; // 圖片寬高
private int num = 0; // 動畫幀計數
private double angle; // 相位角
private int wave; // 波浪位移
public SplashCanvas() {
setFullScreenMode(true);
try { init(); } catch (Exception e) {}
}
private void init() throws Exception {
img = Image.createImage("/1.png"); // 需專案包含此圖片
w = img.getWidth();
h = img.getHeight();
imgBuff = Image.createImage(2 * w, h);
ibg = imgBuff.getGraphics();
ibg.drawImage(img, 0, 0, 0);
}
public void paint(Graphics g) {
// 清背景
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getClipWidth(), getClipHeight());
// 計算波浪參數
angle = num * Math.PI / 6;
double parm = 14.0;
// 逐行計算位移並繪製到緩衝圖
for (int i = 0; i < h; i++) {
wave = (int) ((i / parm + 1) * Math.sin(h / parm * (h - i) / (i + 1) + angle));
ibg.drawRegion(img, 0, i, w, 1, 0, 0, i + wave, 0);
}
num = (num + 1) % 12;
// 繪製原圖與鏡像波浪圖
g.drawImage(img, 10, 0, 0);
g.drawRegion(imgBuff, 0, 0, 2 * w, h, Sprite.TRANS_MIRROR_ROT180, 10, h, 0);
}
public void run() {
while (true) {
try {
Thread.sleep(80);
repaint();
} catch (Exception e) {}
}
}
}
waveangle 隨幀遞增,產生波浪流動感imgBuff 寬度為雙倍,包含正向與鏡像波浪,配合 Sprite.TRANS_MIRROR_ROT180 產生倒影效果int(如 1.4 → 1400)sin 值表:int[] sinTable = new int[360]; // 存放 sin(度數)*1000HFloat 類float、移植容易new Integer),預先分配陣列水波紋特效展示了 J2ME 在受限環境下仍能實現視覺震撼效果,關鍵在於算法優化與平台特性的巧妙結合。