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