因此,我有一个此类在Netbeans的Java游戏中播放背景音乐。我只想知道一些有关角色死亡时如何停止声音的想法。我尝试制作一个公共(public) bool(boolean) 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();
}
最佳答案
你尝试过使用
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();
}
}
以防止它过多地阻塞您的处理器。