如何停止Java游戏的声音

时间:2017-10-29 04:02:40

标签: java audio

所以我有这个课程,我在netbeans的java游戏中播放背景音乐。如果我的角色死了,我只想知道如何阻止声音。我尝试制作一个公共布尔值isCollided变量,但是每当我的角色与另一个对象发生碰撞但它没有工作时。我愿意接受建议。

import controller.Main;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public static boolean isCollided = false;

public static void play(String filename) {
    new Thread(new Runnable() {

        public void run() {
            try {
                Clip clip = AudioSystem.getClip();
                clip.open(AudioSystem.getAudioInputStream(Main.class.getResourceAsStream(filename)));// new
                                                                                                        // File(filename)));
                if (isCollided) {
                    clip.stop();
                } else {
                    clip.loop(0);
                }
            } catch (Exception exc) {
                exc.printStackTrace(System.out);
            }
        }
    }).start();
}

1 个答案:

答案 0 :(得分:1)

你尝试过使用

吗?
clip.stop();

https://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/DataLine.html#stop()

我看到你做了一些编辑。由于您在线程中运行剪辑,因此您需要通过某种方式与主方法中的线程进行交互。否则它只是在线程启动时检查isCollided并且从不检查更改。

一种方法是使isCollided成为一个全局变量,然后在剪辑线程中有一个无限循环来检查isCollided并在它变为true时停止。某物(带有你的变量),如

while (true) {
  if (isCollided) {
  clip.stop();
  thread.interupt();
  }
}

ETA:这是处理器密集型的。你可能会添加一些延迟,如

while (true) {
  Thread.sleep(500);
  if (isCollided) {
  clip.stop();
  thread.interupt();
  }
}

防止它过多地耗尽你的处理器。