如何停止Java游戏的声音
所以我有一个类,在我的java游戏中,在netbeans上播放背景音乐。我只是想知道,如果我的角色死了,我该如何停止声音。我尝试创建一个公共布尔iscollected变量,但是每当我的角色与另一个对象发生碰撞时,它都不起作用。我愿意听取建议如何停止Java游戏的声音,java,audio,Java,Audio,所以我有一个类,在我的java游戏中,在netbeans上播放背景音乐。我只是想知道,如果我的角色死了,我该如何停止声音。我尝试创建一个公共布尔iscollected变量,但是每当我的角色与另一个对象发生碰撞时,它都不起作用。我愿意听取建议 import controller.Main; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; public static boolean isCollide
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();
我看到你做了一些编辑。因为您是在线程中运行剪辑,所以您需要有一些与主方法中的线程交互的方法。否则,它只是在线程启动时检查isCollided,而从不检查更改
一种方法是使isCollided成为一个全局变量,然后在clip线程中有一个无限循环来检查isCollided,并在它变为真时停止。一些变量,比如
while (true) {
if (isCollided) {
clip.stop();
thread.interupt();
}
}
ETA:这是非常处理器密集型的。你也许可以加一点延迟,比如
while (true) {
Thread.sleep(500);
if (isCollided) {
clip.stop();
thread.interupt();
}
}
为了避免让你的处理器陷入太多的困境。是的,我更新了我的代码。我认为clip.stop方法确实有效。只是我的iscolled变量没有得到更新。我把System.out.Printl放在一起,它只打印了一次。所以我假设当我碰撞时,iscollected变量不会得到更新。因此它总是错误的。@Marco Java是按值传递的。看看这个。中断线程通常不是一个好主意。当我使用thread.interupt时,最好内置一种机制,允许线程干净地完成执行。我收到一条错误消息。我刚把它取下来,它就起作用了。那么,线程中断意味着什么呢?更好的性能?如果你想使用Thread.sleep500;别忘了抛出或尝试捕获InterruptedException。如何让静态方法访问非静态成员变量?此外,您还缺少一个分号。请张贴代码,至少编译和演示的问题。我很抱歉,我必须手动键入它。