如何停止Java游戏的声音
问题描述:
所以我有这个类在我的java游戏中播放netbeans背景音乐。我只想得到一些关于如果我的角色死亡时能够阻止声音的想法。我试着制作一个公共布尔isCollided变量,但是每当我的角色与另一个对象发生碰撞时,它都不起作用。我乐于接受建议。如何停止Java游戏的声音
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();
}
}
,以防止你的处理器过度陷入困境。
它是如何访问非静态成员变量的静态方法?此外,你错过了一个分号。请张贴至少编译并演示问题的代码。 – Dave
对不起,我不得不手工输入。 – Marco