Libgdx之粒子系统
Posted zqiang_55
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Libgdx之粒子系统相关的知识,希望对你有一定的参考价值。
游戏开发过程中不免要用到各种特效,比如水流、烟雾、火焰等效果,如果使用Sprite实现不仅耗内存,而且复杂。幸好Libgdx提供了粒子系统来帮助我们实现这些这些效果。
粒子系统
- com.badlogic.gdx.graphics.g2d.ParticleEmitter.Particle extends Sprite
粒子。每一个粒子本质上都是一个小图片,作为粒子编辑器的图片不要过大,经过粒子编辑器之后设置了相关参数,之后ParticleEmitter解析处理粒子。
参数 | 说明 |
---|---|
angle | 粒子从发射器发射出来的角度,可以实现粒子发射发生偏移 |
size | 粒子的大小 |
life | 粒子的生命周期 |
velocity | 粒子移动速度 |
gravity | 粒子受到的重力 |
transparency | 粒子的透明度 |
tint | 粒子的颜色,可以在粒子生存周期内变化任意多个颜色 |
wind | 风吹的方向等 |
rotation | 粒子旋转 |
2. com.badlogic.gdx.graphics.g2d.ParticleEmitter
粒子发射器。粒子是一个一个的,这个就需要一个粒子发射器来发射各种粒子。Libgdx提供给我们ParticleEmitter代表了粒子发射器,其主要作用就是解析粒子的各种属性,同时可以绘制粒子。
3. com.badlogic.gdx.graphics.g2d.ParticleEffect
粒子效果类,负责加载粒子编辑器编辑的文件(.p)。里面包含了粒子发射器,负责粒子的各种生命周期
方法 | 说明 |
---|---|
isComplete | 查看粒子的生命周期是否完成,用于销毁粒子 |
load(FileHandle effectFile, FileHandle imageDir) | 加载粒子编辑器文件 |
setPosition(float x, float y) | 设置粒子的位置 |
draw() | 绘制粒子效果的方法 |
start() | 开始喷射粒子,必须调用此方法和draw()方法配合 |
reset() | 粒子生命周期结束就不会再绘制了,但是调用此方法可以重新开始 |
4. com.badlogic.gdx.graphics.g2d.ParticleEffectPool
粒子池,大量使用粒子时建议使用此类节约内存。
下面是一个简单的demo
ParticleEffect particleEffect;
SpriteBatch batch;
@Override
public void create()
particleEffect = new ParticleEffect();
// 加载粒子文件
particleEffect.load(Gdx.files.internal("p/test.p"), Gdx.files.internal("p"));
particleEffect.setPosition(100, 100);
particleEffect.start();
batch = new SpriteBatch();
@Override
public void render()
batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if (particleEffect.isComplete())
particleEffect.reset();
batch.begin();
particleEffect.draw(batch, Gdx.graphics.getDeltaTime());
batch.end();
@Override
public void dispose()
batch.dispose();
particleEffect.dispose();
效果图:
粒子池
在开发游戏过程中,如果粒子要不断的出现,单纯的使用上面方法比较消耗内存,不过幸好Libgdx给我们提供了对象池的方法。
1. com.badlogic.gdx.graphics.g2d.ParticleEffectPool extends Pool
方法 | 说明 |
---|---|
newObject | 创建新的PooledEffect对象 |
obtain | 获取空闲的PooledEffect对象 |
2. 1. com.badlogic.gdx.graphics.g2d.ParticleEffectPool.PooledEffect extends ParticleEffect
方法 | 说明 |
---|---|
reset | 恢复PooledEffect对象生命周期 |
free | 释放不再使用的PooledEffect对象 |
public class ParticlePoolTest extends ApplicationAdapter
private SpriteBatch batch;
private ParticleEffect pe;
private ParticleEffectPool pool;
private Array<PooledEffect> effects;
@Override
public void create()
batch = new SpriteBatch();
pe = new ParticleEffect();
pe.load(Gdx.files.internal("p/test.p"), Gdx.files.internal("p"));
pe.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
pe.start();
pool = new ParticleEffectPool(pe, 0, 70);
effects = new Array<PooledEffect>();
Gdx.input.setInputProcessor(new InputAdapter()
@Override
public boolean touchDragged(int screenX, int screenY, int pointer)
PooledEffect effect = pool.obtain();
effect.setPosition(screenX, -screenY + Gdx.graphics.getHeight());
effects.add(effect);
return true;
);
@Override
public void render()
batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
for (PooledEffect effect : effects)
effect.draw(batch, Gdx.graphics.getDeltaTime());
if (effect.isComplete())
effects.removeValue(effect, true);
effect.free();
batch.end();
Gdx.app.log("pool stats", "active: " + effects.size + " | free: " + pool.getFree() + "/" + pool.max + " | record: " + pool.peak);
@Override
public void dispose()
batch.dispose();
pe.dispose();
以上是关于Libgdx之粒子系统的主要内容,如果未能解决你的问题,请参考以下文章