在互联网上做了几天的研究之后,我来到这里寻求帮助。我目前正在为朋友们开发一个2D游戏(其实只是为了好玩),几天前我学到了一些片段。在这个游戏中,玩家可以收集物体(就像马里奥中的硬币一样)。我的问题是,当收集硬币时,我有一个很短的声音(~ 1秒,50 in ),如果玩家在1秒内收集3枚硬币,那么剪辑会使游戏滞后。如果先例剪辑已经结束,那么就不会有任何滞后。但是,如果之前的剪辑还没有结束,那么尝试再次播放剪辑会使游戏滞后(非常严重)。
我有一台很小的电脑,不太强大,但是这个问题真的很烦人。当玩家投掷武器时,我也会遇到同样的问题。我有一个很短的剪辑,如果玩家把这个武器扔得太快,游戏就会滞后.
以下是我已经尝试过的事情:
但这些都改变不了这个问题..。
这是我代码的一部分。首先是我用来将声音加载到剪辑中的类。
package sound;
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
// My own package
import utils.Utils;
public class SoundLoader {
public static Clip loadSound(String path) {
Utils.log("Loading " + path + " ... ");
try {
URL url = SoundLoader.class.getResource(path);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
AudioFormat format = audioIn.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(audioIn);
Utils.log("success\n");
return clip;
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
Utils.log("failed !\n");
return null;
}
}
}现在是我将处理所有声音的课程:
package sound;
import javax.sound.sampled.Clip;
// My own package
import principal.Handler;
public class SoundManager {
private Clip woosh;
private Clip coin1;
private Clip coin2;
public SoundManager(Handler handler) {
woosh = SoundLoader.loadSound("/resources/sounds/woosh2.wav");
coin1 = SoundLoader.loadSound("/resources/sounds/coin1.wav");
coin2 = SoundLoader.loadSound("/resources/sounds/coin2.wav");
}
public void wooshClip() {
startClip(woosh);
}
public void coin1Clip() {
startClip(coin1);
}
public void coin2Clip() {
startClip(coin2);
}
public synchronized void startClip(Clip clip) {
clip.stop();
clip.setFramePosition(0);
clip.start();
}
public void loopClip(Clip clip) {
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
public void stopClip(Clip clip) {
clip.stop();
}
}最后,当我想播放一个剪辑时,我使用我的"Player“类中的公共方法startClip() (显然代表该播放器)。
handler.getSoundManager().wooshClip();
正如我看到的代码一样,如果剪辑已经在播放,那么方法starClip()应该停止并重放它。为什么它会落后这么多?为什么即使我使用不同的剪辑,它也是滞后的?什么使我的游戏滞后,如果我只是停止一个剪辑,并重播它?
我希望你能帮我..。我很少能在网上找到答案。如果你还需要什么来回答我就告诉我!
谢谢你花时间在这个长长的问题上!
编辑:我尝试了我的游戏在一个强大的电脑和绝对没有滞后,因为音频剪辑.但我的问题依然存在!一个50 so的剪辑怎么会有这么大的滞后?我真的不明白这个问题..。
溶液
我刚在做这个项目的时候发现了一个解决方案:现在我的实体在被玩家收集时应该播放一个声音(比如马里奥中的硬币声音)包含了他们“死亡”的音频剪辑。我不明白为什么它现在起作用了但它确实..。
发布于 2020-06-27 18:59:13
使用来自JavaFX的JavaFX而不是javax.sound.sampled.Clip。AudioClip具有较低的潜伏期。
https://stackoverflow.com/questions/49535824
复制相似问题