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

Java Swing 遊戲開發實戰 (3):JLabel 字體美化與 Graphics 繪圖入門

     編輯:Java 程式設計入門

前言

承接上集,我們已完成遊戲介面骨架。本集將加入計時、計分顯示美化,並介紹 Graphics 繪圖基礎,讓遊戲畫面更豐富。

一、JLabel 與 Font:打造漂亮的分數/時間顯示

使用者互動區適合放置分數、時間等資訊。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)
  • 或改用圖片數字

二、善用 Graphics 繪製圖形

現成元件無法滿足所有需求(如自訂遊戲角色、背景、特效),需自行繪圖。

核心概念

  • Graphics:繪圖上下文,提供畫線、形狀、圖片、文字等方法
  • paintComponent(Graphics g):Swing 元件繪圖進入點,覆寫此方法實作自訂繪圖
  • 雙重緩衝: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);
    }
}

常用 Graphics 方法

方法說明
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()
  • 下集將實作完整遊戲邏輯與碰撞偵測
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved