Libgdx之粒子系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zqiang_55/article/details/52796979

游戏开发过程中不免要用到各种特效,比如水流、烟雾、火焰等效果,如果使用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();
    }

}

猜你喜欢

转载自blog.csdn.net/zqiang_55/article/details/52796979
今日推荐