gpt4 book ai didi

java - libgdx 粒子编辑器的多种用法

转载 作者:行者123 更新时间:2023-11-30 09:25:43 24 4
gpt4 key购买 nike

我是 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());

}

最佳答案

如评论所述,问题在于您对多个项目符号使用单一效果。我怀疑它设置为非连续的,因此持续时间有限。随着时间的推移,效果会逐渐消失。

我建议为效果创建一个粒子效果池,并从/free() obtain() 到池中。为每个项目符号附加一个效果。这允许您运行多个效果,同时限制垃圾收集(由于池)以及避免为每个新效果加载 .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);

相反,您可以跳过池并使烟雾粒子效果循环(连续)。这可能无法准确地满足您的需求,并且可能被认为是一种拼凑,但在紧要关头可能会奏效。

关于java - libgdx 粒子编辑器的多种用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com