吃豆人警报器声音暂停和恢复问题

问题描述 投票:0回答:1

我想让 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();
        }

我真的不知道是什么问题

java io pacman
1个回答
0
投票

你的

pauseSirenSound()
方法有
isSirenPaused = false;
,它应该是
isSirenPaused = true;
,所以它搞乱了

的检查
public void resumeSirenSound() {
    if (!sirenSoundStarted) {
        sirenSound.start();
        sirenSoundStarted = true;
        isSirenPaused = false;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.