首页 > 代码库 > libgdx 2D 粒子效果二

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     @Override20     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     @Override43     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     @Override61     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     @Override17     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     @Override25     public void dispose() {26 27         stage.dispose();28         super.dispose();29     }30 31     @Override32     public void resize(int width, int height) {33         stage.getViewport().update(width,height);34         super.resize(width, height);35     }36 37     @Override38     public boolean keyDown(int keycode) {39         if(keycode == Input.Keys.J){40             actor.startDestroy();41             actor = null;42         }43         return false;44     }45 46     @Override47     public boolean keyUp(int keycode) {48         return false;49     }50 51     @Override52     public boolean keyTyped(char character) {53         return false;54     }55 56     @Override57     public boolean touchDown(int screenX, int screenY, int pointer, int button) {58         return false;59     }60 61     @Override62     public boolean touchUp(int screenX, int screenY, int pointer, int button) {63         return false;64     }65 66     @Override67     public boolean touchDragged(int screenX, int screenY, int pointer) {68         return false;69     }70 71     @Override72     public boolean mouseMoved(int screenX, int screenY) {73         return false;74     }75 76     @Override77     public boolean scrolled(int amount) {78         return false;79     }80 }

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

 

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

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

libgdx 2D 粒子效果二