【问题标题】:How can I start a LIBGDX particle effect mid way through?如何在中途启动 LIBGDX 粒子效果?
【发布时间】:2017-12-11 17:08:10
【问题描述】:

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

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

    float value = 1.5f;

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

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

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

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

【问题讨论】:

    标签: java libgdx


    【解决方案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,他们只是不会“知道”,他们必须在前 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;
    }
    

    【讨论】:

    • 感谢您帮助我。我试过你的代码,这是下面的result。但是,我希望它看起来像 this。我不知道为什么您的代码没有达到预期的效果 - 我没有延迟,所有发射器的持续时间都相同。
    • 真的很奇怪。看起来效果改变了它的位置、粒子的速度等。如果你不改变任何东西,只更新它,这不应该发生。
    • 好的,你能告诉我,你为什么要让效果在中途开始粒子效果?
    • 已编辑,尝试在particleEffectPool.obtain()之后立即重置
    • 我同意,这很奇怪。在设置 posn 之前重置效果没有运气。我希望它看起来好像手推车已经抽了一段时间,而不是在关卡开始后就开始了。我设法开始工作的唯一一件事就是我在最初帖子的编辑部分中放入的内容。但是,这感觉就像是 hack!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多