停止粒子效果libgdx

时间:2014-10-17 20:25:05

标签: opengl libgdx particles particle-system

我有一个涉及大量碰撞和爆炸的游戏。

基本上,敌人的射弹是从屏幕的右下角向左侧发射的。玩家可以使用他的武器拦截他们。

我希望每当“子弹”和射弹碰撞时,代码都会在撞击位置绘制预制粒子。 我的问题是,在实时碰撞中,粒子被很好地绘制,但它们永远不会停止。即使在碰撞后,粒子也会继续被拉伸。

现在,我使用回调机制通知渲染器某处发生了碰撞,并向我传递了碰撞的坐标(x,y)

这是我的渲染器代码。我从代码中删除了一些部分,只留下相关部分:

    package com.david.gameworld;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.utils.Array;
import com.david.helpers.AssetsLoader;
import com.david.helpers.CollisionAndTouchCallbacks;

public class GameRenderer implements CollisionAndTouchCallbacks.DrawThings{

    /* The GameRenderer class. Responsible for all the rendering work and graphics */

    public static final float FLOOR_HEIGHT = 100.0f; // Public variable - The floor height
    private static final float Pixels_To_Meters = 32.0f; // PTM Ration
    public static float screenWidth; // Screen width
    public static float screenHeight; // Screen height
    public OrthographicCamera camera; // The orthographic camera
    private GameWorld world; // The game world object, for rendering
    private boolean drawTrajectory;
    private boolean drawParticle;
    private boolean isDrawnParticle;
    private Box2DDebugRenderer debugRenderer; // Debug renderer, to see the positions and sizes of the bodies/fixtures
    private SpriteBatch batch; // A sprite batch
    private Array<Body> tempBodies; // An array that contains all the bodies of Box2D
    private Array<Vector2> collisionPositions;
    private float delta;

    public GameRenderer(float screenWidth, float screenHeight, GameWorld world) {
        this.world = world;
        GameRenderer.screenHeight = screenHeight;
        GameRenderer.screenWidth = screenWidth;
        debugRenderer = new Box2DDebugRenderer();
        batch = new SpriteBatch();
        camera = new OrthographicCamera();
        tempBodies = new Array<Body>();
        collisionPositions = new Array<Vector2>();
        drawTrajectory = false;
        drawParticle = false;
        isDrawnParticle = false;
    }

    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        this.delta = delta;
        // Update the world
        world.updateWorld();
        batch.setProjectionMatrix(camera.combined);
        // Get box2d World bodies
        world.getBox2DWorld().getBodies(tempBodies);
        // Draw the entire scene
        batch.begin();
        drawBodiesBox2D();
        if(drawTrajectory)
            drawTrajectory();
        if(drawParticle) {
            if(!isDrawnParticle) {
                drawParticle();
                isDrawnParticle = true;
            } else {
                if(AssetsLoader.explosion.isComplete()) {
                    drawParticle = false;
                    isDrawnParticle = false;
                }
            }
        }

        batch.end();
        // Debug Renderer for box2d world

    }
    // If user is aiming, draw the trajectory of the acorn
    public void drawTrajectory() {
        Gdx.app.log("System Out Println!!!!!!!!!", "Draw projectile");
        float t = 0.1f, x = world.getArrayAcorns().peek().getX(), y = world
                .getArrayAcorns().peek().getY();
        float width = AssetsLoader.orbit.getWidth() / 8 / Pixels_To_Meters;
        float height = AssetsLoader.orbit.getHeight() / 8 / Pixels_To_Meters;
        float timeSeparation = 0.08f;
        for (int i = 0; i < 40; i++) {
            x = world.getAcornEquation().getX(t);
            y = world.getAcornEquation().getY(t);
            batch.draw(AssetsLoader.orbit, x, y, width, height);
            t += timeSeparation;
        }
    }
    private void drawBodiesBox2D() {
        for (Body body : tempBodies) {
            if (body.getUserData() != null
                    && body.getUserData() instanceof Sprite) {
                Sprite sprite = (Sprite) body.getUserData();
                if (!sprite.getTexture().equals(AssetsLoader.ground)) {
                    sprite.setPosition(body.getPosition().x - sprite.getWidth()
                            / 2, body.getPosition().y - sprite.getHeight() / 2);
                } else {
                    sprite.setSize(screenWidth, FLOOR_HEIGHT / Pixels_To_Meters);
                }
                sprite.setRotation((float) Math.toDegrees(body.getAngle()));
                batch.draw(AssetsLoader.catapult_base1, 450 / Pixels_To_Meters,
                        (FLOOR_HEIGHT - 10) / Pixels_To_Meters,
                        AssetsLoader.catapult_base1.getWidth()
                                / Pixels_To_Meters,
                        AssetsLoader.catapult_base1.getHeight()
                                / Pixels_To_Meters);
                sprite.draw(batch);
            }
        }
    }
    public void dispose() {
        AssetsLoader.dispose();
        batch.dispose();
        world.dispose();
        debugRenderer.dispose();
    }
    // Update method for the orthographic camera
    public void updateCamera(int width, int height) {
        camera.setToOrtho(false, width, height);
        screenWidth = (float) width;
        screenHeight = (float) height;
        camera.update();
        // Already Meters
    }

    public OrthographicCamera getCamera() {
        return this.camera;
    }

    private void drawParticle() {
        // TODO Auto-generated method stub
        AssetsLoader.explosion.setPosition(collisionPositions.first().x,collisionPositions.first().y);
        AssetsLoader.explosion.start();
        AssetsLoader.explosion.draw(batch,delta);
        AssetsLoader.explosion.allowCompletion();

    }

    @Override
    public void signalToTrajectory(boolean flag) {
        // TODO Auto-generated method stub
        drawTrajectory = flag;
    }

    @Override
    public void signalToParticle(boolean flag, Array<Vector2> positions) {
        // TODO Auto-generated method stub
        if(flag)
            collisionPositions = positions;
        drawParticle = flag;
    }

}

如何绘制粒子效果一次,就是这样?

1 个答案:

答案 0 :(得分:1)

您可以使用/优化我的粒子类,查看my post here

要绘制一次粒子效果并将其绘制成:(它在myparticle free方法中):

    ParticleEffect effect = new ParticleEffect();
    Emitter emitter = effect.getControllers().first().emitter;
    if (emitter instanceof RegularEmitter){
        RegularEmitter reg = (RegularEmitter) emitter;
        reg.setEmissionMode(RegularEmitter.EmissionMode.EnabledUntilCycleEnd);
        //reg.durationValue.setLow(10f);
        reg.dispose();
    }
    emitter.dispose();