1 前言
最近想做点小应用,但界面方面是非常不在行,自然想借助游戏引擎来处理这部分工作。本打算在flex中找一个比较好的,但找到pushbutton的时候发现官方主页留下的只有goodbye的页面,留言的意思就是现在大家都去玩mobile了,他们放弃了这个引擎的开发。看到这里心一凉,感觉还是做mobile的应用更有前途,之后又去找了一下android开发的图像引擎,反复比较后感觉libgdx貌似不错,今天研究了一天感觉非常棒,相信借助它能做出不错的应用。
2 什么是libgdx
这个类库是由badlogic开发,封装了opengl es和box2d的引擎,能够让应用在windows、linux、android上运行。另外值得称道的是作者对这个类库维护的非常频繁,相信后期发展会更快。还有一个不得不提的,这个作者就是开发Rokon的人,但目前他全力在做libgdx,Rokon已经两年没更新了。
作者自称这是一个框架,而不是一个引擎,因为他只封装了底层的东西,上层有些组件还需要自己开发。但我个人感觉封装的程度挺好的,常用的都有了,整个框架非常简洁,源码很容易读。
官方地址:http://code.google.com/p/libgdx/
3 学习之旅
3.1 环境搭建
由于是纯java环境,搭建起来和普通工程一样,官方给的介绍也是无比详细,这里不再赘述。project setup地址:http://code.google.com/p/libgdx/wiki/ProjectSetup
3.2 其他准备工作
千万别忽略这一部分,这些工作对日后的学习开发非常有帮助。
注:以下安装是libgdx0.9.3版本的时候需要这么弄,目前0.9.8版本直接去下载libgdx的工程,这些工具包都附带了,比之前方便多了。
1. (重要)下载libgdx的源码及其相关test、demo,由于是开源的,可以轻松获取到这些宝贵资源,源码清晰易读。svn地址:http://libgdx.googlecode.com/svn/trunk/,git地址:https://github.com/oxygene/libgdx.git
2. (重要)下载gdx的依赖工程tablelayout,svn地址:http://table-layout.googlecode.com/svn/trunk
3. TiledMap地图编辑工具,主页地址:http://www.mapeditor.org/
4. Texture Pack GUI纹理打包生成工具,主页地址:http://code.google.com/p/libgdx-texturepacker-gui/
5. Hiero字库编辑工具,下载地址:http://code.google.com/p/libgdx/downloads/detail?name=hiero.jar&can=2&q=
6. 如果是想在android上开发,还需要下载eclipse的adt插件和android sdk。
3.3 基本概念
由于自己之前从来没做过类似的东西,有些东西没有多少概念,对学习速度造成了不小的影响,花了一整天才做出个能控制人物走动的demo...
texture(纹理):一个图片从原始格式解码并上传到GPU就被称为纹理。为了绘制texture,常常使用几何来描述,通过几何对应的顶点来描述纹理。比如要描述一个矩形,可以通过描述每个顶点来描述矩形。要绘图时,首先要绑定纹理,然后传递一个几何描述给OpenGL进行绘制。而绘图的大小和位置由几何描述和OpenGL的viewport的设置共同决定。
(摘自:http://www.cnblogs.com/htynkn/archive/2011/11/10/libgdx_2.html)
actor(表演者):这个东西的概念和flash中的元件是很类似的,就是一个对象,可以对其定义属性方法,做一些特定的控制。
stage(舞台):就是让actor进行活动的地方,这里面主要包含三个元素,一是actor,当然舞台上可以有很多actor,二是Camera,他可以将舞台的画面放缩、旋转,三是SpriteBatch,这个不太好形容,他就是把要绘制的内容批量送给GPU来绘制,并同时收集下一个画面要绘制的信息。
各元素的关系:最上层的容器是Application,它就是控制整个应用是在android还是windows上运行的;第二层的Game是用来管理多个Screen的代理类,可以保持一个是显示的,其他隐藏;场景下有着若干舞台,舞台之中是演员。舞台中一个actor又可以包括多个actor,这个actor就是group,下图这个意思没画出来。
应用的生命周期:
3.4 功能简析
这个系统设计真的很容易看懂,从类库角度大概说一下。要深入学习的话,应该把opengl和box2d的原理再仔细看看。
assets:资源管理的类,主要负责加载相关工作。
audio:音频管理类,主要有Music和Sound,区别是Music是按流方式加载,适合大文件,Sound是直接全部加载,适合反复播放。
files:文件操作封装的工具类。
graphics:主要是对opengl的封装,实现了绘图相关的工作,比如Texture、Camera、Color、Mesh、TiledMap、NinePatch。
input:界面输入的事件,其中对于android有手势事件,比如长按、拖拽。
math:主要是图形计算,比如矩阵、向量、矩形之类的操作。
physics.box2d:box2d的封装类,还没仔细看,能实现物理效果,比如重力、反弹(box2d就是物理引擎,这是必然的功能...)。
scene2d:这个是二维图像控制的核心类,Actor、Stage、Interpolator(插值,用于控制动画播放速度)等重要的控制都在这里面。主要有三个功能,一是Action动画,控制Actor来移动、旋转、缩放之类的,二是Interpolator来控制动画播放,可以加速、减速,三是ui组件,但目前实现的比较少,有常见的Button、Image、CheckBox、Label、ScrollPane等。
3.5 第一个demo
对整体东西有了了解,当然要动手做个demo才能有更好的理解 。我做了一个特别简单的demo,就是点击小人前后位置,小人可以在地图上前后行走。由于附件限制大小,所以把libs下的gdx.jar和gdx-backend-jogl.jar给去掉了,需要运行请自行添加。
注意,附件在博客的最下面,找不到就对当前页面搜索“基于libgdx的demo”。
3.6 让demo以applet运行
由于眼下要做的一个东西是必须放到网页中的,自然要研究一下如何以applet方式运行。官方给了一篇介绍(见参考资料4)比较详细,但是自己动手做的时候发现了一些问题,简单补充一下。
1. 用官方介绍做完所有的工作,但是我本地依然运行不起来。我是把程序当作一个正常的web程序运行的,所有的jar都是放在lib下(就是那个blog里面所指的applet目录)。
2. 打开java console,就是你java安装目录的jre/bin/ConsolePanel,windows下会自动在右下的任务栏里面有图标,打开控制台就能方便的查看报错。建议把Advanced里面的debugging参数全部打开,能看到详细的运行过程。
3. 发现找不到相应的jar,下载路径直接是根目录,应该是index.html页面中声明codebase路径的问题,把jar直接拷贝到web工程的根目录下就可以运行了,当然实际运行要调整到一个合适的目录。
4. 比较奇怪的是自己的程序对于客户端没有安装环境的并没有提示,这可以让其到http://java.sun.com/applets/jdk/1.4/index.html页面去随便访问一个applet demo,这个可以正常运行,再回来看自己的页面就可以了。
5. 另外,对于官方所说在linux下运行需要调整的问题,我看了一下,就是不能用openjdk的环境。但是发现firefox比较奇怪,偏要自动加载openjdk的icetea,最后所在ubuntu下chrome跑起来的。
4 总结
我真有一种找到金矿的感觉,libgdx对于java开发人员来说太容易上手了,做一些桌面和手机应用来说真的是非常方便,也将其转化成为applet来放到网页中。这个类库开发也很积极,相信不久就会成为java桌面应用开发人员的必备利器。
参考资料:
1. 官方tutorials:http://code.google.com/p/libgdx/wiki/ProjectSetup
2. 强烈推荐一个国人写的blog,深入浅出:http://www.cnblogs.com/htynkn/
3. 很不错的国内游戏素材站点:http://www.66rpg.com/
4. 如何让你的程序以applet运行:http://www.thesecretpie.com/2011/05/being-like-minecraft-or-how-to-run-your.html