2013-01-11 35 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,但如果声音文件很长,这仍然是一个合理的途径。