AndEngine
在介绍AndEngine前,先给大家介绍几款Android游戏引擎:
· Angle 敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。
最低运行环境要求不详。
· Rokon 基于OpenGL ES技术开发,物理引擎为Box2D,因此能够实现一些较为复杂的物理效果.此引擎最大的优点在于其开发文档相当之完备,并且项目作者对反馈Bug的修正非常之神速.
但是,堆兼容性问题太多,需要花费相当大的精力去解决。
最低运行环境要求为Android 1.5。
· LGame LGame是一款国人开发的Java游戏引擎,有Android及PC(J2SE)两个开发版本。其底层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本间主要代码能够相互移植.唯一遗憾的是,该项目作者是个极其懒惰的家伙,开发文档从去年说到今年依旧没有提供,只有游戏示例可供下载。
最低运行环境要求为Android 1.1。
· libgdx libgdx是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D游戏开发,物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的 Android游戏引擎,但缺陷在于精灵类等相关组件在使用上不够简化,而且文档也较为匮乏。
最低运行环境要求不详。
1. AndEngine简介
AndEngine是一款以OpenGLES方式进行画面渲染的2D游戏引擎,可以运行在支持Android 1.6及以上版本的系统当中。应该说, AndEngine拥有较多的游戏组件与扩展功能, 它在默认情况下已经可以支持中文,采用屏幕坐标系绘也更符合一般Android绘图习惯。该引擎虽然性能普通,文档缺乏,但示例较为丰富. 所以,您是否选择AndEngine引擎,还是应该从实际出发,多做真机测试才好下决定。
2. Get theSource Code from GoogleCode
如果我们使用的是Eclipse,使用Mercurial插件获取:
(Help → Software Updates in Eclipse, then install:http://cbes.javaforge.com/update).
- Go toFile->Import->Mercurial->Clone Existing Mercurial Repository
- In the RepositoryLocation URL box type in: https://code.google.com/p/andengine/
- Hit next. It should startcloning the repository...
- Then select the 'default' branch and hit next.
我们在使用源码的时候,我们可以直接link source ,也可以将源码打包成.jar后使用。
3. AndEngine原理
解读AndEngine源码后我们可以发现,AndEngine除了采取低耦合、高内聚的框架策略细分引擎模块,使用OpenGLES进行游戏渲染之外;
该引擎还以双线程方式分别驱动绘图与事务更新,事实上,它将游戏画面和游戏业务分为两组逻辑,并行跑在同级的互斥线程当中。
或许是考虑到持续双线程运行电量消耗较大的缘故,AndEngine默认情况下要求用户启动PowerManage进行电源管理,故此需要<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>权限支持,否则初始化时Log会提示缺少相关配置,并建议在AndroidManifest.xml中添加权限。
PS:无此权限不影响运行,只会在Log有警告信息,并且耗电较快。
3.1 AndEngine的基本运行流程:
由于AndEngine是专供Android使用的2D游戏引擎,所以作为启动类的Activity肯定必不可少,而AndEngine也理所应当的提供给我们这样一个Activity,那就是BaseGameActivity。
一个标准的AndEngine应用,至少应该对BaseGameActivity做继承:
其中四个必须被重载函数的启动顺序如下:
onLoadEngine->onLoadResources->onLoadScene->onLoadComplete
具体的讲,AndEngine会首先加载Engine类实例通知系统游戏引擎的基本运行方式,而后加载游戏资源,其次加载游戏场景实例,最后通过onLoadComplete通知用户加载完毕并于此进行善后工作。
此外,由于BaseGameActivity类重载了父类Activity的onResume与onPause函数以保证其自身的正常运行,所以不建议在继承BaseGameActivity时再次重载上述函数(重载的话不要忘记super调用),推荐直接重载AndEngine提供的onGamePaused和onGameResumed实现同等功能。
4. AndEngine中的常用功能及模块:
由于AndEngine包的下属类较多,并且细分也较为庞杂, 一次性介绍完毕需要相当长的时间,所以 AndEngine的一些核心模块及功能进行一些说明 。
4.1 BaseGameActivity
如果我们想正常使用AndEngine,那么当前Activity就必须继承自BaseGameActivity或其子类,否则连初始化Engine也做不到。虽然它还有父类BaseActivity,但BaseActivity只提供了一些异步加载方法而无关AndEngine的主体实现。
4.2 Engine
Engine是AndEngine的核心所在,它对AndEngine引擎中Camera、Scene等重要组件进行了统一管理,但必须和BaseGameActivity合作使用,利用EngineOptions类可以对其进行必要的参数配置。
public Engine onLoadEngine() {
// 构建摄像机
this.andCamera = new Camera(0, 0,CAMERA_WIDTH, CAMERA_HEIGHT);
// 构建Engine,全屏显示,手机方向为竖屏,按比例拉伸
return new Engine(new EngineOptions(true,ScreenOrientation.PORTRAIT,
newRatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),
this.andCamera));
}
4.3 Camera
该类即我们常说的游戏摄像机,在AndEngine的Camera有两种作用,一是用以调节屏幕的显示区域,二是利用HUD类实际绘制游戏屏幕于手机之上。
4.4 Texture, TextureRegion , TextureRegionFactory,TextureOptions
Texture:作为承载纹理的实体对象.
TextureRegion:让系统知道如何剪切一个纹理,并返回一个这样的纹理.
TextureRegionFactory:决定纹理的加载路径
TextureOptions:类决定了纹理的渲染方式.
mTexture = new Texture (256, 256, TextureOptions.BILINEAR);
ballTtextureTegion = TextureRegionFactory.createFromAsset(this.mTexture, this, "ball.png", 0, 0);//ball.png is 128x128
arrowLeftTextureRegion = TextureRegionFactory.createFromAsset(this.mTexture, this, "arrowleft.png", 0, 129);//120x60
arrowRightTextureRegion = TextureRegionFactory.createFromAsset(this.mTexture, this, "arrowright.png", 129, 0);//120x60
4.5 Scene
场景容器,能够将某一特定场景作为游戏模块进行调用,我们可以利用它来切换当前游戏的画面与触摸屏监听,切换方法是利用Engine.setScene.
4.6 Sprite
精灵类,是一个大家耳熟能详,并且任何游戏引擎无法回避的关键性组件之一,它常常被用来表示一个游戏中角色或者特定画面要素。
4.7 Timer Handler
Timer Handler 允许我们的游戏在一个确定的时间后,执行一个特定的动作.当我们注册了Time Handler后,特殊的时间一旦到达,它将会执行一次回调。
this.getEngine().registerUpdateHandler(TimerHandler spriteTimerHandler
= newTimerHandler(mTimeDelay, new ITimerCallback()
{
@Override
public void onTimePassed(final TimerHandler pTimerHandler)
{
}
}));
4.8 Update Handler
创建Update Handler,可以在Engine或Scene内登记,以便在AndEngine运行时,进行实时更新!这可以非常的强大,让你运行某些任务,而无需重写onManagedUpdate()函数在一个自定义类的每一个更新。
this.scene.registerUpdateHandler(newIUpdateHandler()
{
@Override
public void onUpdate(floatpSecondsElapsed) {
// TODO Auto-generated methodstub
//Your code to run here!
}
}
4.9 Sprites/Objects – Listeners
private voidcreateSprite()
{
final Scene scene =this.mEngine.getScene();
final Sprite sprite = new Sprite(100, 100, mYourSpritesTextureRegion)
{
@Override
public boolean onAreaTouched(TouchEventpSceneTouchEvent,
float pTouchAreaLocalX, float pTouchAreaLocalY)
{
}
};
scene.registerTouchArea(sprite);
scene.getTopLayer().addEntity(sprite);
}