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

J2ME 線程實戰:以俄羅斯方塊為例詳解 Canvas 與 Runnable 整合

     編輯:Java 相關知識

J2ME 繼承 J2SE java.lang.Thread 與 Runnable,但無線程組、守護線程。本文以完整俄羅斯方塊源碼示範:Canvas 實現 Runnable,內部線程驅動遊戲主循環,鍵盤事件控制方塊移動/旋轉,repaint() 觸發繪製。

架構設計

  • MIDlet:startApp() 顯示 TetrisCanvas。
  • TetrisCanvas extends Canvas implements Runnable:
    • 構造器啟動 Thread(this).start()。
    • run() 循環:方塊下落、碰撞檢測、消行計分、速度遞增、新方塊生成、Game Over 重置。
    • paint(Graphics):繪製背景、下一個方塊預覽、分數/速度/行數、遊戲區格子、當前下落方塊。
    • keyPressed(int keyCode):映射 Canvas.UP/DOWN/LEFT/RIGHT/FIRE 控制移動、加速下落、旋轉。

關鍵優化技巧

  1. 避免浮點運算:CLDC 1.0 無浮點支援,所有座標、速度用整數。
  2. 常量集中管理:顏色、方塊大小、畫布尺寸、偏移量定義為 static final int,便於移植調整。
  3. 圖片壓縮:背景圖使包體從 5KB 膨脹至 47KB,優先用代碼繪製簡單圖形,必須用圖時選高壓縮 PNG。
  4. 混淆保護:啟用 ProGuard/Obfuscator 防反編譯。
  5. 繪製順序優化:背景 → UI 面板 → 靜態格子 → 動態方塊,減少過繪。

核心邏輯片段

// 方塊定義:{x1,y1,x2,y2,x3,y3,x4,y4,color,rotationCount}
int BlockInfo[][] = {{1,0,1,1,1,2,1,3,0xff0000,2}, ...};

// 碰撞檢測
private boolean feasible() {
    for (int i=0;i<=3;i++)
        if (Gridmatrix[BlockY+BlockInfo[BlockType][i*2]][BlockX+BlockInfo[BlockType][i*2+1]]!=0)
            return false;
    return true;
}

// 消行邏輯
private void delline() { /* 將當前方塊固化至 Gridmatrix,從底向上掃描滿行,下移上方所有行,更新分數/速度 */ }

線程主循環

public void run() {
    while (Blocker != null) {
        if (!ISDOWN) {
            BlockY++;
            if (!feasible()) { ISDOWN=true; BlockY--; delline(); sleep(400); }
            else { repaint(); sleep(950 - 100*BlockSpeed); }
        } else {
            // 固化、計分、生成新方塊、檢測 Game Over
            ISDOWN=false; repaint(); BlockSpeed=CurSpeed;
            BlockType=FutureBlockType; FutureBlockType=random(19);
            BlockX=4; BlockY=0; if (!feasible()) init(); // Game Over 重置
        }
    }
    Blocker = null;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved