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

Java Applet 多媒體協同:圖像與聲音同步播放實作指南

     編輯:Java 程式設計入門

在 Applet 中協調圖像顯示與聲音播放,能大幅豐富互動體驗。本文透過一個完整範例,示範如何在執行緒動畫循環中,根據隨機邏輯切換圖形 (矩形/橢圓) 與顏色,並同步播放音效。

核心架構:Runnable 動畫執行緒 + AudioClip

  • init():載入聲音檔 `getAudioClip(getCodeBase(), "Sample.AU")`。
  • start():啟動動畫執行緒。
  • run():循環更新隨機顏色、睡眠 300ms、觸發 `repaint()`。
  • paint(Graphics g)`:根據隨機值繪製圖形,並呼叫 `audioClip.play()` 播放音效。

完整原始碼:Applet1.java

import java.awt.*;
import java.applet.*;
import java.util.Random;

public class Applet1 extends Applet implements Runnable {
    AudioClip audioClip;
    Thread shapeThread = null;
    Random random = new Random();
    Color imageColor;

    public void init() {
        audioClip = getAudioClip(getCodeBase(), "Sample.AU"); // 載入聲音
    }

    public void start() {
        if (shapeThread == null) {
            shapeThread = new Thread(this);
            shapeThread.start();
        }
    }

    public void run() {
        while (true) {
            // 隨機選擇顏色 (0-4)
            switch (random.nextInt(5)) {
                case 0: imageColor = Color.BLACK; break;
                case 1: imageColor = Color.BLUE; break;
                case 2: imageColor = Color.CYAN; break;
                case 3: imageColor = Color.MAGENTA; break;
                case 4: imageColor = Color.ORANGE; break;
                default: imageColor = Color.RED;
            }
            try {
                shapeThread.sleep(300); // 控制動畫速度
            } catch (InterruptedException e) {
                // 忽略中斷
            }
            repaint(); // 觸發 paint()
        }
    }

    public void paint(Graphics g) {
        g.setColor(imageColor);
        audioClip.play(); // 每幀播放一次音效

        // 隨機繪製矩形或橢圓
        switch (random.nextInt(2)) {
            case 0: g.fillRect(25, 25, 200, 200); break;  // 矩形
            default: g.fillOval(25, 25, 200, 200); break; // 橢圓
        }
    }
}

HTML 嵌入

<HTML>
<TITLE>Applet 多媒體協同示範</TITLE>
<APPLET CODE="Applet1.class" WIDTH=300 HEIGHT=300></APPLET>
</HTML>

關鍵技術細節解析

1. AudioClip 生命週期管理

  • 在 `init()` 一次性載入,避免 `paint()` 重複建立物件。
  • `play()` 非阻塞,立即返回,適合動畫幀同步。
  • 若需背景音樂循環,改用 `loop()` 並在 `stop()` 呼叫 `stop()`。

2. Random 類別應用

  • `nextInt(n)` 回傳 `[0, n)` 均勻分佈整數。
  • 範例中用於顏色選擇 (5 種) 與圖形類型 (2 種)。

3. 執行緒安全與動畫流暢度

  • `sleep(300)` 固定幀間隔 ≈ 3.3 FPS,較低;實際遊戲建議 16ms (60 FPS) 或配合 `System.nanoTime()` 計算動態睡眠。
  • `repaint()` 非同步排程,AWT 會合併短時間內多次呼叫,避免事件佇列擁擠。

進階擴充方向

  1. 聲音池: 預載多個 `AudioClip`,依事件類型播放不同音效 (撞擊、得分、背景音樂)。
  2. 圖像圖集: 替換單色圖形為 `Image` 陣列,實現角色動畫 (跑步、跳躍幀序列)。
  3. 雙緩衝: 參照前文雙緩衝模式,消除 `fillRect/fillOval` 閃爍。
  4. 鍵盤/滑鼠控制: 實作 `keyDown/keyUp/mouseDrag`,讓使用者控制圖形移動並觸發音效。

此範例展示了 Applet 時代「多媒體時間軸同步」的雛形思維,現代遊戲引擎 (Unity、LibGDX) 的 `AudioSource` + `SpriteRenderer` 更新迴路即是其直接傳承。

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