基於 MIDP 2.0 / CLDC 1.1 規範,使用 GameCanvas 雙緩衝渲染,主循環固定幀率 (如 20 FPS),每幀處理輸入、更新邏輯、繪製場景。
// 初始化
long gameTimeOffset = System.currentTimeMillis();
int gameTime = 0;
// 每幀更新
public void updateTimer() {
if (!gameOver) {
gameTime = (int)((System.currentTimeMillis() - gameTimeOffset) / 1000);
}
}
// 繪製 (使用自定義位圖字體類 Font)
fontBig.drawString(String.valueOf(gameTime), screenWidth/2 - 15, 10);
關鍵點:使用 System.currentTimeMillis() 而非 Thread.sleep 累加,避免幀率波動導致時間漂移;位圖字體 (數字圖片切片) 繁製比 Graphics.drawString 更高效、風格可控。
// 配置:每個獎勵階段贈送數量 (可擴展為動態配置)
int[] bombAward = {1, 1, 2, 1, 3, 2, 0, 0, ...}; // 索引對應 20s 階段
int bombAwardTop = bombAward.length - 1;
int[] bombAwarded = new int[bombAward.length]; // 0=未領取, 1=已領取
public void checkAward() {
int awardIndex = gameTime / 20;
if (awardIndex > bombAwardTop) awardIndex = bombAwardTop;
if (bombAwarded[awardIndex] == 0 && bombAward[awardIndex] > 0) {
bombNum += bombAward[awardIndex];
bombAwarded[awardIndex] = 1; // 標記已領取
// 可觸發視覺/聽覺提示:閃爍圖標、音效
}
}
設計亮點:陣列索引直接映射時間階段,O(1) 判斷;狀態陣列防止重複領取;配置數據與邏輯分離,便於策劃調整。
public class StringTools {
public static String timeOpinion(long gameTime) {
if (gameTime < 10) return "Do you play with your foot?";
else if (gameTime < 16) return "Come on, you can do it!";
else if (gameTime < 20) return "What a pity! Try again.";
else if (gameTime < 25) return "Very well, you are a real pro.";
else if (gameTime < 30) return "I know you have talent!";
else if (gameTime < 40) return "I can't believe, you are a master!";
else return "Oh my god, are you human?";
}
}
// 繪製 (直接使用 Graphics.drawString,因評價文本變化大,不適合位圖字體)
g.drawString(StringTools.timeOpinion(gameTime), 5, 22, Graphics.LEFT | Graphics.TOP);
ImageTools.getImage() 統一圖片載入 (處理 Jar 內路徑、異常);Font 位圖字體類復用;StringTools 文本邏輯隔離。System.gc() (謹慎)。getWidth()/getHeight());按鍵映射適配 (不同手機鍵碼差異);性能分級 (高端機啟用粒子特效、低端機簡化渲染)。