为了初始化Application必须实现ApplicationListener这个接口,它用来更新游戏状态(即逻辑),渲染出项,暂停游戏,保存状态,释放资源等。
它也有一个处理Application声明周期事件的地方。每个应用,不管后台平台版本都必须实现ApplicationListener接口。所有平台都会存在并要实现这个接口。
一个简单的实现如下:
- public class MyGame implements ApplicationListener {
- public void create () {
- // STUB
- }
- public void render () {
- // STUB
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- }
复制代码
我简单地画一个图来表示目前我们按照第一讲最后介绍的步骤写出的框架。
很容易看出AndriodApplication(正如前面我提到的那样,继承自Activity,没错,就是我们非常熟悉的Activity)起到了一个Activity的作用,但是我们并不在这个“Activity”中做太多的工作(当然可以做一些保存Context上下文之类的工作),实际的显示工作我们是交给一个实现了ApplicationListener接口的类来实现的,它有所有我们需要的功能:创建,渲染等等。所以实际的情况是,我们在游戏中的大部分实际绘图工作都是放在这个页面进行的。
下面我们将要在上一讲中的基础上,在屏幕上打印一些标识,毕竟眼见为实嘛!(今天的源码会在帖子末尾附上,大家可以下载哦!)
有关这部分更细节的内容可以参见管理员的帖子http://www.apkbus.com/forum.php?mod=viewthread&tid=5345&reltid=44505&pre_thread_id=0&pre_pos=3&ext=
我们先打印出一行字: "Testin—Mkey libgdx(2)"
- public class MyGame implements ApplicationListener {
- SpriteBatch batch;
- BitmapFont bf;
- public void create () {
- // STUB
- batch=new SpriteBatch();
- bf=new BitmapFont();
- }
- public void render () {
- // STUB
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- Gdx.gl.glClearColor(0f,0f,0f,0f);
- batch.begin();
- bf.draw(batch, "Testin——Mkey libgdx(2)",Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);
- batch.end();
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- batch.dispose();
- bf.dispose();
- }
- }
复制代码
首先记得在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设备的内存十分有限!
我们运行一下吧: