為遊戲加入生存計時、定時獎勵與結算評價,豐富玩法回饋循環。
記錄遊戲開始時間戳,主循環每幀計算經過秒數:
// 初始化
long gameTimeOffset = System.currentTimeMillis();
int gameTime = 0;
// 主循環每幀更新
if (!gameOver) {
gameTime = (int)((System.currentTimeMillis() - gameTimeOffset) / 1000);
}
復用 Font 工具類 (見第 2 篇) 繪製數字:
// 初始化數字字體圖集 (0-9)
Image img = ImageTools.getImage("/pic/b_number.png");
Font fontBig = new Font(g, img, 10, 15, new char[]{'0','1','2','3','4','5','6','7','8','9'});
// 繪製居中顯示
fontBig.drawString(String.valueOf(gameTime), screenWidth/2 - 15, 10);
int[] bombAward = {1, 1, 1, 1, 1}; // 每個 20s 區間獎勵 1 個
int bombAwardTop = bombAward.length - 1;
int awardIndex = gameTime / 20; // 當前區間索引
if (awardIndex > bombAwardTop) awardIndex = bombAwardTop;
if (bombAward[awardIndex] != 0) { // 該區間未領取
bombNum += bombAward[awardIndex];
bombAward[awardIndex] = 0; // 標記已領取
}
設計要點:區間索引 + 狀態標記 避免重複發放,簡單高效。
工具類 StringTools:
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 gamer.";
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?";
}
}
繪製:g.drawString(StringTools.timeOpinion(gameTime), 5, 22, Graphics.LEFT|Graphics.TOP);
if (gameOver) {
explosion.paint(g); explosion.update(); // 播放爆炸動畫
if (!explosion.alive) {
plane.alive = false;
g.setColor(0xFFFFFF);
g.drawString(StringTools.timeOpinion(gameTime), 5, 22, Graphics.TOP|Graphics.LEFT);
g.drawString("Fly 0.1 ver by Favo Yang", 2, 100, Graphics.TOP|Graphics.LEFT);
// ... 聯繫信息
}
}
下一篇將實現爆炸特效與導彈道具,引入效果層與邏輯層通信。