2011-04-11 160 views
1

我正在構建一種簡單的遊戲,它是一個紅色方塊,您可以使用箭頭鍵移動,我製作了一個完成對象,它會在您進入時進行檢測。現在,我做了這樣的事情,如果「播放器」與「完成對象」相交,它會播放聲音,但它會播放每個節拍的聲音。我嘗試了Thread.sleep()和wait(),但是這讓我的整個遊戲都處於睡眠狀態,而不僅僅是聲音延遲。我playsound方法:聲音播放之間的延遲?

public void playSound(String filename) throws IOException{ 
    InputStream in = new FileInputStream(filename); 
    AudioStream as = new AudioStream(in); 
    AudioPlayer.player.start(as); 
} 

和我playerfinishing相交:

 //PLAYER1 LEVEL FINISHING 
    if(player.getBounds().intersects(levelfinish.getBounds())){ 
     message = "A winner is you!"; 
     try { 
      playSound("D:/BadGame/Sounds/winner.wav"); 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

消息只是顯示在屏幕中間一個字符串,它所有的作品,但它需要某種形式的延遲,所以聲音不會持續播放,而是每10秒鐘播放一次,或者僅當您與它交叉時播放一次。你們可以告訴我有關如何做到這一點的線索嗎?謝謝!

回答

0

聲音繼續播放的原因是因爲條件仍然是每個嘀嗒聲。聲音完成後,交集仍然有效,因此聲音將再次播放。

防止重複的一種非常簡單的方法是使用變量來跟蹤是否播放了聲音。像這樣的事情,雖然這是未經測試:

將這個部分的地方,並不會改變每一個刻度:

boolean soundPlayed = false; 

使用此部分在功能

//PLAYER1 LEVEL FINISHING 
if(player.getBounds().intersects(levelfinish.getBounds())){ 
     message = "A winner is you!"; 
     if (soundPlayed == false) { 
      try { 
       playSound("D:/BadGame/Sounds/winner.wav"); 
       soundPlayed = true; 
      } catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
    } 
+0

那麼,你的例子並不完美。它仍然會播放這首歌曲,就像我在進入另一首歌曲後相當快。我理解這段代碼,但它似乎並不奏效。 – Stan 2011-04-11 18:15:16

+0

我應該澄清 - 如果此代碼位於每次打勾調用的函數中,您將需要創建全局變量。你需要變量不會每次都改變。 – Nate 2011-04-11 18:37:54

+0

是的,我注意到,感謝您的幫助,它現在完美。 – Stan 2011-04-11 18:39:38

0

我略有困惑通過你的意思打勾。如果你只想讓音樂播放一次,一個簡單的解決方法是在某個地方聲明一個布爾字段來確定是否已經有贏家。然後只有在沒有贏家時才播放聲音。