libgdx 2D 粒子效果二

在上一篇随笔中,我们能够把粒子效果在stage中使用了。

想了想,在实际应用中粒子效果可能有2中使用的情况:

1. 单独的粒子效果,比如一个飞行的火球。他跟真正的Actor没啥关系,只有自己的position或者说飞行轨迹。

施法者放完后爱哪玩去哪玩去,粒子效果跟他无关了。

2. 跟真正的Actor相关的粒子效果,比如飞机发动机的火焰,或者飞机爆炸的效果。

他一直跟着飞机在动。

-------------------当然以上两种未必用粒子效果实现,我只是这么说。。。

 

对于第二种情况,不防封装一个简单的Actor试试。

上代码:

 1 public class ActorWithEffect extends Actor {

 2     private Texture mTexture;

 3     private TextureRegion region;

 4     private ParticleEffect particleEffect;

 5     private Vector2 acc = new Vector2();

 6     private boolean dead = false;

 7     private float deadTime = 0f;

 8     private Sound bomb;

 9 

10     public ActorWithEffect()

11     {

12         mTexture = new Texture("badlogic.jpg");

13         region = new TextureRegion(mTexture);

14         particleEffect = new ParticleEffect();

15         particleEffect.load(Gdx.files.internal("data/abc.p"), Gdx.files.internal("data"));//第一个参数是粒子效果文件,第二个参数是图片basepath(这里应该有一个默认的particle.png别忘了)

16         bomb = Gdx.audio.newSound(Gdx.files.internal("bomb.mp3"));

17     }

18 

19     @Override

20     public void draw(Batch batch, float parentAlpha)

21     {

22         Color color = getColor();

23         batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);

24         if(deadTime<2.0f){//开始消灭时,再显示2秒图片,剩余1秒只显示销毁粒子效果

25             batch.draw(region, getX(), getY(),

26                     region.getRegionWidth() / 2,

27                     region.getRegionHeight() / 2,

28                     region.getRegionWidth(),

29                     region.getRegionHeight(), getScaleX(), getScaleY(),

30                     getRotation());

31         }

32         if(dead){

33             particleEffect.draw(batch);

34         }

35 

36         if(deadTime>3.0f){

37             this.getStage().getActors().removeValue(this,true);

38             this.clear();//放这合适吗?

39         }

40     }

41 

42     @Override

43     public void act(float delta) {

44         super.act(delta);

45         acc.set(getWidth() / 2, getHeight() / 2);

46         localToStageCoordinates(acc);

47         particleEffect.setPosition(acc.x, acc.y);

48         particleEffect.update(delta);

49         if(dead){

50             deadTime = deadTime+delta;

51         }

52     }

53 

54     public void startDestroy(){

55         this.dead = true;

56         particleEffect.start();

57         bomb.play();

58     }

59 

60     @Override

61     public void clear() {//还没明白这个方法啥时候调用,请指教啊

62         mTexture.dispose();

63         particleEffect.dispose();

64         bomb.dispose();

65         super.clear();

66     }

67 }

 

 1 public class ParticleTest2 extends ApplicationAdapter implements InputProcessor {

 2     private Stage stage;

 3     private static final Logger LOGGER = new Logger(ParticleTest2.class.getName(),Application.LOG_DEBUG);

 4     private ActorWithEffect actor;

 5     @Override

 6     public void create () {

 7         Gdx.app.setLogLevel(Application.LOG_DEBUG);

 8         stage = new Stage();

 9         Gdx.input.setInputProcessor(this);

10 

11         actor = new ActorWithEffect();

12         actor.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);

13         stage.addActor(actor);

14     }

15 

16     @Override

17     public void render () {

18         Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);

19         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

20         stage.act();

21         stage.draw();

22     }

23 

24     @Override

25     public void dispose() {

26 

27         stage.dispose();

28         super.dispose();

29     }

30 

31     @Override

32     public void resize(int width, int height) {

33         stage.getViewport().update(width,height);

34         super.resize(width, height);

35     }

36 

37     @Override

38     public boolean keyDown(int keycode) {

39         if(keycode == Input.Keys.J){

40             actor.startDestroy();

41             actor = null;

42         }

43         return false;

44     }

45 

46     @Override

47     public boolean keyUp(int keycode) {

48         return false;

49     }

50 

51     @Override

52     public boolean keyTyped(char character) {

53         return false;

54     }

55 

56     @Override

57     public boolean touchDown(int screenX, int screenY, int pointer, int button) {

58         return false;

59     }

60 

61     @Override

62     public boolean touchUp(int screenX, int screenY, int pointer, int button) {

63         return false;

64     }

65 

66     @Override

67     public boolean touchDragged(int screenX, int screenY, int pointer) {

68         return false;

69     }

70 

71     @Override

72     public boolean mouseMoved(int screenX, int screenY) {

73         return false;

74     }

75 

76     @Override

77     public boolean scrolled(int amount) {

78         return false;

79     }

80 }

以上代码中,按下J键飞机自毁。

 

actor的clear方法什么时候调用恰当我还没弄明白。我理解上,这个方法应该是有东西自动调啊。

请指教啊,这个方法也是我从网上抄来的,忘了是哪了。

你可能感兴趣的:(libgdx)