如何在中途启动 LIBGDX 粒子效果?

How can I start a LIBGDX particle effect mid way through?

是否可以在中途启动粒子效果?我尝试了多种在初始化时更新粒子 effect/emitters 的变体。 None 其中似乎有效。以前有没有人设法做到这一点?非常感谢!

    ParticleEffectPool.PooledEffect effect = particleEffectPool.obtain();
    effect.setPosition(posnX,posnY);

    float value = 1.5f;

    for(ParticleEmitter e: effect.getEmitters()){
        e.update(value);
        value+=1.5f;
    }

上面的代码并没有绘制所有的粒子,但它似乎确实对它们进行了一些更新。一旦初始效果结束,它会重置,然后看起来很好

编辑:在初始化粒子效果时,我通过执行以下代码片段 5 次发现了一些技巧。仍然有兴趣看看是否有人有更好的解决方案

 p.getEmitters().get(0).addParticle();
 p.update(1);

我假设,您 ParticleEffect 中的所有发射器都具有相同的持续时间:

ParticleEffectPool.PooledEffect effect = particleEffectPool.obtain();
effect.reset();
effect.setPosition(posnX,posnY);

//divide by 1000 to convert from ms to seconds
float effectDuration = effect.getEmitters().first().duration / 1000f;
float skipProgress = 0.5f;
effect.update(skipProgress * effectDuration);

请注意,如果发射器具有不同的持续时间,您可能希望选择最大持续时间。另外,如果你的发射器有延迟,你也应该考虑到它们。

更新

如果某些效果的属性随时间发生变化,则此方法将无法按预期工作。所以如果你跳过一半的持续时间,你就不会考虑之前发生的所有变化。你只是从某个状态开始。

例如,假设效果的持续时间 = 10,前 4 秒速度为 100,之后速度为 0。如果调用 effect.update(5),即跳过前 5 秒,粒子将具有速度 = 0,它们只是不会 "know",它们必须在前 4 秒内移动。

所以,我想这里唯一的解决方法是在循环中以小步骤更新效果,而不是在一次调用中只更新其持续时间的一半:

ParticleEffectPool.PooledEffect effect = particleEffectPool.obtain();
effect.reset();
effect.setPosition(posnX,posnY);

//divide by 1000 to convert from ms to seconds
float skipDuration = 0.5f * effect.getEmitters().first().duration / 1000f;
//I guess, to reduce number of iterations in a loop, you can safely use 
//a bit bigger stepDeltaTime, like 1 / 10f or bigger, but it depends on you effect;
//here I just use standard frame duration
final float stepDeltaTime = 1 / 60f;

while (skipDuration > 0) {
    float dt = skipDuration < stepDeltaTime ? skipDuration : stepDeltaTime;
    effect.update(dt);
    skipDuration -= stepDeltaTime;
}