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

J2ME 簡易動畫實作:視覺暫留原理、雙緩衝與遊戲迴圈基礎

     編輯:J2ME

動畫核心原理

利用人眼視覺暫留(約 1/24 秒),快速切換靜態畫面產生動態錯覺。J2ME 無系統級動畫引擎,需自行實作遊戲迴圈:

  1. 更新邏輯狀態(座標、幀索引、物理)。
  2. 繪製下一幀至離屏緩衝。
  3. 翻轉緩衝顯示(flushGraphics())。
  4. 控制幀率(Thread.sleep)。

最小動畫範例:文字閃爍

public class BlinkCanvas extends Canvas implements Runnable {
    private boolean show = true;
    private Thread animator;

    public BlinkCanvas() {
        animator = new Thread(this);
        animator.start();
    }

    protected void paint(Graphics g) {
        g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0x000000);
        if (show) g.drawString("閃爍文字", 50, 50, Graphics.TOP|Graphics.LEFT);
    }

    public void run() {
        while (true) {
            try { Thread.sleep(200); } // 5 FPS
            catch (InterruptedException e) {}
            show = !show;
            repaint(); // 排程 paint()
        }
    }
}

進階:Sprite 幀動畫(角色走路)

public class WalkCanvas extends GameCanvas implements Runnable {
    private Image spriteSheet; // 4 幀橫向排列
    private int frameW, frameH, currentFrame = 0;
    private int x = 10, y = 50, speed = 2;

    public WalkCanvas() throws IOException {
        super(true); // 啟用雙緩衝
        spriteSheet = Image.createImage("/walk.png");
        frameW = spriteSheet.getWidth() / 4;
        frameH = spriteSheet.getHeight();
        new Thread(this).start();
    }

    protected void paint(Graphics g) { /* GameCanvas 不需 override paint */ }

    public void run() {
        Graphics g = getGraphics();
        while (true) {
            long t0 = System.currentTimeMillis();
            // 邏輯更新
            x += speed;
            if (x > getWidth()) x = -frameW;
            currentFrame = (currentFrame + 1) % 4;
            // 繪製
            g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
            g.drawRegion(spriteSheet, currentFrame*frameW, 0, frameW, frameH,
                         Sprite.TRANS_NONE, x, y, Graphics.TOP|Graphics.LEFT);
            flushGraphics();
            // 幀率控制
            long dt = System.currentTimeMillis() - t0;
            if (dt < 100) { // 10 FPS
                try { Thread.sleep(100 - dt); } catch (Exception e) {}
            }
        }
    }
}

關鍵技術要點

技術說明
GameCanvas內建雙緩衝、getKeyStates() 非阻塞鍵盤查詢,適合遊戲。
drawRegion從大圖裁剪單一幀繪製,避免載入多張小圖。
幀率獨立移動位移量 = 速度 × Δtime,避免不同裝置速度差異。
記憶體管理結束時 spriteSheet=null; System.gc(); 釋放影像記憶體。

常見效能陷阱

  • 在 paint/run 建立新物件(String、Image、Array)→ GC 卡頓。預先建立並重用。
  • 未使用雙緩衝直接繪製螢幕 → 畫面閃爍。
  • Thread.sleep 參數過小(<10ms)導致忙碌等待,耗電且不準確。

結語

掌握遊戲迴圈、雙緩衝與幀動畫技巧,即可在 J2ME 上實作流暢的 2D 遊戲畫面,為豐富互動體驗奠基。

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