2017-10-29 157 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