我正在尝试做我的学校项目(一个简单的Java游戏),我不能让声音效果起作用。我正在使用Clip,现在我的playSound方法看起来像这样:
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 :(得分:0)
以下建议可能对您的情况有所帮助。
每次播放声音时都会从磁盘加载剪辑。剪辑被设计为加载一次,并根据需要调用。要重播剪辑,请将其重置为0毫秒或帧,然后像在此处一样调用播放。这样,它开始很快。你编程它的方式,剪辑甚至不会开始播放,直到它从磁盘完全加载到内存,并且setFramePosition(0)是多余的,因为新创建的剪辑将始终从开始播放(除非你明确设置它到其他一些框架位置)。
因此,我建议在游戏开始时,将剪辑一次加载到将持续存在的对象中,并根据需要引用它们,此时您只需要调用setFramePosition(0)和游戏()方法。
如果声音在奇数时间播放,我会更加难以理解调用声音的逻辑。虽然你的方法不是最佳的,但它确实有效,并且如果声音文件的加载由于某种原因而被延迟,则只会导致奇怪的晚播放时间。但是如果你的声音超过几秒钟,那些加载延迟可能是问题的根源。
另外一个想法是,SourceDataLine将比创建,加载和播放新Clip更快地开始播放。播放SDL需要比剪辑更多的CPU,但如果声音文件偏长,它仍然是一种合理的方式。