【Android LibGDX游戏引擎开发教程】第03期:示例代码详细讲解

      

      承接了上一篇文章中关于环境搭建的简单示例,这一篇我会详细讲解FirstGame和HelloGameActivity类中的代码。

 

一、ApplicationListener接口详解

 

1、简单代码示例,FirstGame.java:

package com.example.hellolibgdx;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class FirstGame implements ApplicationListener {
	// 绘图用的SpriteBatch
	private SpriteBatch batch;

	@Override
	public void create() {
		// 实例化
		batch = new SpriteBatch(); 
	}

	@Override
	public void render() {
		// 清屏
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
		Gdx.gl.glClearColor(0f,0f,0f,0f);

		batch.begin();

		batch.end();

	}

	@Override
	public void resize(int arg0, int arg1) {

	}

	@Override
	public void pause() {

	}
	
	@Override
	public void resume() {

	}

	@Override
	public void dispose() {
		 batch.dispose();
	}	

}

 


       我们可以看到,FirstGame类继承自ApplicationListener接口,为了初始化Application必须要实现

ApplicationListener这个接口,那么这个接口到底有什么用呢?

       实现了这个接口的类都有一个共同的特点,它们都会经历一个创建(create)渲染(render)、暂停

(pause)、继续(resume)、销毁(dispose)等一系列过程,发生对应时间的时候会自用调用相应的函

数。特别是render()函数,它是一个系统在不停调用的函数(当然这个实例满足正在运行的条件),因此我们

可以把很多操作放在render()函数中实现,不过千万注意不要进行耗时的操作以免堵塞UI线程。

 

2、我们来观察一下ApplicationListener接口的生命周期,如下图所示:



3、再来看看每个方法的作用,如下图所示:

 

4、看完了生命周期图和每一个方法的作用,那么我们再来分析一下上面的代码:

 

<1> 首先我们要记得在create()方法中初始化一下相应的变量,否则会得到空指针;

 

<2>render()方法中有一个非常重要的地方,就是绘图用SpriteBatch在绘图前一定要调用begin()方法,而在调用

一定要调用end()方法。否则程序都会报错,为什么要这么做呢?

     原因也是很显然的,一旦ApplicationListener开始运行,render()方法就会不停执行,里面的语句也一样被不停地执行;

 

<3>

Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
		Gdx.gl.glClearColor(0f,0f,0f,0f);       
      
         简单解释一下这两行代码,稍微熟悉一点openGL的人都能看出来,这是一个 清屏的函数,清除了颜色缓存,并
把刷新后的屏幕的颜色置为黑色(0,0,0,0),如果想要白色那就是(1,1,1,0);
 
<4> 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设备的内存是十分有限的!


 

二、AndroidApplication类详解

 

1、程序的入口类,HelloGameActivity.java:

package com.example.hellolibgdx;

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;

public class HelloGameActivity extends AndroidApplication {
	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		initialize(new FirstGame(), false);

	}

}


 

2、我们查询官方的文档,可以看到,如下图所示:


       

        我们可以很清楚的看到AndroidApplication类继承自API中的Activity,因此我们使用它也需要在

AndroidManifest.xml清单资源文件中去注册它,既然AndroidApplication继承自Activity,那么是不是可

以像其他Activity一样使用Intent进行跳转呢?答案是肯定的,不过事情也并没有这么简单,我会在后面的文

跟大家讨论这个问题。

3、  

initialize(new FirstGame(), false);


至于这条语句,在这里跟大家解释一下,这是启动libgdx的一个必备的条件,不执行该语句libgdx就无法启动,

 <1> 第一个参数是一个实现了ApplicationApplication接口的类的实例;

 <2> 第二个参数如果设为true,则在opengl 2.0可用的情况下会使用opengl 2.0。

        

       这就已经完成了libgdx程序的编写了,当然源码中需要加入的各种Jar包,这里就不赘述了,不清楚的同学可以

参考前两篇的文章。       

    

三、运行的效果图

 

因为没有写实际的东西,所以显示出的效果就是一个黑色的背景        

 

            好的,整个这一章的内容到这里就结束了,下一篇会更加精彩,不容错过,谢谢支持!

 

源码下载地址(源码与教程中演示代码稍微不符,请参照教程简单的改动即可)

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值