Java .wav 声音无法正常工作

Java .wav sounds don't work properly

我在 java 制作的游戏中遇到声音问题。我有一个名为 SoundSystem 的 class,它包含名为 Sound 的对象,这是我正在读取声音文件的地方。这是供您接收的 class 声音。

package soundSystem;

import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;


public class Sound {

private Clip clip;
private boolean isPlaying;
private boolean loop;

public Sound(boolean loop, String file){
    this.loop = loop;
    try {
        clip = AudioSystem.getClip();
        URL url = getClass().getResource(file);
        AudioInputStream input = AudioSystem.getAudioInputStream(url);
        clip.open(input);

    }  catch (Exception e) {
        e.printStackTrace();
    }
}

public boolean getIsPlaying(){
    return isPlaying;
}

public void play(){
    if(clip == null ) return;
    clip.stop();
    clip.flush();
    clip.setFramePosition(1800);
    clip.start();
}

public void close(){
    clip.stop();
    clip.close();
}

public void update(){
    isPlaying = clip.isRunning();
    if(!isPlaying){
        if(loop)
            play();
        else 
            clip.stop();
    } 
}
}

如您所见,我将文件读取为 URL,因为我将项目导出为可运行的 Jar 文件,这是我发现的最佳方式,但与我遇到的问题。

问题来了。如果我读到一个独特的声音或音乐,例如一个关卡开始时的声音或播放整个关卡的音乐,它完全可以正常工作。在那种情况下,我还没有发现问题。当播放重复的声音时,事情就开始出错了。说一个你可以射击的声音,你可以每秒点击键盘,移动声音,爆炸声等等......这些声音很多时候有效,但有时却没有。射击声音变得更加明显,有时您甚至在连续射击几秒钟后都听不到。有时即使是 level/game 结束时的独特声音,也将不起作用。但是那个我不知道原因或它与关卡开始时的区别。

我试过在声音开始前通过大胆的剪辑或添加额外的 space 来改变声音文件。我尝试通过在确定的时间设置它来搞乱帧速率。即使改变他们的阅读方式,但无论我做什么,它始终存在并保持一致。

因此,如果您可能知道发生了什么或有任何建议,请随时回答。非常感谢任何帮助。

好的,所以我通过创建相同声音的多个实例解决了这个问题。可能听起来很奇怪,所以我只 post 代码。

package soundSystem;

import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Sound {

private Clip[] clip;
private boolean isPlaying;
private boolean loop;
private int maxC;
private int c;

public Sound(boolean loop, String file, int nrReplications){
    this.loop = loop;
    maxC = nrReplications;
    c = 0;
    clip = new Clip[maxC];
    try {
        int i = 0;
        while(i < maxC){
            clip[i] = AudioSystem.getClip();
            URL url = getClass().getResource(file);
            AudioInputStream input = AudioSystem.getAudioInputStream(url);
            clip[i].open(input);
            ++i;
        }
    }  catch (Exception e) {
        e.printStackTrace();
    }
}

public boolean getIsPlaying(){
    return isPlaying;
}

public void play(){
    if(clip == null ) return;
    if(c == maxC)
        c = 0;
    clip[c].stop();
    //clip.flush();
    clip[c].setMicrosecondPosition(0);
    //clip.setFramePosition(0);
    clip[c].start();
    ++c;
}

public void close(){
    clip[c].stop();
    clip[c].close();
}

public void update(){
    isPlaying = clip[0].isRunning();
    if(!isPlaying){
        if(loop)
            play();
        else 
            clip[0].stop();
    } 
}
}

如您所见,我创建了一个 Clips 数组并在它们上面使用了一个计数器。独特的声音就像我之前说过的那样在 nrReplications 上被赋予了 1。但其他声音,如选择选项、爆炸、移动,给予 2+,玩家射击给予 5。在 5 时,我看不到质量有更多的提高,所以我就这样离开了。

同样值得注意的是,即使我删除了 flush();并在 play() 方法中将 framePosition 更改为 microSecondPosition,这对正常工作的声音没有影响,我只是留下他们的评论...

无论如何,如果您现在遇到同样的问题,您知道可以解决它的方法。对我来说就像一个魅力。终于听到所有这些每秒的镜头都完美地工作了,天哪,感觉很好。