所以我有这个课程,我在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();
}
答案 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();
}
}
防止它过多地耗尽你的处理器。