我想让 m 代表 pacman 中暂停和恢复警报声的音乐按钮。然而,在我按下 M 后,我的警笛声只播放一次。我循环播放了声音,但我不知道为什么声音在一次后不再循环。我点击 m,它只循环一次。
我尝试了以下代码
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class PacManAudio {
private Clip openingSound;
private Clip eatingSound;
private Clip ghostSound;
private Clip gameOverSound;
private Clip sirenSound;
private boolean sirenSoundStarted = false;
private boolean isSirenPaused = false;
// Constructor
public PacManAudio() {
try {
// Load the audio files
AudioInputStream openingStream = AudioSystem.getAudioInputStream(new File("sounds/GAMEBEGINNING.wav"));
AudioInputStream eatingStream = AudioSystem.getAudioInputStream(new File("sounds/Chompsound.wav"));
AudioInputStream ghostStream = AudioSystem.getAudioInputStream(new File("sounds/GHOSTEATEN.wav"));
AudioInputStream gameOverStream = AudioSystem.getAudioInputStream(new File("sounds/killed.wav"));
AudioInputStream sirenStream = AudioSystem.getAudioInputStream(new File("sounds/Sirensound.wav"));
// Initialize the Clip objects
openingSound = AudioSystem.getClip();
eatingSound = AudioSystem.getClip();
ghostSound = AudioSystem.getClip();
gameOverSound = AudioSystem.getClip();
sirenSound = AudioSystem.getClip();
// Open the audio files
openingSound.open(openingStream);
eatingSound.open(eatingStream);
ghostSound.open(ghostStream);
gameOverSound.open(gameOverStream);
sirenSound.open(sirenStream);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}
// Method to play opening sound
public void playOpeningSound() {
playClip(openingSound);
}
// Method to play eating sound
public void playEatingSound() {
if (eatingSound != null) {
if (eatingSound.isRunning()) {
eatingSound.stop(); // Stop the clip if it's already playing
}
eatingSound.setFramePosition(0); // Rewind to the beginning
eatingSound.start(); // Start playing the audio
}
}
// Method to play ghost sound
public void playGhostSound() {
playClip(ghostSound);
}
// Play the siren sound in the background
public void playSirenSound() {
if (!isSirenPaused) {
pauseSirenSound(); // Stop the siren sound if it's already playing
sirenSound.setFramePosition(0); // Rewind to the beginning
sirenSound.loop(Clip.LOOP_CONTINUOUSLY); // Play continuously
sirenSoundStarted = true;
isSirenPaused = false;
}
}
// Method to pause the siren sound
public void pauseSirenSound() {
if (sirenSound != null && sirenSound.isRunning()) {
sirenSound.stop();
sirenSoundStarted = false;
isSirenPaused = false;
}
}
// Method to resume the siren sound
public void resumeSirenSound() {
if (!sirenSoundStarted) {
sirenSound.start();
sirenSoundStarted = true;
isSirenPaused = false;
}
}
// Method to check if the siren sound is paused
public boolean isSirenPaused() {
return isSirenPaused;
}
// Method to play game over sound
public void playGameOverSound() {
playClip(gameOverSound);
}
// Method to check if the siren sound is playing
public boolean isSirenSoundPlaying() {
return sirenSound != null && sirenSound.isRunning();
}
// Internal method to play a Clip
private void playClip(Clip clip) {
playClip(clip, false);
}
// Internal method to play a Clip with looping option
private void playClip(Clip clip, boolean loop) {
if (clip != null) {
clip.stop(); // Stop previous playing, if any
clip.setFramePosition(0); // Rewind to the beginning
if (loop) {
clip.loop(Clip.LOOP_CONTINUOUSLY);
} else {
clip.start(); // Play once
}
}
}
}
我还在我的板类中添加了按键绑定
public void toggleSirenSound() {
if (pacManAudio.isSirenSoundPlaying()) {
pacManAudio.pauseSirenSound();
} else {
pacManAudio.resumeSirenSound();
}
}
//This method handles key presses for the movement
public void keyPressed(KeyEvent key) {
if (key.getID() == KeyEvent.KEY_PRESSED) {
//Start the game timer if it's not running and pacMan is not dead
if (gameTimer.isRunning() == false && pacMan.isDead() == false)
gameTimer.start();
if (key.getKeyCode() == KeyEvent.VK_M) {
toggleSirenSound();
}
我真的不知道是什么问题
你的
pauseSirenSound()
方法有isSirenPaused = false;
,它应该是isSirenPaused = true;
,所以它搞乱了的检查
public void resumeSirenSound() {
if (!sirenSoundStarted) {
sirenSound.start();
sirenSoundStarted = true;
isSirenPaused = false;
}
}