2014-10-17 2 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

답변

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