#Testin杯#Mkey libgdx游戏引擎教程外篇(一)优美的自定义进度条(附源码)

348
回复
1632050
查看
  [复制链接]

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2012-7-4 12:01:23 | 显示全部楼层 |阅读模式
本帖最后由 耒佲請ぁ留埗 于 2012-8-18 13:02 编辑



       今天是#Testin杯#Mkey libgdx教程的外篇一,我决定从今天开始时不时添加一些外篇,在主干教程的学习上增加一些补充的内容,窃以为这让才可以让大家更快的上手。


        libgdx引擎严格的来说是一个游戏框架,换一句话说,可能libgdx中本来提供的写好的控件可能并不是很多,因此我们有时候可能需要根据自己的需要来写一些控件。当然了,libgdx框架提供了各种自定义控件所需的基础,所以自定义出一个功能尚可的控件也不是多复杂的事。


      昨天我在编写自己的一个游戏的过程中需要做一个异步资源加载的等待界面(增强用户体验必不可少的哦),于是我便花了一两个小时P了点素材并写好了一个进度条控件。在这篇教程中这个进度条只会自动前进,并没有什么实际的意义,在另一篇libgdx教程(四)中,我会详细的给大家说一说libgdx中的异步加载配合进度条的使用,希望大家继续支持哦~

以下系列教程按讲课顺序排列,也是推荐阅读的顺序

第一讲:libgdx游戏引擎教程(一)性能优良的游戏引擎—libgdx http://www.apkbus.com/android-57355-1-1.html

第二讲: libgdx游戏引擎教程(二) ApplicationListener,着手第一个程序http://www.apkbus.com/android-57372-1-1.html

第三讲:libgdx游戏引擎教程()libgdx粒子系统的使用 http://www.apkbus.com/android-57456-1-1.html

外篇一:libgdx游戏引擎教程外篇(一)优美的自定义进度条(附源码) http://www.apkbus.com/android-57523-1-1.html

第四讲:libgdx游戏引擎教程(四) 游戏正式开始,资源异步加载(附源码)http://www.apkbus.com/android-57716-1-1.html

第五讲 libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码 http://www.apkbus.com/android-57936-1-1.html

第六讲 libgdx游戏引擎教程(六)多游戏界面的实现(二)附源码 http://www.apkbus.com/android-57991-1-1.html  

第七讲 libgdx游戏引擎教程(七) 在libgdx中拦截Android按键事件 http://www.apkbus.com/android-58030-1-1.html  

外篇二: libgdx游戏引擎教程外篇(二)libgdx移植俄罗斯方块(附源码) http://www.apkbus.com/android-58102-1-1.html   

实战一:libgdx游戏引擎教程实战篇(一)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58404-1-1.html  

实战二:libgdx游戏引擎教程实战篇(二)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58408-1-1.html  

实战三:libgdx游戏引擎教程实战篇(三)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58414-1-1.html  

实战四:libgdx游戏引擎教程实战篇(四)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58418-1-1.html  

实战五:libgdx游戏引擎教程实战篇(五)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58419-1-1.html

实战六:libgdx游戏引擎教程实战篇(六)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58760-1-1.html

第八讲 libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码 http://www.apkbus.com/android-58933-1-1.html

第九讲 libgdx游戏引擎教程(九) libgdx中的用户手势识别(二)附源码 http://www.apkbus.com/android-59152-1-1.html

外篇三: libgdx游戏引擎教程外篇(三) 优美的自定义对话框(附源码) http://www.apkbus.com/android-59654-1-1.html  

第十讲:  libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码) http://www.apkbus.com/android-59998-1-2.html

第十一讲:libgdx游戏引擎教程(十一)演员类的复杂动画(二)(附源码) http://www.apkbus.com/android-60053-1-1.html

第十二讲:libgdx游戏引擎教程(十二)演员类的复杂动画(三)(附源码) http://www.apkbus.com/android-60194-1-1.html   

第十三讲: libgdx游戏引擎教程(十三)演员类的用户交互功能详解(附源码)  http://www.apkbus.com/android-60457-1-1.html

第十四讲:libgdx游戏引擎教程(十四)libgdx中常用的控件(附源码) http://www.apkbus.com/android-60569-1-1.html

最新更新 第十五讲 :libgdx游戏引擎教程(十五)在Libgdx中仿微信帮助滑动效果(附源码) http://www.apkbus.com/android-60822-1-1.html

这次的外一篇需要大家先掌握一些简单的libgdx的知识看起来才更加容易些:


android游戏开发框架libgdx的使用(四)--舞台和演员


libgdx 学习笔记二绘制图像


我们先新建一个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的使用(四)--舞台和演员

剩下的语句也很简单,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);
大家可以看到我将清屏后的颜色置为(1110),即为白色,大家可以在下面看到效果。
再用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. }
复制代码

运行即可,大功告成!

游戏其实就是宠物养成游戏,可以普通对战及蓝牙对战,宠物进化等等。
不知道大家能不能从源码的名字中看出什么功能来呢?哈哈

[url=http://www.apkbus.com/data/attachment/album/201208/18/110243sugu1izdbauab6z3.jpg]



Testin ID:ilovemkey@gmail.com 总的而言这个平台真的非常好用!我正是用这个平台发现了现在写的这个应用的一些内存管理方面的问题。另外建议能够在测试报告中看到某一台机型在整个执行过程中的cpu和内存占用的变化情况,这样可以更快地锁定问题。感谢Itestin让测试变得轻松了太多太多!

希望大家继续支持Mkey libgdx游戏引擎系列教程!

这里是源代码哦!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

好东西  发表于 2013-3-1 16:18
君见一叶舟,出没风波里

2826

主题

7684

帖子

9622

安币

管理员

Rank: 9Rank: 9Rank: 9

QQ达人最佳新人活跃会员热心会员推广达人灌水之王突出贡献

QQ
发表于 2012-7-4 12:03:50 | 显示全部楼层
{:soso_e102:}  太期待源码了哈!!!!

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

 楼主| 发表于 2012-7-4 12:04:59 | 显示全部楼层
chino 发表于 2012-7-4 12:03
太期待源码了哈!!!!

嘿嘿~~大大你回的好快
君见一叶舟,出没风波里

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

 楼主| 发表于 2012-7-4 12:05:25 | 显示全部楼层
chino 发表于 2012-7-4 12:03
太期待源码了哈!!!!

嘿嘿~~大大你回的好快
君见一叶舟,出没风波里

2826

主题

7684

帖子

9622

安币

管理员

Rank: 9Rank: 9Rank: 9

QQ达人最佳新人活跃会员热心会员推广达人灌水之王突出贡献

QQ
发表于 2012-7-4 12:06:22 | 显示全部楼层
耒佲請ぁ留埗 发表于 2012-7-4 12:05
嘿嘿~~大大你回的好快

必须的!!!!

35

主题

365

帖子

1212

安币

Android大神

Rank: 6Rank: 6

发表于 2012-7-4 12:08:10 | 显示全部楼层
感谢分享,学习了,你的这一系列教程,可以做个整合贴,很不错的说~{:Music:}
要不去游戏版块出个整合贴吧,

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

 楼主| 发表于 2012-7-4 12:10:13 | 显示全部楼层
sudubhe 发表于 2012-7-4 12:08
感谢分享,学习了,你的这一系列教程,可以做个整合贴,很不错的说~
要不去游戏版块出个整合贴吧 ...

谢谢亲的支持{:Snicker:}
君见一叶舟,出没风波里

58

主题

813

帖子

1万

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2012-7-4 14:00:14 | 显示全部楼层
哇,很好很强大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )