Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为游戏添加声音。需要帮助_Java_Audio - Fatal编程技术网

Java 为游戏添加声音。需要帮助

Java 为游戏添加声音。需要帮助,java,audio,Java,Audio,我有这段代码,我想知道如何将它与游戏的其他部分结合起来,因为它现在播放声音的唯一方式就是选择这个类作为启动器。另外,我可以得到一些信息,到底是什么改变了,为什么。我觉得我应该更好地理解这段代码,因为我刚刚找到了代码,并粘贴了它:D 代码: 这个类是一个非常普通的类:构造一个实例,调用一些方法,然后它完成预期的任务。当您将其用作启动器时,所做的只是调用main方法,该方法作为如何使用此类的示例: public static void main(String[] args) { String

我有这段代码,我想知道如何将它与游戏的其他部分结合起来,因为它现在播放声音的唯一方式就是选择这个类作为启动器。另外,我可以得到一些信息,到底是什么改变了,为什么。我觉得我应该更好地理解这段代码,因为我刚刚找到了代码,并粘贴了它:D 代码:


这个类是一个非常普通的类:构造一个实例,调用一些方法,然后它完成预期的任务。当您将其用作启动器时,所做的只是调用main方法,该方法作为如何使用此类的示例:

public static void main(String[] args) {
    String audioFilePath = "res/music/dark_theme.wav";
    AudioPlayer player = new AudioPlayer();
    player.play(audioFilePath);
}
只需构造一个实例,并使用音频文件的名称对其调用
play()

然而,要注意的是,本课程并不是一个很好的例子,因为以下几个原因:

  • 它会在播放时阻塞,这意味着你不能在播放声音的同时做一些不同的事情
  • 它不能在不引起问题的情况下多次播放声音
所以,让我们修改这个类以避免这些问题。该类允许您将剪辑加载到内存中,并异步启动它(意味着您启动它,然后程序继续运行)。start()方法开始播放一次,loop()方法永远循环播放。stop()是不言自明的,当您不再需要此音频剪辑时,应该调用cleanup()来释放资源。(当然,如果您打算很快再次播放该剪辑,则此时不应使用cleanup()


谢谢,它现在变得更有意义了:D另外,你能解释一下,我如何使它循环吗?@Krycer稍等,我正在完全重组这篇文章,重新编写这个类,以拥有更多的功能,而不是遇到我提到的一些问题。另外,通过阻止,你的意思是,它不能移动我的玩家吗,当我播放它时?@Krycer正确,在它完成之前,你不能做任何事情,除非你使用一种叫做多线程的特殊功能。@Krycer你仍然需要相同的导入。
public static void main(String[] args) {
    String audioFilePath = "res/music/dark_theme.wav";
    AudioPlayer player = new AudioPlayer();
    player.play(audioFilePath);
}
import main.Handler;
import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioPlayer{
    Clip audioClip;
    boolean playCompleted;
    String path;
    public AudioPlayer(String path){
        this.path = path;
        File audioFile = new File(path);

        try {
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);

            AudioFormat format = audioStream.getFormat();

            DataLine.Info info = new DataLine.Info(Clip.class, format);

            audioClip = (Clip) AudioSystem.getLine(info);

            audioClip.open(audioStream);

        } catch (UnsupportedAudioFileException ex) {
            System.out.println("The specified audio file is not supported.");
            ex.printStackTrace();
        } catch (LineUnavailableException ex) {
            System.out.println("Audio line for playing back is unavailable.");
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Error playing the audio file.");
            ex.printStackTrace();
        }
    }
    void play() {
        audioClip.start();

    }
    void loop(){
        audioClip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    void stop(){
        audioClip.stop();
    }
    void cleanup(){
        audioClip.close();
    }

    public static void main(String[] args) throws InterruptedException {
        String audioFilePath = "res/music/dark_theme.wav";
        AudioPlayer player = new AudioPlayer(audioFilePath);
        player.play();
        // give the sound time to play
        while(true){
            Thread.sleep(1000);
        }
    }


}