Java Libgdx如何让SFX淡出?
我有一个行进声文件,在特定事件发生时播放,但问题是在音量达到0时停止播放之前,该文件会在指定的时间内淡出。这个项目是桌面的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
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个小时试图弄清楚为什么我的程序会因为这个错误而不断崩溃,这是因为音量变为负值。