在 Applet 中協調圖像顯示與聲音播放,能大幅豐富互動體驗。本文透過一個完整範例,示範如何在執行緒動畫循環中,根據隨機邏輯切換圖形 (矩形/橢圓) 與顏色,並同步播放音效。
init():載入聲音檔 `getAudioClip(getCodeBase(), "Sample.AU")`。start():啟動動畫執行緒。run():循環更新隨機顏色、睡眠 300ms、觸發 `repaint()`。paint(Graphics g)`:根據隨機值繪製圖形,並呼叫 `audioClip.play()` 播放音效。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>
<TITLE>Applet 多媒體協同示範</TITLE>
<APPLET CODE="Applet1.class" WIDTH=300 HEIGHT=300></APPLET>
</HTML>
init()` 一次性載入,避免 `paint()` 重複建立物件。play()` 非阻塞,立即返回,適合動畫幀同步。loop()` 並在 `stop()` 呼叫 `stop()`。nextInt(n)` 回傳 `[0, n)` 均勻分佈整數。sleep(300)` 固定幀間隔 ≈ 3.3 FPS,較低;實際遊戲建議 16ms (60 FPS) 或配合 `System.nanoTime()` 計算動態睡眠。repaint()` 非同步排程,AWT 會合併短時間內多次呼叫,避免事件佇列擁擠。AudioClip`,依事件類型播放不同音效 (撞擊、得分、背景音樂)。Image` 陣列,實現角色動畫 (跑步、跳躍幀序列)。fillRect/fillOval` 閃爍。keyDown/keyUp/mouseDrag`,讓使用者控制圖形移動並觸發音效。此範例展示了 Applet 時代「多媒體時間軸同步」的雛形思維,現代遊戲引擎 (Unity、LibGDX) 的 `AudioSource` + `SpriteRenderer` 更新迴路即是其直接傳承。