如何在中途启动 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;
}
是否可以在中途启动粒子效果?我尝试了多种在初始化时更新粒子 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;
}