2013-01-11 36 views
0

我正在嘗試做我的學校項目(一個簡單的Java遊戲),我無法獲得音效效果。我使用的素材做,現在我playSound法看起來是這樣的:Java遊戲音效無法正常工作

public void playSound(File filename) { 
    try { 
     AudioInputStream sound = AudioSystem.getAudioInputStream(filename); 
     Clip clip = AudioSystem.getClip(); 
     clip.open(sound); 

     clip.setFramePosition(0); 
     clip.start(); 
    } 
    catch (UnsupportedAudioFileException ex) { 
     ex.printStackTrace(); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    catch (LineUnavailableException ex) { 
     ex.printStackTrace(); 
    } 
} 

我有不同的聲音效果屬性(文件),我調用該方法時,我要玩一些聲音。

一切工作正常:聲音播放時,例如播放器吃東西,但有時聲音變得越來越模糊。當玩家沒有吃東西時,正在播放進食聲音。

你知道怎麼回事嗎?播放這樣的幾種音效有問題嗎?謝謝! :)

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

你的聲音文件是什麼格式?這可能會有所作爲。 – demongolem

+0

他們是.wav文件。 – user1969736

回答

0

以下建議可能會或可能不會幫助您的情況。

您正在從每次播放聲音的磁盤加載剪輯。剪輯被設計爲一次加載,並根據需要調用。要重放一個片段,可以將其重置回第0毫秒或幀,然後像在這裏一樣調用播放。這樣,它開始得非常快。您編程它的方式,剪輯甚至不會開始播放,直到它從磁盤完全加載到內存中,並且setFramePosition(0)是多餘的,因爲新創建的剪輯將始終從頭開始播放(除非您已明確設置它到一些其他的框架位置)。因此,我建議在遊戲開始時,將剪輯一次加載到將保留的對象中,並根據需要引用它們,此時您只需調用setFramePosition(0)和play()方法。

如果聲音在奇怪的時間播放,我會更加註意調用聲音的邏輯。雖然你的方法不是最佳的,但它確實有效,並且如果聲音文件的加載由於某種原因而延遲,則只會導致奇怪的後期播放時間。但是如果你的聲音超過幾秒鐘,這些加載延遲可能是問題的根源。

另一個想法是,SourceDataLine將比創建,加載和播放新剪輯更快地開始播放。播放SDL比Clip要多一點cpu,但如果聲音文件很長,這仍然是一個合理的途徑。