就像inputListener应该是show()部分中的place / code,而不是render()部分,因为它会创建大量隐藏的侦听器。我的问题是: -
设置/播放声音/音乐的正确方法是什么?如果我将sound.play()放在渲染部分中,LibGdx将多次播放相同的声音(间隔非常短)。实现这个的最佳方法是什么?
评论已添加:此link, ,尤其是斜体 中提供的答案突出显示此内容不应该是放在render()部分。我的问题是,在每个帧中放置代码而不播放相同声音的位置?
评论已添加:理论上,以下代码中的声音只能播放一次,对吧?但是,如果你仔细聆听,它会以很短的间隔播放多次。这是我的问题。希望这次我能很好地解释我的问题......
private int processStatus = 0;
private void show() {
thisSound = programApp.assetManager.get("sound/thisSound.mp3", Sound.class);
thisButton.addListener(new InputListener() {
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
doLog("thisButton down");
return true;
}
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
doLog("thisButton up");
processStatus = 1;
}
});
}
private void render() {
if (processStatus == 0){
//do something
} else if (processStatus == 1){
thisSound.play();
//do something else
processStatus = 2;
} else if (processStatus == 2){
//do whatever
}
}
提前致谢
答案 0 :(得分:1)
这个问题的答案非常棘手,因为没有最佳实践。 实施情况因情况而异。
这是我喜欢的。
音乐 在屏幕的构造中,播放音乐
如果您需要播放上一屏幕中的其他音乐,请关闭所有音乐
music.setLoopable(真);
声音。
就声音而言,因为声音只在特定事件发生时播放一次。 例如,硬币被采取,加电,碰撞。 因此必须在特定条件下触发声音,以便我只播放一次。
答案 1 :(得分:1)
创建您自己的AudioManager。拥有这些东西的经理总是很高兴。代码分离,结构清晰。
我真的不明白这个问题?如果你拿起一枚硬币就应该发出声音吧?那么当我们碰撞它时,这个硬币应该被移除?那么如果硬币不再存在,那么下一帧就不会播放声音,因为我们无法与已被移除的东西发生碰撞?
示例:
for(Coin coin : coins){
if(player.collidesWith(coin)){
playSound();
coins.remove(coin, true);
}
}
您始终将对象保留在集合中,以便仅渲染/更新集合中的对象。当发生上述碰撞时,对象将不再存在于集合中,从而使声音不可能。