2012年3月14日星期三

Android引擎e3roid学习笔记②AndEngine比较


还是利用e3roid的学习方法,再理过AndEngine;但有几点不同。首先AndEngine缺乏文档,所以方法不得已简化为源码+实例;其次,比较的目的依旧是e3roid的应用,所以从细致程度上不如前者。另外,由于AndEngineExample与e3roid不同,并不仅仅展示单一功能,而是较为复杂,其分类也就显得不那么清晰,因而遗漏问题可能较为严重,如有需要在真机到手之后会单独开文讲述。

AndEngine分为以下几个部分,即audio, engine, entity, input, opengl, ui, util。与e3roid相比,其中,engine大致与e3roid相当,entity大致与drawable相当,input大致与event相当,物理部分通过扩展包实现,同样是box2d。

但与形同虚设的e3roid相比,AndEngine显然提供了更为强大的audio支持,SoundFactory与MusicFactory令声音的控制更为自如。与此相关的官方实例有MusicExample, SoundExample等。

engine一项中也包含了比e3roid更多的内容,如camera(用以调节屏幕的显示区域,利用HUD类实际绘制游戏屏幕于手机之上),option(设置),handler(基本的碰撞检测,物理与时间等内容)以及其他特殊功能(如分屏等)。当然,也提供了如e3roid一般的fps限制以适应低端机型。与此相关的官方实例有BoundCameraExample, CollisionDetectionExample, TextrueOptionExample, DigitalOnScreenControlExample等。HUD为对于camera的继承,其下有control。此处架构有些混乱。

entity一项,除了在e3roid中我们已经见过的modifier, shape, scene, sprite等,AndEngine还增加了particle(用于粒子效应), text与primitive(基本的线、面、矩形)。与此相关的官方实例有AnimatedSpritedsExample, AutoParallaxBackgroundExample, ChangeableTextExample, EntityModifierExample, EntityModifierregularExample, LineExample, ParticleSystemSimpleExample, ParticleSystemCoolExample, ParticleSystemNexusExample, PathModifierExamle, RectangleExample, SpriteBatchExample, SpriteExample, SpriteRemoveExample, TextExample, TickerTextExample, TMXTiledMapExample, MenuExample, SubMenuExample, TextMenuExample等。需要说明的是,MenuScene为对CameraScene的继承,而后者是对Scene的继承。与engine中的camera并不相同。

input是另一个AndEngine优于e3roid之处,被分为sensor(用于重力感应)与touch(用于触屏)两项。与此相关的官方实例有MultiTouchExample, TouchDragExample。

ui将可继承的activity进行分类,用于不同的目的,如LayoutGameActivity等;除此之外,还特别增加了Dialog。

opengl下有texture等内容。

physics下相关实例有PhysicsCollisionFilteringExample, PhysicsExample, PhysicsFixedStepExample, PhysicsJumpExample, PhysicsMouseJointExample, PhysicsRemoveExample, PhysicsRevoluteJointExample等。基本上把box2d的实例搬过来了。

从以上简单粗略的梳理可以看出,e3roid基本上是一个简化版的AndEngine。在一些基础功能上,AndEngine要优于e3roid,如input与audio。但同时AndEngine也存在封装过度的问题。可以说功能与复杂并行。进一步的研究有待后续进行。

2012年3月13日星期二

Android引擎e3roid学习笔记①引擎架构


e3roid是一款为android平台提供的开源2d游戏引擎,其主页为http://www.e3roid.com/,在其主页业已包括的信息本文将不再赘述。关于android平台游戏引擎的不给力与各种介绍,cping1982前辈在其主页中已多有说明(http://blog.csdn.net/cping1982)。与相似引擎AndEngine相比,e3roid架构合理,并且有API说明(http://www.e3roid.com/doc/),免去仅凭阅读实例猜测用法的苦恼;反过来说,AndEnigne的实例也可作为e3roid的补充,盖其本身实例较前者匮乏,而作者本人也承认e3roid对于AndEngine的继承关系。本文仅就e3roid引擎资料缺乏的情况之下,提供个人的学习研究心得,更为重要的目的在于为应用作一些铺垫。研究方法十分朴素,即以源码+文档+实例,希望能够有所收获。当然,错误也在所难免,敬请谅解。
本文所用e3roid为1.2.11版本。
e3roid由以下package构成,即[e3roid][audio][drawable][event][lifecircle][opengl][physics][script][util][service][transport],其中,[script]用于多种语言实现(目前支持Java, Javascript, Lua),[util]提供通用类,[service][transport]用于网络通信,亦即在通常情况下开发者只需专注于其他内容,而这一部分的内容由package的名称即很容易理解其内容。
下面将分述各包的内容与用法。

  • [e3roid] 基础类

e3roid的基础类E3Activity, E3Engine, E3Scene出现于[e3roid]之中。作为一款面向android平台的游戏引擎,Activity类为必备要素。使用一个实例来描述基础类的运用十分必要。一个标准的e3roid应用,至少应对E3Activity进行如下继承。本例来自于HUDExample,除了本例之外,SceneUpdateExample也是E3Scene的重要实例。在大致像样的应用之中,依次调用onLoadEngine()->onLoadScene()->onLoadResource()之后,必须有一个Update()函数用以刷新。

 1 public class TestExample extends E3Activity{
 2     // The width and height for the scene.
 3     private final static int WIDTH  = 320;
 4     private final static int HEIGHT = 480;
 5     // Textures.
 6     private Texture robotTexture;
 7     private Texture hudTexture;
 8 
 9     
10     @override 
11     public E3Engine onLoadEngine(){
12     // Initiating the engine.
13     E3Engine engine = new E3Engine(this, WIDTH, HEIGHT);
14     // Asking for the full screen request.
15     engine.requestFullScreen();
16     // Asking for the portrait request.
17     engine.requestPortrait();
18     return engine;
19     }
20 
21     @override
22     public E3Scene onLoadScene(){
23     // Initiating the scene.
24     E3Scene scene = new E3Scene();
25     // Load the texture for hud.
26     Sprite hud = new Sprite(hudTexture, centerX, centerY);
27     scene.addHUD(hud);
28     // Set the position.            
29     centerX = (getWidth()  - robotTexture.getWidth())  / 2;
30     centerY = (getHeight() - robotTexture.getHeight()) / 2;
31     // Load the texture for backgroud.            
32     Background background = new Background(
33              new TiledTexture("background.png", getWidth(), getHeight(), this));
34     scene.getTopLayer().setBackground(background);
35     // Load the texture for robot.            
36     Sprite robot = new Sprite(robotTexture, centerX, centerY);
37     scene.getTopLayer().add(robot);
38     return scene;
39     }
40 
41     @verride
42     public void onLoadResources(){
43     robotTexture = new AssetTexture("robot.png", this);
44     hudTexture  =  new AssetTexture("controller_base.png", this);
45     }
46 
47 }


  • [audio] 

[audio]包由AudioInputListener接口与AudioInputeService类组成。前者用于接收声音输入,后者用于提供声音输入录制服务;除了标准的lifecircle之外,AudioInputService提供了诸如run(), isRecording(), readAs16bitWave()等简单实用的函数。官方给出的example为AudioInputExample。初步鉴定e3droid中并未提供如AndEngine中的SoundFactory类,这多少为游戏声音编程带来一些麻烦,但依靠android自身提供的功能大可完成一般性质的任务。其实AndEngine之中也不过进一步封装而已。具体方法详见Beginning Android Game 2011一书。

  • [drawable]
对于任何游戏编程来说,图形绘制都是极其重要的一部分。因此,可以说,[drawable]是e3roid的重中之重。事实上,从其所占的比重来看也是如此。首先来看drawable基础部分,除了Drawable接口之外,其下有类Background, Layer, Menu, Shape与Sprite,其中,Layer与Menu是单独的类,而其他三者则具有Backgroud->Sprite->Shape这样的继承关系,通过阅读文档可以发现,Sprite与Background较Shape变化甚微。官方给出的相关实例为BackgroudExample, ShapeExample与SpriteExample, SpriteDragExample, SpriteMoveExample, SpriteRemoveExample,内容与上面所举的例子大同小异,只是增添了rotate(), scale(), move()等函数的应用,但一些更有意思的方法并没有展示。
值得注意的是,当进行Shape(Background, Sprite)的清除工作时,需要重载父函数的onRemove(), onDispose()等方法,并且,被清除的对象不可再被调用,若只是想要隐藏,使用SetVisible()即可。
[drawable]其下还有[controls][modifier][texture][sprite][tmx]等子包,展示了其高级用法,下面就来进一步学习。
[controls]主要提供虚拟摇杆的支持,其下有StickController与DigitalController两个类,其中后者为对前者的继承。官方文档说明前者为analog on-screen control,而后者为digital on-screen control,但二者的区别我尚未明晰。官方实例提供DigitalControllerExample, AnalogControllerExamplem, MultiTouchControllerExample,为一个基本完整的模拟摇杆实例。目前感觉此包是专门的模拟控制,如需特别控制则以应用onSceneTouchEvent(), onTouchEvent()为佳。
[modifier]提供修改可绘制对象的接口,其中大多数类都可从名称中获取其含义。ShapeModifier是其抽象基类,其下派生出ParallelModifier, ProgressAware, ProgressModifier, SequenceModifier, SpanModifier,其中,ProgressAware, ProgressModifier用于控制进程,SequenceModifier提供设置循环方法,其他待考证。ProgressAware下派生出AlphaModifier, AxisModifier, ColorModifier, MoveModifier, RotateModifier, ScaleModifier等更为实用的具体类。官方提供的实例有AlphaModifierExample, AxisModifierExample, ColorModifierExample, MoveModifierExample, RotateAndScaleModifierExample。由以上实例可以看出,任何Modifier类均需要以ProgressModifier进行初始化,并且调用onModifierStart(), onModifierFinished()方法。进一步的研究将在真机到手之后跟进。
值得注意的是在[modifier]之下尚有被作者称为for easing actions的[function]包,其具体作用目前尚不清楚。
[sprite]提供sprite的特殊绘制方法,包括AnimatedSprite, TerminalSprite, TiledSprite, TextSprite,其意自明。官方提供的实例有AnimatedSpriteExample, TiledBackgroundExample, TiledSpriteExample。在具体实现上,则可在上面的例子中加入如下代码。AnimatedSprite.Frame是[sprite]下的一个数组,用以存放动画的帧。

 1         // Add animation frames from tile.
 2        ArrayList<AnimatedSprite.Frame> frames = new ArrayList<AnimatedSprite.Frame>();
 3        frames.add(new AnimatedSprite.Frame(0, 0));
 4        frames.add(new AnimatedSprite.Frame(1, 0));
 5        frames.add(new AnimatedSprite.Frame(2, 0));
 6        frames.add(new AnimatedSprite.Frame(3, 0));
 7                 
 8        // Start animation with 500msec, infinite loop.
 9        sprite = new AnimatedSprite(texture, centerX, centerY);
10       sprite.animate(500, frames);
需要停止播放动画则可加入
1         if (sprite.isAnimated()) sprite.stop();
非常方便。
TiledSprite目前不在本文关注范围之内。
  • [event]
[event]是另一个重要内容,e3roid[event]具有如下接口,即AnimationEventListener, ControllerEventListener, FrameListener, ModifierEventListener, SceneEventListener, SceneOnKeyListener, SceneUpdateListener, ShapeEventListener, TextInputListener等。其中,SceneEventListener, SceneOnKeyListener, SceneUpdateListener较为重要,值得注意的是,一般的触摸事件由onSceneTouchEvent()接收,onTouchEvent()专门判定触摸某个Shape对象。官方并没有与此对应的专门实例。
  • [lifecircle]
e3roid的[lifecircle]与一般的android应用并无明显的区别,在引擎架构之下,其实这一lifecircle并无太大的作用,除了提供E3LifeCircle的接口,还有E3Service类,但其下除了AudioInputService之外并无其他继承者。或者作者想向其中进一步添加其他子类也未可知。
  • [opengl]
  • [physics]
[physics]完全集成box2d,后者几乎成为2d引擎的标准配置。shape与world的基本概念也被完全移植过来,成为PhysicsShape与PhysicsWorld类,熟悉box2d的制作者可以很快上手。至于经常用到的碰撞检测则完全可以使用shape对象自身的函数完成。
以上基本理过e3roid的架构与实例。

网页浏览总次数