[Android引擎]Android游戏框架AndE…

这篇文章写的非常好。收藏+向原作者致敬 [Android引擎]Android游戏框架AndEngine使用入门[ZT]

项目站点:http://www.andengine.org 

项目地址:http://code.google.com/p/andengine 

示例地址:http://code.google.com/p/andengineexamples 

PS:本文中使用的AndEngine源码为2011年3月3日获得。
 

AndEngine是一款以OpenGLES方式进行画面渲染的2D游戏引擎,可以运行在支持Android 1.6及以上版本的系统当中。应该说,相较前文介绍的Libgdx引擎,AndEngine拥有更多的游戏组件与扩展功能。并且与Libgdx不同,它在默认情况下已经可以支持中文,采用屏幕坐标系绘也更符合一般Android绘图习惯。

然而,有其利也必有其弊,AndEngine作为游戏引擎虽然在功能上较Libgdx更为丰富也更人性化,但相比Libgdx的绘图渲染机能却逊色不少(粗读源码可以发现,Libgdx有较为完善的OpenGLES环境适应性,而AndEngine在这方面的投入明显不足)。事实上,市井也一直有流言说AndEngine引擎在不同手机机型上的表现并不稳定(详见:http://www.badlogicgames.com/wordpress/?p=816 http://www.badlogicgames.com/wordpress/?p=803 ,Libgdx作者Mario所写)。

所以,您是否选择AndEngine引擎,还是应该从实际出发,多做真机测试才好下决定。下面开始,我将逐步讲解一些有关AndEngine引擎的基础信息。

AndEngine引擎基础构成如下图所示:

00  

一、如何使用AndEngine:
 


1.1 AndEngine的基本运行原理:
 


解读AndEngine源码后我们可以发现,AndEngine除了采取低耦合、高内聚的框架策略细分引擎模块,使用OpenGLES进行游戏渲染之外;该引擎还以双线程方式分别驱动绘图与事务更新,事实上,它将游戏画面和游戏业务分为两组逻辑,并行跑在同级的互斥线程当中。

具体地说,其绘图线程位于AndEngine提供的GLSurfaceView内部类GLThread(在AndEngine的org.anddev.andengine.opengl.view包下,非Android默认的GLSurfaceView),并通过GLSurfaceView子类,即AndEngine提供的RenderSurfaceView类调用重载的onDrawFrame函数加以渲染控制;而业务线程在Engine类的内部类UpdateThread中,AndEngine将始终以while(true)这样的死循环方式快速执行其中的onTickUpdate函数,所有AndEngine提供的游戏业务最终都会由此函数调用及执行,比如AndEngine常用的registerUpdateHandler方法就是向它提交数据。

当AndEngine进行游戏绘图时,游戏业务线程会通过wait方式锁定,而当游戏业务处理时,也会以同样的手段锁定绘图线程,二者间具体交互关系由Engine类中的State子类控制,以此保证游戏画面与游戏业务同步。

另外,或许是考虑到持续双线程运行电量消耗较大的缘故,AndEngine默认情况下要求用户启动PowerManager进行电源管理,故此需要<uses-permission android:name="android.permission.WAKE_LOCK"/>权限支持,否则初始化时Log会提示缺少相关配置,并建议你在AndroidManifest.xml中添加权限。PS:无此权限不影响运行,只会在Log有警告信息,并且耗电较快。

1.2 AndEngine的基本运行流程:
 


由于AndEngine是专供Android使用的2D游戏引擎,所以作为启动类的Activity肯定必不可少,而AndEngine也理所应当的提供给我们这样一个Activity,那就是BaseGameActivity。

一个标准的AndEngine应用,至少应该对BaseGameActivity做如下继承:

  1. public class Main extends BaseGameActivity  
  2.     public void onLoadComplete()  
  3.          
  4.      
  5.     public Engine onLoadEngine()  
  6.         return null 
  7.      
  8.     public void onLoadResources()  
  9.          
  10.      
  11.     public Scene onLoadScene()  
  12.         return null 
  13.        
  14.  


其中四个必须被重载函数的启动顺序如下:
 

onLoadEngine->onLoadResources->onLoadScene->onLoadComplete
 

具体的讲,AndEngine会首先加载Engine类实例通知系统游戏引擎的基本运行方式,而后加载游戏资源,其次加载游戏场景实例,最后通过onLoadComplete通知用户加载完毕并于此进行善后工作。

此外,由于BaseGameActivity类重载了父类Activity的onResume与onPause函数以保证其自身的正常运行,所以不建议在继承BaseGameActivity时再次重载上述函数(重载的话不要忘记super调用),推荐直接重载AndEngine提供的onGamePaused和onGameResumed实现同等功能(最近把LGame也加上了这样的两个函数,并且禁止了LGameAndroid2DActivity子类重载onResume与onPause,务求减少用户错误重载导致的程序异常)。

1.3 AndEngine的基本运行方式:
 


上文介绍了AndEngine的基本运行机制与运行流程,然而仅仅这样AndEngine还是无法实际运行,因为Engine与Scene都没有获得具体实现。假如我们想要在屏幕上显示出当前应用FPS数,至少需要做如下改动,才能满足一个最为基本的AndEngine应用:
  1. public class Main extends BaseGameActivity  
  2.     private static final int CAMERA_WIDTH 320 
  3.     private static final int CAMERA_HEIGHT 480 
  4.     private Camera andCamera;  
  5.     private Texture myFontTexture;  
  6.     private Font myFont;  
  7.     public void onLoadComplete()  
  8.      
  9.     public Engine onLoadEngine()  
  10.         // 构建摄像机  
  11.         this.andCamera new Camera(00CAMERA_WIDTH, CAMERA_HEIGHT);  
  12.         // 构建Engine,全屏显示,手机方向为竖屏,按比例拉伸  
  13.         return new Engine(new EngineOptions(trueScreenOrientation.PORTRAIT,  
  14.                 new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),  
  15.                 this.andCamera));  
  16.      
  17.     public void onLoadResources()  
  18.         // 构建一个纹理用以显示文字  
  19.         this.myFontTexture new Texture(256256TextureOptions.DEFAULT);  
  20.         // 构建字体  
  21.         this.myFont new Font(this.myFontTexture, Typeface.create(  
  22.                 Typeface.DEFAULT, Typeface.BOLD), 32trueColor.WHITE);  
  23.         // 注入相关纹理及字体  
  24.         this.mEngine.getTextureManager().loadTexture(this.myFontTexture);  
  25.         this.mEngine.getFontManager().loadFont(this.myFont);  
  26.      
  27.     public Scene onLoadScene()  
  28.         // 构建场景,允许的最大Layer数量为1  
  29.         final Scene scene new Scene(1);  
  30.         // 使用可以变更内容的ChangeableText显示FPS(它的父类Text不允许改变显示内容),位置在15,5,  
  31.         // 字体为myFont中所规定的,最多允许显示5个字符(设置能显示几个字符,实际就能显示几个,  
  32.         // AndEngine不能自动扩充,不填以初始化时输入的字符数计算……)  
  33.         final ChangeableText text new ChangeableText(55this.myFont,  
  34.                 "0.0"5);  
  35.         // 注册FPS监听  
  36.         this.mEngine.registerUpdateHandler(new FPSLogger()  
  37.             protected void onHandleAverageDurationElapsed(final float pFPS)  
  38.                 super.onHandleAverageDurationElapsed(pFPS);  
  39.                 // 传递内容到ChangeableText  
  40.                 text.setText("" pFPS);  
  41.              
  42.         });  
  43.         // 将ChangeableText注入场景  
  44.         scene.attachChild(text);  
  45.         // 构建场景,可容纳图层数为1  
  46.         return scene;  
  47.      
  48.  


运行效果如下图所示:

 

00 

另外,事实上BaseGameActivity并非AndEngine提供的唯一Activity,其UI包下尚有以SplashScene场景作为特效启动的BaseSplashActivity类,以及通过重载getLayoutID与getRenderSurfaceViewID这两个抽象函数,调用指定布局与视图的LayoutGameActivity类。不过除了上述特点,它们与BaseGameActivity就再无区别了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值