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

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

  • 相关阅读:
    算法(第4版)-1.1.2 原始数据类型与表达式
    java值传递与引用传递实例
    (转载)理解Java中的引用传递和值传递
    (转载)深入Java关键字this的用法的总结
    如何判断数据库中是否存在某个表
    iforums之UEditor上传图片提示【未知错误】
    空指针和野指针
    self关键字
    自定义构造方法和description方法
    点语法
  • 原文地址:https://www.cnblogs.com/hanhongmin/p/3961002.html
Copyright © 2020-2023  润新知