我当前正在开发游戏,并且在玩家更新方法中,我希望足迹Sound
在玩家走路时开始循环播放,而我希望它在玩家停止走路时停止循环播放。但是,我在弄清楚如何确保仅Sound
的1个实例正在循环的过程中遇到麻烦。
为澄清起见:我在谈论gdx.audio.Sound
类。这是我的代码当前的样子:
//Sets the footstep sound. i.e. it changes to a grass soundfile when you walk on grass.
String footstepsFilePath = gameMap.getTileSoundFilePath(rect);
setFootsteps(Gdx.audio.newSound(Gdx.files.internal(footstepsFilePath)));
//velocity is the speed at which the player is going in the x or y direction.
if(velocity.y != 0 || velocity.x != 0) footsteps.loop();
if(velocity.y == 0 && velocity.x == 0) footsteps.stop();
结果:一旦播放器开始移动,就会产生大量的脚步声。当播放器停止移动时,它们都继续循环播放。第一部分是出于显而易见的原因,但是我无法弄清楚如何确保只有一个实例在循环。但是对于第二部分,我不确定为什么不是所有脚步声实例都停止循环,因为这是stop()
上的文档所说的:
停止播放此声音的所有实例。
答案 0 :(得分:1)
假设您经常检查if(velocity.y != 0 || velocity.x != 0)
,则确实会引发许多循环。诀窍是检查“玩家是否在移动,他们是否还是我上一次看的?”而不只是“玩家在移动”。
一种简单的方法是设置一个布尔标志:
//Sets the footstep sound. i.e. it changes to a grass soundfile when you walk on grass.
String footstepsFilePath = gameMap.getTileSoundFilePath(rect);
setFootsteps(Gdx.audio.newSound(Gdx.files.internal(footstepsFilePath)));
boolean isMoving = false;
//velocity is the speed at which the player is going in the x or y direction.
if((velocity.y != 0 || velocity.x != 0) && !isMoving) {
isMoving = true;
footsteps.loop();
}
if((velocity.y == 0 && velocity.x == 0) && isMoving) {
footsteps.stop();
isMoving = false;
}
我不能完全确定为什么stop
在您的情况下不起作用。但是,其他两个loop
重载状态的文档
您需要使用返回的ID通过调用stop(long)来停止声音。
您使用的stop
的版本不起作用,还是等待当前循环完成?