我使用Libgdx和AssetManager将资源加载到内存中。首先,我认为我的项目出了问题,所以我做了一个新的,但问题仍然存在。
即使我使用" IsLoaded"声音也没有播放方法,并没有第一次播放(如果你真的快速跳进游戏)。声音很小,比如40KB,这只发生在Android上(适用于桌面/ iOS)。我在Android上测试的设备是带有Lolipop的HTC One M7。这是一个干净项目的代码。
package com.mygdx.game;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Audio;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.audio.Sound;
public class MyGdxGame extends ScreenAdapter {
private AssetManager assetManager;
@Override
public void show() {
super.show();
assetManager = new AssetManager();
assetManager.load("sound/jump.mp3", Sound.class);
}
Sound jump;
boolean isLoaded;
@Override
public void render(float delta) {
super.render(delta);
if(isLoaded) return;
assetManager.update();
if(assetManager.isLoaded("sound/jump.mp3", Sound.class)) {
assetManager.finishLoading();
jump = assetManager.get("sound/jump.mp3", Sound.class);
isLoaded = true;
System.err.println("LOADED");
jump.play();
}
}
}
在LOGCAT中我得到" soundpool样本1没有准备好"错误。 有什么想法吗?
注意:如果我给它一点时间,声音正常播放(如果我不按"播放"立即播放)。
问题是为什么Libgdx认为声音被加载到内存中,即使它没有。
答案 0 :(得分:0)
您是否尝试过使用.ogg? 在我的libgdx项目中,我总是使用.ogg,因为它的许可证免费且很好,它从未给我带来过问题!
您还应该注意不同的Sound导入。我记得你有时可以直接从libgdx导入.ogg .mp3类,这会导致问题。
另外,我认为问题在于,即使加载了音频文件,资产管理员仍在加载其他资源..所以它忙着做另一项任务。
我要么:
a)在没有资产管理者的情况下播放该声音,因为它只是用于加载,对吗?
b)(这需要检查)但是也许使用不同的资产管理器来播放音频?不确定拥有2名资产管理人员会浪费多少资源。
但是,我会尝试。首先更改为.ogg,确保音频正好从0:00开始并更新到最后一个libgdx版本。
答案 1 :(得分:0)
我遇到了同样的问题。我使用的是libgdx版本1.9.2。到目前为止,我试过了:
并没有帮助。
我用Music对象替换了声音对象,它确实提供了帮助。但我不确定这是否是正确的方法,因为我的应用程序中有很多短音。
答案 2 :(得分:0)
我知道这是一个旧线程,但我遇到了同样的问题,我就这样解决了..
private Sound sound;
private float soundVolume;
public void playSound(String path, float volume) {
sound = assetManager.get(path, Sound.class);
soundVolume = volume;
}
@Override
public void render () {
super.render();
// Because of some weird Android bug
if (sound != null) {
sound.play(soundVolume);
sound = null;
}
}
这是我的主要游戏类,我可以从任何其他类调用playSound()
方法。
答案 3 :(得分:0)
它可能是由Gdx.audio.newSound()方法引起的,它是通过异步加载声音而不是向处理器断言声音加载过程。我通过添加"延迟来解决这个问题。播放声音过程仅适用于第一次播放。这解决了我的问题。
private static void soundBugFixer(Sound sfx, float volume)
{
Timer x = new Timer();
x.scheduleTask(new Timer.Task() {
@Override
public void run() {
sfx.play(volume);
}
}, 0.1f );
}
public static void remove(float volume) {
if(sfxRemove == null)
{
sfxRemove = Gdx.audio.newSound(Gdx.files.internal("sfx/sfx_remove.wav"));
soundBugFixer(sfxRemove, volume);
}
else
{
sfxRemove.play(volume);
}
}