本节书摘来异步社区《libGDX移动游戏开发从入门到精通》一书中的第2章,第2.2节,作者: 黄俊东 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.2 模块
libGDX这个游戏引擎的有一个特点就是架构清晰、组成模块化。那么现在我们就来学习一下libGDX这个游戏都由哪些模块组成,这些模块分别对外提供什么功能。
2.2.1 libGDX模块组成的图示
libGDX由数个模块组成,它们分别为一个游戏的各个步骤提供了服务与支持。这些主要模块在一个游戏中的典型架构如图2.7所示。
由图2.7可以看出,libGDX主要由Input、Files、Graphics、Audio这几个模块组成,以及图2.7中没有显示出来的Net模块。它们分别对应了libGDX中的输入操作、文件操作、2D/3D等图形绘制、音频操作及网络操作。
这些可以在源码中体现出来。打开Gdx的源码,可以看到,Gdx这个类中简单到只有数个成员变量,这些成员变量在libGDX中分别负责一个模块。例如audio负责音频模块。
public class Gdx {
public static Application app;//提供了众多方便的方法
public static Graphics graphics;//图形渲染模块
public static Audio audio;//音频模块
public static Input input;//输入模块
public static Files files;//文件模块
public static Net net;//网络模块
public static GLCommon gl;
public static GL10 gl10;
public static GL11 gl11;
public static GL20 gl20;
public static GLU glu;
}
以上所涉及的各个模块都会在以后的相应章节展开讲解。
2.2.2 libGDX模块的分析
通过2.2.1小节,我们对libGDX的模块组成有了一个大体的了解,这一小节来分析libGDX中几个主要模块的作用。
1.Application:在这个接口中提供了很多方便的方法。包括获取程序目前运行环境、目前程序所占用的内存大小等。
2.Graphics:利用OpenGL ES 将图片绘制到屏幕上。它抽象了与GPU之间的通信,并且提供了方便的方法去获取一个OpenGL ES的封装实例。而这个封装的实例可不可用取决于底层硬件是否支持。如果底层硬件不支持,那么返回来的实例将会是null值。例如,可以通过以下代码获取一个OpenGL 2.0的实例。
GL20 gl = Gdx.graphics.getGL20 ();
这个方法会返回一个实例,使用这个实例就可以将图片绘画到屏幕上。但是,如果底层硬件不支持,那么返回来的值会是null。
当获取到一个OpenGL ES的实例以后,可以使用这个实例去完成一定的事情,如清屏:
gl.glClearColor(1f, 0.0f, 0.0f, 1);
gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
3.Audio:为各个平台音频文件的提供了一种统一、方便的操作。它通过Sound、Music来操作音频文件。支持的音频文件的格式有:WAV、MP3和OGG。
以下代码演示了怎么通过Audio去操作音频文件:
//利用音频文件生成一个Music类的实例
Music music = Gdx.audio.newMusic(Gdx.files.getFileHandle("data/myMusicFile.mp3", FileType.Internal));
music.setVolume(0.5f);//设置音量的大小
music.play();//开始播放音乐
music.setLooping(true);//将音乐设置成不断循环
4.Input:用于处理输入操作。libGDX通过Input为各个平台(如Android、IOS、Desktop)提供统一的输入模型和处理机制。它支持键盘输入、单击屏幕、加速度传感器以及鼠标(对Desktop来说)。
举例:以下代码就是通过Input模块来获取当前单击的位置。
if (Gdx.input.isTouched()) {//如果监听到单击事件
System.out.println("刚刚单击的位置的横坐标是 x=" +Gdx.input.getX() + ",纵坐标是 y=" + Gdx.input.getY());
}
5.Files:文件操作。为各个平台提供了一种统一、简单的文件读写的方式,而不用去处理各种平台之间的差异。它让开发者可以更简单地去读写文件。但是出于平台的安全性的考虑,它在“写”操作上也有一定的限制。
以下代码演示了使用Files模块提供的功能,利用一个assets目录下的图片资源文件来生成一个Texture类的实例:
Texture myTexture = new Texture(Gdx.files.internal(“assets/texture/brick.png”));
6.Networking:给游戏提供基本的网络支持。在一段时间内,libGDX更多地适用于弱联网游戏。但现在libGDX对网络方面已经提供了越来越多的支持。