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方法什么时候调用恰当我还没弄明白。我理解上,这个方法应该是有东西自动调啊。

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

posted @ 2014-09-08 00:23  韩宏敏  阅读(555)  评论(0编辑  收藏  举报