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

Java 遊戲程式設計入門:從 Applet 到完整小遊戲實戰

     編輯:Java 相關知識

前言:為什麼選擇 Java 做遊戲?

雖然主流大型遊戲多由 C/C++ 開發,但 Java 擁有跨平台、記憶體安全、豐富多媒體 API 等優勢,非常適合網頁嵌入式小遊戲、教學原型與獨立遊戲開發。本教學以 Applet 為載體(現代可轉向 JavaFX/LibGDX),循序漸進構建「保衛者」彈珠遊戲,涵蓋執行緒動畫、雙緩衝、多媒體、事件處理等核心技術。

基礎架構:Applet 生命週期與執行緒模型

Applet 核心方法

方法觸發時機用途
init()載入時一次初始化組件、載入資源
start()頁面顯示/恢復啟動動畫執行緒
stop()頁面隱藏暫停耗資源工作
destroy()卸載時釋放資源、移除監聽器
paint(Graphics)需重繪時繪製遊戲畫面

動畫執行緒範本

public class Ball extends Applet implements Runnable {
    Thread animator;
    int x = 100, y = 20, r = 10, ySpeed = 1;

    public void start() {
        animator = new Thread(this);
        animator.start();
    }
    public void run() {
        while (true) {
            y += ySpeed;           // 更新邏輯
            repaint();             // 觸發重繪
            try { Thread.sleep(20); } catch (InterruptedException e) {}
        }
    }
    public void paint(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillOval(x, y, 2*r, 2*r);
    }
}

關鍵點:repaint() → AWT 執行緒呼叫 update() → 清屏 + 呼叫 paint()。若無 sleep(),CPU 會跑滿且畫面來不及顯示。

進階繪圖:雙緩衝消除閃爍

預設 update() 先清屏再畫,造成閃爍。解決方案:離屏繪圖至 Image,再一次性貼上螢幕。

private Image offscreenImage;
private Graphics offscreenGraphics;

public void update(Graphics g) {
    // 初始化離屏緩衝區
    if (offscreenImage == null) {
        offscreenImage = createImage(getWidth(), getHeight());
        offscreenGraphics = offscreenImage.getGraphics();
    }
    // 後台清屏與繪圖
    offscreenGraphics.setColor(getBackground());
    offscreenGraphics.fillRect(0, 0, getWidth(), getHeight());
    offscreenGraphics.setColor(getForeground());
    paint(offscreenGraphics);           // 重用 paint 邏輯
    // 前台一次性貼圖
    g.drawImage(offscreenImage, 0, 0, this);
}

互動控制:滑鼠與鍵盤事件

滑鼠監聽 (JDK 1.1+ 事件模型)

public class GameApplet extends Applet implements MouseListener {
    public void init() { addMouseListener(this); }
    public void destroy() { removeMouseListener(this); }
    
    public void mousePressed(MouseEvent e) {
        // 例:點擊反彈小球
        ySpeed = -Math.abs(ySpeed); 
    }
    // 需實作介面所有方法(可留空)
    public void mouseClicked(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
}

鍵盤監聽同理實作 KeyListener

多媒體整合:聲音與圖片

格式適用場景載入方式
WAV/AU/AIFF短音效getAudioClip(url) / Applet.newAudioClip(url)
MIDI背景音樂需 Java Sound API (JDK 1.3+)
GIF/JPG/PNG圖像/幀動畫getImage(url) + drawImage()
// 聲音範例
AudioClip bounceSound = getAudioClip(getCodeBase(), "bounce.wav");
bounceSound.play();  // 或 loop()、stop()

// 圖片動畫幀
Image[] frames = new Image[8];
for (int i = 0; i < 8; i++) 
    frames[i] = getImage(getCodeBase(), "frame" + i + ".gif");

實戰專案:「保衛者」遊戲完整架構

類別職責劃分

  • Defender (主類):遊戲主迴圈、炸彈管理、滑鼠事件分派、雙緩衝繪圖
  • Bomb:位置/速度/方向、碰撞檢測 (地面/頂端/滑鼠點擊)、自繪
  • ScoreBoard:分數、生命值、加分/扣命邏輯

核心流程

  1. init() 載入聲音/圖片、啟動滑鼠監聽、建立初始炸彈陣列
  2. start() 啟動動畫執行緒 → run() 週期性呼叫 bomb.down() 更新位置 → repaint()
  3. paint() 遍歷炸彈呼叫 drawBomb(g)、繪製分數/生命值
  4. 滑鼠點擊 → mousePressed() 判斷座標是否命中炸彈 → 命中則 bomb.rebound() + 加分,未命中炸彈落地 → 扣命 + 播放音效
  5. 生命歸零 → Game Over

擴充建議

  • 動態難度:分數達標增加炸彈數量/速度
  • 關卡系統:不同關卡換背景、炸彈行為模式
  • 道具機制:點擊特定炸彈獲得護盾、減速、分數加倍
  • 雙人模式:鍵盤控制第二玩家

附錄:緩衝區原理速覽

  • 單緩衝:直接寫顯存 → 閃爍嚴重
  • 雙緩衝:前台顯示 + 後台繪圖,VSync 時交換 → 主流標準
  • 三緩衝:兩後台輪流繪圖,無需等待 VSync → 高幀率遊戲趨勢

結語

從一顆下落的小球,到具備物理反彈、音效回饋、分數系統的完整遊戲,Java 提供了豐富的標準 API 讓創意落地。雖然 Applet 已退出歷史舞台,但本文涵蓋的遊戲迴圈、雙緩衝、事件驅動、資源管理、狀態機等核心概念,在 JavaFX、LibGDX、LWJGL 等現代框架中依然通用。建議讀者以此為基礎,嘗試重寫為 JavaFX 應用程式,體驗現代圖形管線的威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved