首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 實現水波紋特效:浮點運算與 CLDC 1.0 相容方案

     編輯:J2ME

水波紋是經典粒子系統特效,隨 CLDC 1.1 支援浮點運算,可在 J2ME 直接實現。本文提供完整實作碼,並針對 CLDC 1.0 無浮點環境提出兩種替代方案。

CLDC 1.1 浮點版本實作

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) {}
        }
    }
}

核心算法解析

  • 逐行位移:將圖片拆解為高度為 1 的水平條帶,每條帶依正弦函數計算水平位移 wave
  • 相位動畫:angle 隨幀遞增,產生波浪流動感
  • 鏡像合成:imgBuff 寬度為雙倍,包含正向與鏡像波浪,配合 Sprite.TRANS_MIRROR_ROT180 產生倒影效果

CLDC 1.0 無浮點環境的替代方案

方案一:定點數(整數放大法)

  • 將小數放大 1000 倍存為 int(如 1.4 → 1400)
  • 運算時保持放大比例,最終結果除以 1000
  • 預計算 sin 值表:int[] sinTable = new int[360]; // 存放 sin(度數)*1000
  • 優點:無浮點依賴、效能佳;缺點:精度有限、程式碼較繁瑣

方案二:開源浮點庫

  • 如 J2ME Polish 的 HFloat 類
  • 優點:API 近似 float、移植容易
  • 缺點:效率極低,不適合即時特效渲染

效能建議

  1. 優先針對 CLDC 1.1 設備開發浮點版本,體驗最佳
  2. CLDC 1.0 設備採用定點數 + sin 查表法,平衡效能與相容性
  3. 避免在渲染迴路中建立物件(如 new Integer),預先分配陣列
  4. 考慮降低幀率(如 10-12 FPS)以減輕 CPU 壓力

水波紋特效展示了 J2ME 在受限環境下仍能實現視覺震撼效果,關鍵在於算法優化與平台特性的巧妙結合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved