2017-10-29 162 views
0

所以我有这个类在我的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(); 
} 
+0

它是如何访问非静态成员变量的静态方法?此外,你错过了一个分号。请张贴至少编译并演示问题的代码。 – Dave

+0

对不起,我不得不手工输入。 – Marco

回答

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(); 
    } 
} 

,以防止你的处理器过度陷入困境。

+0

是的,我更新了我的代码。我认为clip.stop()方法可行。它只是我的isCollided变量没有得到更新。我把System.out.println(isCollided),它只打印一次。所以我假设当我碰撞时,isCollided变量不会被更新。因此它总是假的。 – Marco

+0

@Marco Java是通过价值。看看这个。 https://stackoverflow.com/questions/20647969/change-boolean – StarCoder

+0

中断一个线程通常不是一个好主意。最好是建立一个机制来让线程完成执行。 – Dave