Android开发_libgdx游戏引擎教程外篇 优美的自定义进度条 (八)



android游戏开发框架libgdx的使用(四)--舞台和演员
http://www.apkbus.com/android-19750-1-1.html


libgdx 学习笔记二绘制图像
http://www.apkbus.com/android-44573-1-1.html


我们先新建一个ProgressBar的类,这个类继承自Libgdx中的演员Actor类,并实现了我在第二讲中提到过的Disposable接口,为的是能及时释放内存。

  1. public class ProgressBar extends Actor implements Disposable{
  2.     Texture platform;
  3.     Texture bar;
  4.     int height;
  5.     int width;
  6.     float progress;
  7.     //做了一个简单的适配,powerx和powery分别当前设备分辨率的权重,以现在主流的800*480为基准
  8.     float powerx;
  9.     float powery;
  10.     @Override
  11.     public void draw(SpriteBatch batch, float arg1) {
  12.        // TODO Auto-generated method stub
  13.        batch.draw(platform, (Gdx.graphics.getWidth()-bar.getWidth()*powerx)/2, 0,platform.getWidth()*powerx,platform.getHeight()*powery);
  14.     batch.draw(bar,(Gdx.graphics.getWidth()-bar.getWidth()*powerx)/2,0,bar.getWidth()*progress/100f*powerx,bar.getHeight()*powery);
  15.     }

  16.     @Override
  17.     public Actor hit(float arg0, float arg1) {
  18.        // TODO Auto-generated method stub
  19.        return null;
  20.     }

  21.     public ProgressBar(int x,int y) {
  22.        super();
  23.        //设定Actor的位置,这里并没有什么用,纯粹为了和大家介绍一下
  24.        this.x=x;
  25.        this.y=y;
  26.        platform=new Texture(Gdx.files.internal("black.png"));
  27.        bar=new Texture(Gdx.files.internal("green.png"));
  28.        height=Gdx.graphics.getHeight();
  29.        width=Gdx.graphics.getWidth();
  30.        //做了一个简单的适配,powerx和powery分别当前设备分辨率的权重,以现在主流的800*480为基准
  31.        powerx=Gdx.graphics.getWidth()/800f;
  32.        powery=Gdx.graphics.getHeight()/480f;
  33.     }
  34.     public void setProgress(float progress){
  35.        this.progress=progress;
  36.     }
  37.     public void dispose() {
  38.        // TODO Auto-generated method stub
  39.        platform.dispose();
  40.        bar.dispose();
  41.     }
  42.    
  43. }
复制代码
这里对上面的变量和语句都做一个简单的说明:
Texture platform;
Texture bar;
前者是进度条的底座的图片,而bar则代表进度条的图片。


       至于Actor中的draw()方法,这是一个系统自动调用的方法,描述这个演员Actor实例怎么绘制,draw()方法并不需要我们人工去调用,而是在把Actor加入舞台Stage中后,在ApplicationListener的render()函数中不停地调用stage.draw(),系统会自动调用已经加入stage中的actor的draw()方法,也就将actor一起绘制出来了。具体请看:


android游戏开发框架libgdx的使用(四)--舞台和演员
http://www.apkbus.com/android-19750-1-1.html

剩下的语句也很简单,draw() 中用SpriteBatch 画出了两张图,其中bar 的绘制长度根据进度progress 变化,也就产生了进度条的效果。

这次我们重写一个 ApplicationListener ,再用 AndroidApplication 启动,源码还是在第三讲的基础上进行修改和添加。
  1. public class Progress implements ApplicationListener {
  2.     ProgressBar bar;
  3.     Stage stage;
  4.     @Override
  5.     public void create() {
  6.        // TODO Auto-generated method stub
  7.        bar=new ProgressBar(0,0);
  8.        //新建一个舞台
  9.        stage=new Stage(Gdx.graphics.getWidth(),Gdx.graphics.getHeight(), true);
  10.        stage.addActor(bar);
  11.     }

  12.     @Override
  13.     public void dispose() {
  14.        // TODO Auto-generated method stub
  15.        bar.dispose();
  16.     }

  17.     @Override
  18.     public void pause() {
  19.        // TODO Auto-generated method stub

  20.     }

  21.     @Override
  22.     public void render() {
  23.        // TODO Auto-generated method stub
  24.        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  25.        Gdx.gl.glClearColor(1f,1f,1f,0f);
  26.        stage.act(Gdx.graphics.getDeltaTime());
  27.        stage.draw();
  28.        if(bar.progress<100)
  29.            bar.progress+=0.5;
  30.        //重新置零
  31.        if(bar.progress==100)
  32.            bar.progress=0;
  33.     }

  34.     @Override
  35.     public void resize(int arg0, int arg1) {
  36.        // TODO Auto-generated method stub

  37.     }

  38.     @Override
  39.     public void resume() {
  40.        // TODO Auto-generated method stub

  41.     }

  42. }
复制代码
这里相比之前的 demo 有一处变化 :
Gdx. gl.glClear(GL10. GL_COLOR_BUFFER_BIT);
Gdx. gl.glClearColor(1f,1f,1f,0f);
大家可以看到我将清屏后的颜色置为( 1 1 1 0 ),即为白色,大家可以在下面看到效果。
再用AndroidApplication启动:
  1. public class MyGame implements ApplicationListener {
  2.     SpriteBatch batch;
  3.     BitmapFont bf;
  4.     ParticleEffect particle;
  5.     ParticleEffect tem;
  6.     ParticleEffectPool particlepool;
  7.     ArrayList<ParticleEffect> particlelist;
  8.         public void create () {
  9.                 // STUB
  10.         batch=new SpriteBatch();
  11.         bf=new BitmapFont();
  12.         //初始化粒子变量
  13.         particle = new ParticleEffect();
  14.         particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal(""));
  15.         particlepool=new ParticleEffectPool(particle, 5, 10);
  16.         particlelist=new ArrayList<ParticleEffect>();
  17.         }

  18.         public void render () {
  19.                 // STUB
  20.         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  21.         Gdx.gl.glClearColor(0f,0f,0f,0f);
  22.         batch.begin();
  23.         bf.draw(batch, "Testin  Mkey libgdx(3)",Gdx.graphics.getWidth()*0.4f, Gdx.graphics.getHeight()/2);
  24.         batch.end();
  25.         if(true){
  26.              if(Gdx.input.isTouched()){
  27.                 //当此触摸点与上一触摸点距离大于一定值的时候触发新的粒子系统,由此减小系统负担
  28.                 tem=particlepool.obtain();
  29.                 tem.setPosition(Gdx.input.getX(),Gdx.graphics.getHeight()-Gdx.input.getY());
  30.                 particlelist.add(tem);
  31.              }
  32.              batch.begin();
  33.                 for(int i=0;i<particlelist.size();i++){
  34.              particlelist.get(i).draw(batch, Gdx.graphics.getDeltaTime());
  35.                 }
  36.                 batch.end();
  37.       
  38.                 //清除已经播放完成的粒子系统
  39.                 ParticleEffect temparticle;
  40.                 for(int i=0;i<particlelist.size();i++){
  41.                   temparticle=particlelist.get(i);
  42.                  if(temparticle.isComplete()){
  43.                      particlelist.remove(i);
  44.                  }
  45.                 }
  46.              }
  47.         }

  48.         public void resize (int width, int height) {
  49.                 // STUB
  50.         }

  51.         public void pause () {
  52.                 // STUB
  53.         }

  54.         public void resume () {
  55.                 // STUB
  56.         }

  57.         public void dispose () {
  58.                 // STUB
  59.         batch.dispose();
  60.         bf.dispose();
  61.         //千万别忘了释放内存
  62.         particle.dispose();
  63.         if(tem!=null)
  64.             tem.dispose();
  65.         particlepool.clear();
  66.         }
  67. }
复制代码

运行即可,大功告成!
Android开发_libgdx游戏引擎教程外篇 优美的自定义进度条 (八)_第1张图片
福利图:
哈哈,下面是我的用 libgdx 的一个比较大的游戏,还没有完全写好,可以先泄露一点谍照哦,如果大家喜欢 Libgdx 的话,请多多支持我的 Testinlibgdx系列教程,如果支持的人多而且大家都想要源码的话,我考虑把源码放出来供大家学习学习。

游戏其实就是宠物养成游戏,可以普通对战及蓝牙对战,宠物进化等等。
Android开发_libgdx游戏引擎教程外篇 优美的自定义进度条 (八)_第2张图片

你可能感兴趣的:(android,安卓,libgdx)