2

LibGDXは初めてです...パーティクルエフェクトを弾丸オブジェクトにアタッチしようとしています。複数の弾丸を発射するプレーヤーがあり、発射された弾丸に続いて煙と炎を追加したいと思います。

問題は、毎回同じ効果が得られるわけではないということです。最初の弾丸の効果は私が望むように見えますが、他のすべての弾丸の後ろには短い軌跡があります。描く粒子がないように。

可能であれば、1つのパーティクルエミッタオブジェクトを使用したいと思います。すべての弾丸オブジェクトに複数のインスタンスを設定したくない。

各弾丸を描画した後、reset()メソッドを使用しようとしましたが、同じようには見えません。最初のものだけが問題ありません、他のすべては少しの間悪いように見えます。

これを行う方法はありますか?

ヘルプ!

これはコードスニペットです:

初期化:

    bulletTexture = new Texture("data/bullet.png");
    bulletTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    // Load particles
    bulletFire = new ParticleEmitter();

    try {
        bulletFire.load(Gdx.files.internal("data/bullet_fire_5").reader(2048));
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Load particle texture
    bulletFireTexture = new Texture("data/fire.png");
    bulletFireTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    // Attach particle sprite to particle emitter
    Sprite particleSprite = new Sprite(bulletFireTexture);
    bulletFire.setSprite(particleSprite);
    bulletFire.start();

レンダリングメソッドの場合:

    // Draw bullets

    bulletIterator = bullets.iterator();

    while (bulletIterator.hasNext()) {

        bullet = bulletIterator.next();

        bulletFire.setPosition(bullet.getPosition().x + bullet.getWidth() / 2,
                bullet.getPosition().y + bullet.getHeight() / 2);
        setParticleRotation(bullet);


        batch.draw(bulletTexture, bullet.getPosition().x,
                bullet.getPosition().y, bullet.getWidth() / 2,
                bullet.getHeight() / 2, bullet.getWidth(),
                bullet.getHeight(), 1, 1, bullet.getRotation(), 0, 0,
                bulletTexture.getWidth(), bulletTexture.getHeight(), false,
                false);


        bulletFire.draw(batch, Gdx.graphics.getDeltaTime());

    }
4

1 に答える 1

3

コメントが述べているように、問題は、複数の弾丸に単一の効果を使用していることです。非連続に設定されているので、期間が限られていると思います。時間が経つにつれて、効果はなくなります。

エフェクト用のパーティクルエフェクトプールを作成することをお勧めします。プールobtain()から/free()へ。各弾丸に1つの効果を付けます。これにより、(プーリングによる)ガベージコレクションを制限し、.p新しいエフェクトごとにファイルのロードを回避しながら、複数のエフェクトを実行できます。obtain()プールは、が呼び出されるたびにコピーされるテンプレートを使用して作成されます。の呼び出しでのPooledEffectへのキャストに注意してくださいfree()

import com.badlogic.gdx.graphics.g2d.ParticleEffect;
import com.badlogic.gdx.graphics.g2d.ParticleEffectPool;
import com.badlogic.gdx.graphics.g2d.ParticleEffectPool.PooledEffect;

...

ParticleEffect template = new ParticleEffect();
template.load(Gdx.files.internal("data/particle/bigexplosion.p"),
            ..texture..);
ParticleEffectPool bigExplosionPool = new ParticleEffectPool(template, 0, 20);

...

ParticleEffect particle = bigExplosionPool.obtain();

... // Use the effect, and once it is done running, clean it up

bigExplosionPool.free((PooledEffect) particle);

逆に、プールをスキップして、煙のパーティクルエフェクトループ(連続)を作成することもできます。これでは、探しているものが正確に得られない可能性があり、応急修理と見なされる可能性がありますが、ピンチで機能する可能性があります。

于 2013-08-24T17:43:01.987 に答える