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

转自:http://www.apkbus.com/android-57372-1-1.html

 

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

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



 

昨天我在编写自己的一个游戏的过程中需要做一个异步资源加载的等待界面(增强用户体验必不可少的哦),于是我便花了一两个小时P了点素材并写好了一个进度条控件。在这篇教程中这个进度条只会自动前进,并没有什么实际的意义,在另一篇libgdx教程(四)中,我会详细的给大家说一说libgdx中的异步加载配合进度条的使用,希望大家继续支持哦~
 
这次的外一篇需要大家先掌握一些简单的 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. }
复制代码
这里对上面的变量和语句都做一个简单的说明:
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);
大家可以看到我将清屏后的颜色置为( 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. ParticleEffect temparticle;
  39. for(int i=0;i<particlelist.size();i++){
  40. temparticle=particlelist.get(i);
  41. if(temparticle.isComplete()){
  42. particlelist.remove(i);
  43. }
  44. }
  45. }
  46. }

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

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

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

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

运行即可,大功告成!

福利图:
哈哈,下面是我的用 libgdx 的一个比较大的游戏,还没有完全写好,可以先泄露一点谍照哦,如果大家喜欢 Libgdx 的话,请多多支持我的 Testinlibgdx系列教程,如果支持的人多而且大家都想要源码的话,我考虑把源码放出来供大家学习学习。

游戏其实就是宠物养成游戏,可以普通对战及蓝牙对战,宠物进化等等。

不知道大家能不能从源码的名字中看出什么功能来呢?哈哈

这就是我用本篇的进度条写的一个异步加载的等待页面,还没有完善,先意思意思。
谍照!!!



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

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

这里是源代码哦!

edu.nju.wsj.libgdx.rar(3.04 MB, 下载次数: 959)
2012-7-4 12:01 上传
点击文件名下载附件
下载积分: 下载豆 -2


豌豆荚截图20120704114838.png(2.28 KB, 下载次数: 23)

2012-7-4 11:56 上传

点击文件名下载附件

豌豆荚截图20120704114838.png

Screenshot_2012-07-04-10-35-34.png(246.26 KB, 下载次数: 16)

2012-7-4 11:56 上传

点击文件名下载附件

Screenshot_2012-07-04-10-35-34.png

未命名.jpg(51.91 KB, 下载次数: 9)

2012-7-4 11:56 上传

点击文件名下载附件

未命名.jpg

未命名1.jpg(56.79 KB, 下载次数: 11)

2012-7-4 11:56 上传

点击文件名下载附件

未命名1.jpg

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值