我在用java制作的游戏中遇到了声音问题。我有一个名为SoundSystem的类,其中包含名为Sound的对象,这是我正在读取声音文件的地方。这是您的摄影类Sound。
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文件,这是我发现的最佳方式,但这与我遇到的问题无关。
现在问题就在于此。如果我读了一个独特的声音或音乐,例如一个关卡开始时的声音或整个关卡的音乐,它就可以完全正常工作。在那种情况下我还没有找到问题。当播放重复的声音时,事情开始出错。说一个可以拍摄的拍摄声音,你可以每秒点击键盘,运动声音,爆炸声等等......这些声音在很多时候都有效,但有时却没有。拍摄声音变得更加明显,有时你甚至不会在几秒钟的持续射击中听到。有时甚至在关卡/游戏结束时的独特声音也将无效。但那个我不知道它与水平开始的原因或区别。
我尝试使用大胆切割来改变声音文件,或者在声音开始之前为声音添加额外的空间。我已经尝试通过在确定的时间设置它来弄乱帧速率。甚至改变他们阅读的方式,但无论我做什么,它总是持续存在并保持一致。
所以,如果您可能知道发生了什么或有任何建议随时回答。非常感谢任何帮助。
答案 0 :(得分:0)
好的,所以我通过创建相同声音的几个实例来解决这个问题。可能听起来很奇怪,所以我只是发布代码。
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,这对声音正常工作没有任何影响,我只是留下了评论......
无论如何,如果你现在遇到同样的问题,你就会知道什么可以解决它。对我来说就像一个魅力。最后,每秒钟完全听取所有这些镜头,哦,男人,感觉不好。