J2ME 開發中,IDE 內建斷點常導致模擬器死機或干擾程式流程。解決方案是編寫自己的斷點函數 testFun()。核心原理:定義 boolean stopFlag,進入函數時設為 true,進入 while(stopFlag){} 死循環凍結執行緒,此時可在螢幕上檢視變數值;按任意鍵觸發 keyPressed() 將旗標設回 false,循環解除,程式繼續執行。
關鍵限制: testFun() 必須置於 run() 執行緒或其調用鏈中,否則 while 會佔用所有 CPU 時間,導致 keyPressed() 無法捕捉按鍵事件,造成真正死機。
圖1:斷點測試
稍加修改即可作為遊戲暫停功能,且優於 sleep()(理論上無法無限期暫停)。範例程式碼展示按下 FIRE 鍵切換 stopFlag 實現暫停/繼續:
public class BlocksCanvas extends Canvas implements Runnable {
private boolean stopFlag = false; // 暫停旗標
// ...
public void run() { ... testFun(); ... }
private void testFun() { while(stopFlag){} }
public void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (action == FIRE) stopFlag = !stopFlag;
}
}
受限於手機記憶體與功能,J2ME 僅提供部分 J2SE 工具類。文中實作了一個 kSet 類,模擬 J2SE Set 功能,用單鏈表儲存遊戲中被刪除的方塊座標,保證元素唯一。包含 add()、clear()、isEmpty()、getFirst()、contains() 等方法。kSetNode 內部類重寫 equals() 判斷座標是否相同。善用此類工具類能大幅加速開發、提升程式清晰度。
針對 Moto T720 開發的遊戲,在螢幕較大的手機上背景圖會貼在左上角。解決方式同樣是計算偏移量 addX、addY,並在建構函式中初始化各 UI 元素座標(遊戲區、等待區、分數區、五角星等),確保畫面居中。程式碼片段完整展示了座標計算與初始化邏輯。