#Testin杯#Mkey libgdx游戏引擎教程(二) 着手第一个程序!(附源码)

203
回复
1588329
查看
  [复制链接]

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

原创 发表于 2012-7-3 10:07:36 | 显示全部楼层 |阅读模式
本帖最后由 耒佲請ぁ留埗 于 2012-8-18 13:00 编辑

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

第一讲: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

上一讲最后说到两个问题,一个是AndroidApplication的继承来源问题,另一个是libgdx中的ApplicationListener的问题,今天我们主要讨论一下后者。


首先大家可以参见巴士内的一篇文章http://www.apkbus.com/android-44580-1-1.html
这里借用一下该帖子里的图…管理员大人原谅哈..
借用该帖子的话说:
为了初始化Application必须实现ApplicationListener这个接口, 它用来更新游戏状态(即逻辑),渲染出项,暂停游戏,保存状态,释放资源等。
它也有一个处理Application 声明周期事件的地方。每个应用,不管后台平台版本都必须实现ApplicationListener 接口。所有平台都会存在并要实现这个接口。



一个简单的实现如下:
  1. public class MyGame implements ApplicationListener {
  2.         public void create () {
  3.                 // STUB
  4.         }

  5.         public void render () {
  6.                 // STUB
  7.         }

  8.         public void resize (int width, int height) {
  9.                 // STUB
  10.         }

  11.         public void pause () {
  12.                 // STUB
  13.         }

  14.         public void resume () {
  15.                 // STUB
  16.         }

  17.         public void dispose () {
  18.                 // STUB
  19.         }
复制代码
[/url]


我简单地画一个图来表示目前我们按照第一讲最后介绍的步骤写出的框架。

[/url]
    很容易看出AndriodApplication(正如前面我提到的那样,继承自Activity,没错,就是我们非常熟悉的Activity)起到了一个Activity的作用,但是我们并不在这个“Activity”中做太多的工作(当然可以做一些保存Context上下文之类的工作),实际的显示工作我们是交给一个实现了ApplicationListener接口的类来实现的,它有所有我们需要的功能:创建,渲染等等。所以实际的情况是,我们在游戏中的大部分实际绘图工作都是放在这个页面进行的。


下面我们将要在上一讲中的基础上,在屏幕上打印一些标识,毕竟眼见为实嘛!(今天的源码会在帖子末尾附上,大家可以下载哦!)
我们先打印出一行字: "Testin—Mkey libgdx(2)"
  1. public class MyGame implements ApplicationListener {
  2.         SpriteBatch batch;
  3.         BitmapFont bf;
  4.         public void create () {
  5.                 // STUB
  6.                 batch=new SpriteBatch();
  7.                 bf=new BitmapFont();
  8.         }

  9.         public void render () {
  10.                 // STUB
  11.                 Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  12.                     Gdx.gl.glClearColor(0f,0f,0f,0f);
  13.                 batch.begin();
  14.                 bf.draw(batch, "Testin——Mkey libgdx(2)",Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);
  15.                 batch.end();
  16.         }

  17.         public void resize (int width, int height) {
  18.                 // STUB
  19.         }

  20.         public void pause () {
  21.                 // STUB
  22.         }

  23.         public void resume () {
  24.                 // STUB
  25.         }

  26.         public void dispose () {
  27.                 // STUB
  28.                 batch.dispose();
  29.                 bf.dispose();
  30.         }
  31. }
复制代码
             首先记得在create()函数中初始化一下相应的变量,否则会得到空指针。绘图用SpriteBatch,以及字体类BitmapFont,至于后者,我们很显然可以从名字就看出,它的实现是借助图片来实现字体的显示的,那么具体又是怎么一回事呢?我们在后面的教程中都会提到,给大家详细地解答。

            这里还有非常重要的一点,就是绘图用SpriteBatch在绘图前一定要调用begin()方法,而在调用后一定要调用end()方法,否则程序都会报错。原因也是很显然的。
一旦ApplicationListener开始运行,render函数就会不停执行,里面的语句也一样被不停地执行,这里对
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            Gdx.gl.glClearColor(0f,0f,0f,0f);

            这两条语句做一个简单的解释。稍微熟悉一点opengl的人都能看出来,这是一个
清屏的函数,清除了颜色缓存,并把刷新后的屏幕的颜色置为(0,0,0,0),也就是黑色,如果(1,1,1,0)那么就是白色了。

          还有一个地方可以会引起大家的疑问,Gdx.graphics.getWidth()/2。其实很简单,这就是Gdx提供的一些类来获取系统信息。关于Gdx中众多用法不久就会提到。



        另外,在dispose()函数中不要忘了对变量执行dispose()方法,在libgdx中,很多资源必须手动释放,否则将一直占用着内存,很可能就此发生OOM(OutOfMemory)的错误,而libgdx中有一个结构Disposable,一般实现了这个接口的类都是需要手动回收的,我们可以查看一下官方的文档,发现libgdx中众多常用的类:AssetManager, BitmapFont, BitmapFontCache, CameraGroupStrategy, DecalBatch, ETC1.ETC1Data, FrameBuffer, Gdx2DPixmap, IndexArray, IndexBufferObject,IndexBufferObjectSubData, MD5Renderer, Mesh, ParticleEffect, ParticleEffectPool.PooledEffect, Pixmap, PixmapPacker, ShaderProgram, SimpleTileAtlas, Skin, SpriteBatch,SpriteCache, Stage, Texture, TextureAtlas, TileAtlas, TileMapRenderer, VertexArray, VertexBufferObject, VertexBufferObjectSubData, World都是需要手动回收的,因此一定不要忘记手动回收,Android设备的内存十分有限!
我们运行一下吧:

[url=http://www.apkbus.com/data/attachment/album/201208/18/104416tkhji1b5nhxv9zlk.png][/url]
(里面有一个“—”号没有显示,这是BitmapFont的问题,以后会提到如何解决)

        可是不知道大家有没有发现一个问题,就是我们的程序目前只有一个页面,难道我们所有的绘图工作都在一个页面做吗?或者我们切换页面的时候还是要用API的 Intent来切换?当然不是这样的,下一讲,也就是第三讲,我们将一起来看一下如何编写一个多个屏幕或者说是多个游戏容器的application,当然我们不是用API的intent来实现的哦。


        这里还要补充一点:屏幕坐标的原点是从左下角开始计算的,这个和一般的情况不太一样,请大家注意一下。


源码地址:




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

本帖子中包含更多资源

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

x
君见一叶舟,出没风波里

2826

主题

7684

帖子

9586

安币

管理员

Rank: 9Rank: 9Rank: 9

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

QQ
发表于 2012-7-3 10:10:56 | 显示全部楼层
哈哈,不错哈,根据我得到的内幕消息,此文章写了三个小时哦。。!!!{:soso_e179:}

94

主题

173

帖子

4182

安币

码皇(巴士元老)

Rank: 8Rank: 8

QQ达人最佳新人

QQ
发表于 2012-7-3 10:39:20 | 显示全部楼层
顶.......
征求大家意见... 以下网站想换一个风格. 原网站 : http://do.jhost.cn/lanyuan/index/index.do 新网站风格 : http://do.jhost.cn/lanyuan 打开比较慢.那个好 ...

9

主题

72

帖子

109

安币

程序猿

Rank: 2

发表于 2012-7-3 10:46:12 | 显示全部楼层
好东西就要学习!!{:Cupcake:}

0

主题

30

帖子

31

安币

程序猿

Rank: 2

QQ达人

发表于 2012-7-4 11:23:24 | 显示全部楼层
{:Skateboard:}

0

主题

27

帖子

5

安币

初级码农

Rank: 1

发表于 2012-7-4 13:27:50 | 显示全部楼层
学习一下

0

主题

10

帖子

51

安币

程序猿

Android RD/MD

Rank: 2

发表于 2012-7-4 13:32:32 | 显示全部楼层
这种激情燃烧的时刻,果然要看后文啊

0

主题

12

帖子

66

安币

程序猿

Rank: 2

QQ达人

发表于 2012-7-4 16:43:57 | 显示全部楼层
太牛逼了  膜拜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

扫一扫关注我们

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