Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx如何让SFX淡出?_Java_Audio_Time_Libgdx_Volume - Fatal编程技术网

Java Libgdx如何让SFX淡出?

Java Libgdx如何让SFX淡出?,java,audio,time,libgdx,volume,Java,Audio,Time,Libgdx,Volume,我有一个行进声文件,在特定事件发生时播放,但问题是在音量达到0时停止播放之前,该文件会在指定的时间内淡出。这个项目是桌面的 Sound marching = Gdx.audio.newSound(Gdx.files.internal("sounds/test.wav")); 我的第一次尝试是通过计时器安排任务: final long mId = marching.play(1f, 1f, 0); for (float i = 1; i > 0; i -= 0.01) { Time

我有一个行进声文件,在特定事件发生时播放,但问题是在音量达到0时停止播放之前,该文件会在指定的时间内淡出。这个项目是桌面的

Sound marching = Gdx.audio.newSound(Gdx.files.internal("sounds/test.wav"));
我的第一次尝试是通过计时器安排任务:

final long mId = marching.play(1f, 1f, 0);
for (float i = 1; i > 0; i -= 0.01) {
    Timer.schedule(new Task() {
            @Override
            public void run() {
                marching.setVolume(mId, i);
            }
    }, 0.3f);
}
marching.stop();
然而,这似乎是在召唤行军#行军前停止#设定音量

我决定采取另一种方式:

float volume = 1;
final long mId = marching.play(volume, 1f, 0), startTime = TimeUtils                        .millis();
while (volume > 0) {
    if (TimeUtils.millis() - startTime % 300 == 0) marching.setVolume(mId, volume -= 0.1);
}
marching.stop();
我以为这会根据分配的时间量减少音量,但这只会使程序冻结

有没有一种直接的方法来淡出SFX音频,或者设置频繁睡眠,这样我就可以反复降低音量


谢谢。

我认为最简单的方法是将其放入
渲染方法中:

float FACTOR = 10; // The bigger the factor, the faster the fade-out will be
float mVolume = 1;
boolean mIsPlaying = true;

public void render(float delta) {
    // ...
    if (mIsPlaying) {
        mVolume -= delta * FACTOR;
        if (mVolume > 0) {
            marching.setVolume(mId, mVolume);
        }
        else {
            marching.stop(mId);
            mIsPlaying = false;
        }
    }
    // ...
}

第一个解决方案是错误的,我为您重写了它:

final long mId = marching.play(1f, 1f, 0);

    Timer.schedule(new Task() {
            @Override
            public void run() {
                for (float i = 1; i > 0; i -= 0.01) 
               {
                      marching.setVolume(mId, i);
                      if(i<=0)
                         marching.stop();
               }
            }
    }, 0.3f);
final long mId=marching.play(一层,一层,0);
Timer.schedule(新任务(){
@凌驾
公开募捐{
对于(浮动i=1;i>0;i-=0.01)
{
行军。设置音量(中,i);

如果(i我发现这比使用循环更有效

我将
MUSIC\u FADE\u STEP
设置为0.01f(即每次通过调整音量1%)

我根据需要调整衰减率(以秒为单位)。0.01f可以作为一个起点

Timer.schedule(new Timer.Task() {
    @Override
    public void run() {
        if (music.getVolume() >= MUSIC_FADE_STEP)
            music.setVolume(music.getVolume()-MUSIC_FADE_STEP);
        else {
            music.stop();
            this.cancel();
        }
    }
}, 0f, fadeRate); 

我尝试实现您的解决方案,但它似乎在调用run()内部内容之前等待整个延迟。这导致它在突然结束之前播放声音0.3秒。“它在调用run()内部内容之前等待整个延迟。”这是正确的。尝试将步长因子更改为0.001。如果延迟为0.001,这是否会破坏run()方法的全部用途?无效计划(TimerTask任务,日期时间)将指定的任务安排在指定的时间执行。警告!!!对于以后阅读此内容的人:虽然这看起来很优雅,但在LibGDX中存在一个问题,将音量设置为负值可能会导致LibGDX无法分配音频缓冲区,不允许您将更多音乐加载到该变量中。它可能会出现
 com.badlogic.gdx.utils.GdxRuntimeException:无法分配音频缓冲区
。我只花了3个小时试图弄清楚为什么我的程序会因为这个错误而不断崩溃,这是因为音量变为负值。