如何确保仅一个指定声音的实例在循环,如何停止循环?

时间:2019-05-17 00:41:26

标签: java libgdx

我当前正在开发游戏,并且在玩家更新方法中,我希望足迹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()上的文档所说的:

  

停止播放此声音的所有实例。

1 个答案:

答案 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的版本不起作用,还是等待当前循环完成?