Libgdx之粒子系统

Posted zqiang_55

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Libgdx之粒子系统相关的知识,希望对你有一定的参考价值。

游戏开发过程中不免要用到各种特效,比如水流、烟雾、火焰等效果,如果使用Sprite实现不仅耗内存,而且复杂。幸好Libgdx提供了粒子系统来帮助我们实现这些这些效果。

粒子系统

  1. 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之粒子系统的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx之粒子系统

Libgdx之粒子系统

cocos2d-x 粒子系统

libGDX ParticleEffect 运行时速度变化

粒子系统 libGDX [关闭]

Unity的粒子系统(二)