首页 > 代码库 > 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 粒子效果二
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。