2014-10-17 83 views
2

我有一個遊戲,涉及大量的碰撞和爆炸。停止粒子效應libgdx

基本上,敵方射彈從屏幕的右下角向左側發射。玩家可以使用他的武器攔截他們。

我希望每當「子彈」和彈丸發生碰撞時,代碼都會在衝擊位置繪製預製的粒子。 我的問題是,在實時碰撞中,粒子被很好地繪製出來,但它們從不停止。即使在碰撞之後,粒子仍然被吸引。

現在,我使用回撥機制來通知渲染碰撞發生的地方,我遞給他的碰撞(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; 
    } 

} 

我怎樣才能一次繪製粒子效果,這就是它?

+0

你有沒有發現這方面的任何解決方案問題? – nano 2014-11-27 10:17:24

回答

1

您可以使用/優化我顆粒類,看看my post here

要一次繪製的粒子效果,這就是它:(它在myparticle自由法):

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