Многократное использование редактора частиц libgdx
Я новичок в LibGDX... Я пытаюсь прикрепить эффект частиц к объектам пули. У меня есть игрок, который стреляет несколькими пулями, и я хочу добавить немного дыма и пламени, которые следуют за выпущенными пулями.
Проблема в том, что я не получаю один и тот же эффект каждый раз. Первоначально эффект первой пули выглядит так, как я хочу, каждая вторая пуля имеет более короткий след. Как будто нет частиц для рисования.
Я хочу, если возможно, использовать один объект-эмиттер частиц. Не хочу иметь несколько экземпляров для каждого объекта маркера.
Я пытался использовать метод 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());
}
1 ответ
Как говорится в комментариях, проблема в том, что вы используете один эффект для нескольких маркеров. Я подозреваю, что он установлен не непрерывно, поэтому имеет ограниченную продолжительность. Со временем эффект кончается.
Я бы предложил создать пул эффектов частиц для эффекта, и obtain()
от / free()
в бассейн. Прикрепите один эффект к каждой пуле. Это позволяет запускать несколько эффектов, ограничивая при этом сборку мусора (из-за пула), а также избегая загрузки .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);
И наоборот, вы можете пропустить пулы и сделать петлю эффекта частиц дыма (непрерывной). Это может не дать вам именно то, что вы ищете, и может считаться клуджем, но может работать в крайнем случае.