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

时间:2017-12-10 17:44:51

标签: java libgdx

是否可以在中途启动粒子效果?我尝试了在初始化时更新粒子效果/发射器的许多变化。他们似乎都没有工作。有没有人设法做到这一点?非常感谢!

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

    float value = 1.5f;

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

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

编辑:在初始化粒子效果时,通过执行以下代码片段,我发现了一点点黑客攻击。仍然有兴趣看看有人有更好的解决方案

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

1 个答案:

答案 0 :(得分:0)

我认为,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,他们只是赢得了&#34;知道&#34;,他们必须在前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;
}