承接上集,我們已完成遊戲介面骨架。本集將加入計時、計分顯示美化,並介紹 Graphics 繪圖基礎,讓遊戲畫面更豐富。
使用者互動區適合放置分數、時間等資訊。JLabel 配合 Font 輕鬆實現:
JLabel score = new JLabel("307");
actionPanel.add(score);
JLabel score = new JLabel("307");
Font font = new Font("微軟正黑體", Font.BOLD, 48); // 字體、樣式、大小
score.setForeground(Color.YELLOW); // 前景色
score.setFont(font); // 套用字體
actionPanel.add(score);
Font 建構子三參數: 字體名稱、樣式 (PLAIN/BOLD/ITALIC)、大小 (pt)。
score.setText(String.valueOf(newScore)); // 遊戲過程中即時更新
字體越大,鋸齒越明顯,Swing 文字渲染通病。暫時無完美解法,建議:
RenderingHints.KEY_TEXT_ANTIALIASING)現成元件無法滿足所有需求(如自訂遊戲角色、背景、特效),需自行繪圖。
JPanel 預設開啟,減少閃爍public class GamePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 必須先呼叫父類別,清除舊畫面
// 繪製背景
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
// 繪製矩形 (角色)
g.setColor(Color.GREEN);
g.fillRect(playerX, playerY, 50, 50);
// 繪製圓形 (道具)
g.setColor(Color.RED);
g.fillOval(itemX, itemY, 20, 20);
// 繪製圖片
g.drawImage(bgImage, 0, 0, this);
// 繪製文字
g.setFont(new Font("微軟正黑體", Font.BOLD, 24));
g.setColor(Color.WHITE);
g.drawString("Score: " + score, 20, 40);
}
}
| 方法 | 說明 |
|---|---|
drawLine(x1,y1,x2,y2) | 畫線 |
drawRect/fillRect(x,y,w,h) | 畫矩形/實心矩形 |
drawOval/fillOval(x,y,w,h) | 畫橢圓/實心圓 |
drawImage(img,x,y,observer) | 繪製圖片 |
drawString(str,x,y) | 繪製文字 |
setColor(c) | 設定繪圖顏色 |
setFont(f) | 設定字體 |
動畫本質:定時更新狀態 → 觸發重繪。
public class GameLoop extends Thread {
private GamePanel panel;
public GameLoop(GamePanel panel) { this.panel = panel; }
@Override
public void run() {
while (running) {
updateGameState(); // 更新座標、分數等
panel.repaint(); // 觸發 paintComponent
try { Thread.sleep(16); } // ~60 FPS
catch (InterruptedException e) { break; }
}
}
}
JLabel + Font 快速實現分數/時間顯示美化paintComponent 使用 Graphics 繪製自訂圖形repaint()