我是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());
}
答案 0 :(得分:2)
正如评论所述,问题在于您对多个项目符号使用单一效果。我怀疑它设置为非连续,因此持续时间有限。随着时间的推移,效果已经消失。
我建议为效果创建一个粒子效果池,并将obtain()
从/ free()
创建到池中。为每个子弹附加一个效果。这允许您在限制垃圾收集(由于池)的同时运行多个效果,以及避免为每个新效果加载.p
文件。使用每次调用obtain()
时复制的模板创建池。注意在调用free()
时对PooledEffect的强制转换。
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);
相反,您可以跳过池并使烟雾粒子效果循环(连续)。这可能不会让你得到你正在寻找的东西,并且可能被认为是一个kludge,但可能会紧张。