Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何停止Java游戏的声音_Java_Audio - Fatal编程技术网

如何停止Java游戏的声音

如何停止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

所以我有一个类,在我的java游戏中,在netbeans上播放背景音乐。我只是想知道,如果我的角色死了,我该如何停止声音。我尝试创建一个公共布尔iscollected变量,但是每当我的角色与另一个对象发生碰撞时,它都不起作用。我愿意听取建议

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。如何让静态方法访问非静态成员变量?此外,您还缺少一个分号。请张贴代码,至少编译和演示的问题。我很抱歉,我必须手动键入它。