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方法什么时候调用恰当我还没弄明白。我理解上,这个方法应该是有东西自动调啊。
请指教啊,这个方法也是我从网上抄来的,忘了是哪了。
我是cocos2dx初学者,Java5年,一点C++,OC经验都没有,各位见笑了
文章中如有错误或者不全面或者有更好的解决办法,请指出,不胜感激