86590493 2013-09-09
英文原文地址:https://code.google.com/p/libgdx/wiki/Application
引用本文请注明来源:http://yhz61010.iteye.com/blog/1939613
什么是Back-ends
Libgdx将不同平台的差异进行了抽象,将它们抽象成一个接口集。对于每一个libgdx支持的平台,我们统一将它叫做back-end,因为它们都实现了这些接口的。作为一个开发者,我们并不关心back-ends,但我们需要关心的这些接口。
Libgdx目前支持4种back-ends:
1.Lwjgl(LightweightJavaGameLibrary):基于轻量级Java游戏库,使用JNI实现的平台相关的窗口工具包,OpenGL和OpenAL及其它一些功能。该back-end运行于Windows,Linux和MacOSX,并提供了Javarun-time,及支持OpenGL1.5+的显卡。
2.Jogl(JavaBindingsforOpenGL):基于Jogl1.1另一个使用JNI实现的OpenGL和SWing,及LWJGL实现的OpenAL。它依然用于Windows,Linux和MacOSX平台。Lwjglback-end是现在的首选,因为它更加稳定,特别是对于那些全屏的应用。
3.Android:基于AndroidAPI。
4.HTML5:基于GWT,SoundManager2以及基于Quake2GWTport的更新后的GWTWebGL和LocalStorage。该back-end会将Java代码编译成纯JavaScript代码,可以运行于Chrome,Safari,Firefox和最新版Opera以及任何支持WebGL的浏览器。由于原生的GWT和JavaScript的问题,使用该back-end时会有一些限制,详细信息可以查看如下地址:https://github.com/libgdx/libgdx/tree/master/backends/gdx-backends-gwt/issues.txt
模块
模块是libgdx的核心,它由五个接口组成,用于和操作系统的交互。每一个back-end都实现了这些接口。
唯一需要写的关于平台相关的代码,我们管它叫做“起始类(StarterClasses)”。对于每一个平台,我们需要使用一小段代码来实现back-end提供的Application的一个接口。以桌面程序为例,需要写的Lwjglback-end的代码如下:
public class DesktopStarter { public static void main(String[] argv) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGame(), config); } }
对于Android系统,对应的起始类(StarterClass)可能会像下面这样:
public class AndroidStarter extends AndroidApplication { public void onCreate(Bundle bundle) { super.onCreate(bundle); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); initialize(new MyGame(), config); } }
上述两个类,通过被放在各自的项目的。如,桌面程序项目使用第一个起始类,Android项目使用第二个起始类。关于如何新建项目及它们在Eclipse中的配置,请参见如下地址:https://code.google.com/p/libgdx/wiki/ProjectSetupNew
那么,一个游戏真正的代码通过被放在一个实现了ApplicationListener的类中。然后将该类的实例分别传给不同的back-end的Application接口实现的初始化方法(例如上面两段代码例)。在恰当的时候,应用程序会调用ApplicationListener中的相应方法(详细内容,请参见“生命周期”https://code.google.com/p/libgdx/wiki/ApplicationLifeCycle)。
访问模块
可以通过Gdx类的静态字段来访问先前提到的模块。这些基础的静态字段是一组全局变量,允许我们很容易的访问任何ligbdx模块。但是,在通常情况下,对于编程来说,使用全局变量通常是一种不好的作法,但是libgdx依然选择使用这种机制来减轻在引用上的传值所带来的痛苦。我们在使用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可以访问文件接口等。
附录
Libgdx生命周期图