应用框架
模块
Libgdx包含五个核心接口与操作系统交互,各自实现了如下接口:
- Application:运行应用,向client通知应用层事件,例如窗口大小的改变(window resizing)。提供log功能与关于诸如内存使用情况的查询的方法。
- Files:访问运行平台的文件系统。提供不同平台下文件访问的抽象,不与JAVA的文件类交互。
- Input:向client通知用户输入,例如键鼠操作、触摸或加速度传感器事件。支持轮询检测和时间驱动的处理方式。
- Net:提供跨平台的通过HTTP/HTTPS协议访问资源的方式,以及创建服务器与客户端的TCP连接。
- Audio:提供播放声音与音乐流的方式,以及直接访问PCM音频输入输出设备。
- Graphics:封装OpenGL ES 2.0的功能,允许查询/设置视频模式与类似的东西。
启动类(Starter Classes)
这是需要写的唯一平台相关的代码,称为starter classes。对每个目标平台,仅需一小段代码即可实例化一个应用接口的具体实现。例如对于Desktop平台,看起来会像是这样:(使用Lwjgl后端)
public class DesktopStarter { public static void main(String[] argv) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGame(), config); } }
对Android平台,会是这样:
public class AndroidStarter extends AndroidApplication { public void onCreate(Bundle bundle) { super.onCreate(bundle); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); initialize(new MyGame(), config); } }
这两个类通常存在于单独的工程中,例如一个Desktop工程和一个Android工程。
而应用的实际代码写在实现了 ApplicationListener 接口的类中(在上面例子中的 MyGame )。这个类的实例被传入各个平台的应用后端实现的初始化方法中(如上)。应用会在合适的时机调用 ApplicationListener 的方法。
访问模块
之前提到的模块可以通过Gdx类的静态字段来访问。这本质上是一系列的全局变量,可以用来方便地访问libgdx的任意模块。虽然看起来是比较糟糕的代码风格,但我们还是决定这么使用,因为这样可以避免频繁地把常用的东西传来传去的。何况到处都有这些东西。
例如,为了访问音频模块,可以简单地这么写:
// creates a new AudioDevice to which 16-bit PCM samples can be written AudioDevice audioDevice = Gdx.audio.newAudioDevice(44100, false);
Gdx.audio 是对后端实现的一个引用,它在应用启动时就被初始化了。其他模块也是用同样的方式访问的,例如 Gdx.app 用来获得Application本身, Gdx.files 用来访问文件等等。