我正在尝试做我的学校项目(一个简单的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帧,然后像此处一样调用play。这样,它很快就会启动。按照您编程的方式,剪辑直到从磁盘完全加载到内存中之前都不会开始播放,并且setFramePosition(0)是多余的,因为新创建的剪辑将始终从头开始播放(除非您已明确设置移至其他帧位置)。

因此,我建议在游戏开始时,将片段一次加载到将要保留的对象中,并根据需要引用它们,这时您仅需要调用setFramePosition(0)和play()方法。

如果声音是在奇怪的时间播放,我会更仔细地研究调用声音的逻辑。虽然您的方法不是最佳方法,但它确实有效,并且如果声音文件的加载由于某种原因而延迟,则只会导致奇怪的延迟播放时间。但是,如果您的声音长于几秒钟,那么加载延迟可能是问题的根源。

另一个想法是,SourceDataLine将比创建,加载和播放新Clip更快地开始播放。播放SDL比剪辑要花费更多的CPU,但是如果声音文件太长,这仍然是一种合理的方法。

09-26 22:43