我最近在我的LibGDX游戏中添加了声音。进行了设置,以便将我需要的所有声音加载到AssetManager
中,并在需要通过getSound(String name)
方法播放它们时将它们检索出来。
当您玩游戏时,它可以正常工作,但最终它会停止播放某些游戏,有时甚至停止播放大多数游戏。我会优先考虑最近播放的那些文件,并在需要时停止那些较旧的文件,但是LibGDX似乎并没有给您太多控制权。
发生这种情况时出现的日志错误
E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack
。
通常一次播放很多声音,一次播放大约10-20个小声音,具体取决于情况,所以我很确定这就是问题所在。我已经在这里阅读过有关使用SoundPool
播放声音后释放声音的信息,但是我不确定如何使用LibGDX做到这一点,或者是否有可能,因为我当时没有看到类似的声音我看了。
此外,我对所有声音都使用ogg文件,但它们都不是很大。 谢谢!
答案 0 :(得分:1)
解决了!通过创建我自己的(伪类)Sound
类,并使用AssetManager
将其与assetManager.setLoader()
一起使用的加载器。在自定义Sound
类中,我将每种声音设置为在soundId
中跟踪其Array<Long>
,然后每次播放时,我都会根据{{1 }}变量,停止数组中最早的声音。 0表示一次只能播放一次,直到我认为有必要为止。这可能不是一个完美的解决方案,但似乎效果很好。
欢迎批评。
我创建的“ limit
”类:
Sound
public class MySound {
private Sound sound;
private Array<Long> ids;
private int limit;
public MySound(Sound sound) {
this.sound = sound;
ids = new Array<Long>();
limit = 0;
}
public long play() {
limitSounds();
long id = sound.play();
ids.add(id);
return id;
}
public long play(float volume) {
limitSounds();
long id = sound.play(volume);
ids.add(id);
return id;
}
public long play(float volume, float pitch, float pan) {
limitSounds();
long id = sound.play(volume, pitch, pan);
ids.add(id);
return id;
}
public long loop() {
limitSounds();
long id = sound.loop();
ids.add(id);
return id;
}
public long loop(float volume) {
limitSounds();
long id = sound.loop(volume);
ids.add(id);
return id;
}
public long loop(float volume, float pitch, float pan) {
limitSounds();
long id = sound.loop(volume, pitch, pan);
ids.add(id);
return id;
}
public void stop() {
ids.clear();
sound.stop();
}
public void pause() {
sound.pause();
}
public void resume() {
sound.resume();
}
public void dispose() {
sound.dispose();
}
public void stop(long soundId) {
if (ids.contains(soundId, true)) {
ids.removeValue(soundId, true);
}
sound.stop(soundId);
}
public void pause(long soundId) {
sound.pause(soundId);
}
public void resume(long soundId) {
sound.resume(soundId);
}
public void setLooping(long soundId, boolean looping) {
sound.setLooping(soundId, looping);
}
public void setPitch(long soundId, float pitch) {
sound.setPitch(soundId, pitch);
}
public void setVolume(long soundId, float volume) {
sound.setVolume(soundId, volume);
}
public void setPan(long soundId, float pan, float volume) {
sound.setPan(soundId, pan, volume);
}
private void limitSounds () {
if (ids.size > limit) {
sound.stop(ids.get(0));
ids.removeIndex(0);
}
}
public void setLimit (int limit) {
this.limit = limit;
}
}
类,用于MySoundLoader
:
AssetManager