`

[教程] 了解PushButtonEngine的render&startup

阅读更多
http://bbs.9ria.com/viewthread.php?tid=85961&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000


* 在读本教程之前,建议看完PBE的API Reference,官方的PushButton Engine Manual,里面有最基础的概念性讲解,比如Entity和Component的奸情。还有5 个lessons&
* 了解一个框架,首先是要看它的各个Class的组织架构,如果开源的话,就会看source code.对于PBE(PushButtonEngine的简称),首先我是被各种神似于displayobject的对象搞晕了,比如DisplayObjectRenderer,DisplayObjectScene DisplayObjectSceneLayer,SceneView,PBObject等等。有些是extend flash.displayObject,而有些是 extend Object.这个时候我就会confused.所以想要了解他们是如何群P就得加入他们。按照线性来进行解析应该是最好理解的,从最开始的PBE.startup()开始,到把一个displayObject显示在Stage上,朋友们可以结合官方提供的的第5个 lesston来配合了解原理。
1)PBE调用startup的时候initialize一些managers。其接受的参数是主程序.也就是Sprite.并赋值给PBE的静态变量mainClass。
 
2)当你创建ResourceBundle的子类的时候,PBE.addResources其实没实现任何功能.官方给出的解释是:Nothing for now. Just instantiating the class was enough.

3)接下来创建ScencView extends Sprite implements IUITarget的实例,在构造函数中,其会被添加到PBE.mainClass的显示列表中.其默认的height&width为Stage的height&width,name默认为”SceneView“。

4)然后调用PBE.initializeScene(),将创建的SceneView实例作为参数。

5)默认情况下PBE还会创建一个内置的Entity,并且其name为“SceneDB”。

6)如果你没有传递spatialManagerClass参数的时候,PBE会创建一个BasicSpatialManager2D的实例,并且把这个BasicSpatialManager2D的实例作为刚刚创建的Entity的addComponent的参数传递进去,并且命名为“Spatial”。

7)如果你没有指定sceneClass参数,那么PBE会内建DisplayObjectScene实例.当创建DisplayObjectScene的实例的时候,其会内建一个_rootSprite:Sprite的实例.

8)PBE会将创建的DisplayObjectScene实例的sceneView属性指定最初创建的SceneView,其实这个sceneView是个get set 的实现,当设置这个属性的时候,已经将其的_rootSprite实例添加到SceneView的显示列表中.

9)如果未指定sceneAlignment参数,那么默认的SceneView的对其方式为CENTER,这里注意一点是这个不是舞台的对其方式,其实在PBE启动startup方法的时候就已经指定舞台的对其方式为TL,并且noScale.

10)然后将DisplayObjectScene实例做为PBE起初创建的Entity.addComponent的参数,并且命名为Scene.到目前为止,所有的初始化工作已经完成,其实这些都是PBE内部实现的,如果想了解更多技术细节,可以看source code.

11)下面我们要让一个displayObject显示在Stage上,首先自行创建的DisplayObjectRenderer的子类,DisplayObjectRenderer是一个基础的render,并且封装了DisplayObject,比如有一些类似于displayObjec的特有属性。其构造函数中只是指定了scene的指向,默认是PBE.scene,也就是PBE默认创建的DisplayObjectScene实例。

12)PBE的核心是Entity,而Entiy是又N个components组成的,但是PBE只是对用户公开了IEntity的接口,其实PBE是创建Entity. 添加到同一IEntity的components可以相互作用,比如简单的控制一个displayObject的移动。

13)Entity extends PBObject implements IEntity,我们需要调用initialize,否则在Stage上你会什么也看不见。initialize()在PBObject上已经实现了一少部分了,初始化命名,添加到PBE.nameManager中,并且指定group为PBE的currentGroup.

14)在Entity内部,看看addComponent()是如何实现的,首先调用doAddComponet方法,用了一个Dictionary,用name来做键值。IEntityComponent实例(任何实现此接口的实例都可以添加到Entity中)还会添加到一个Array里,接着调用添加的component.register的方法,将IEntity&name作为参数传递。

15)IEntityComponent的内部register实现原理,首先是初始化ower & name,然后调用抽象方法onAdd(),具体的逻辑由子类来实现,比如BitmapRenderer。我们来看一看

16)BitmapRenderer的类的继承结构:BitmapRenderer extends DisplayObjectRenderer extends AnimatedComponent exntends EntityComponent
  
17)onAdd()的主要逻辑是在DisplayObjectRenderer中实现的,其内部的_displayObject属性name值为其ower的name + 其name.在这个方法中又执行了protected addToScene();
 
18)addToScene()的内部原理,其_scene:IScene2D,也就是PBE内部创建的DisplayObjectScene实例,并且调用了调用了add(),我们在看看DisplayObjectScene的add()的具体实现,里面又多了一个DisplayObjectSceneLayer extends flash.display.Sprite的引用.

19)DisplayObjectScene有个_layers的属性,并且初始化为[],还记得初始化DisplayObjectRenderer的时候有个layerIndex的属性,其实这个属性就是_layers的id,获取DisplayObjectSceneLayer实例需要调用getLayer()。

20)看看getLayer()的内部实现,返回_layers的对应的id的值,如果null就通过generateLayer()新建DisplayObjectSceneLayer实例.数组可以指定特定的id的值,比如初始化的_layers.length为0,如果_layers[20]=somevalue,那么数组的长度就为21.此时_rootSprite又清空了其显示列表,
然后调用_rootSprite.addChild(_layers);

21)然后调用相应的layer.add(),layer.add()的内部实现就是DisplayObjectSceneLayer调用我们所属性的addChild(dor.displayObject:DisplayObject);

22)在DisplayObjectScene的内部有个_renderersictionary的属性,其键值是DisplayObjectRenderer的displayobject,对应的值就是DisplayObjectRenderer

23)所以这个时候,在看BitmapRenderer的 set bitmapData的内部实现,首先它新建一个Sprite,然后将内置的Bitmap对象添加到其display list中。然后一个图形就显示在舞台上了:-)




  • 大小: 27.5 KB
分享到:
评论

相关推荐

    PushButtonEngine-PBE2

    PushButtonEngine(PBE)是一个专为游戏开发设计的开源、模块化的引擎,它提供了一整套工具和框架,使得开发者可以更加高效地构建2D和轻量级3D游戏。这个引擎的核心理念是将游戏开发过程分解为可重用且独立的组件,...

    pushbuttonengine flex游戏引擎

    PushButton Engine is a free framework for building Flash games. There are lots of great libraries for Flash game development. PushButton Engine makes it easy to bring those libraries together to build...

    游戏引擎PushButton的教程和演示

    在`<mx:Application>`标签中设置`applicationComplete`方法,调用`Global.startup(this)`,这是使用PushButton引擎的基础。在`appComplete()`函数中,你可以开始创建你的游戏元素。 在PushButton中,所有的游戏对象...

    AS3游戏引擎框架大全.pdf

    - [下载](code.google.com/p/pushbuttonengine/downloads/list) - [快速入门](wenku.baidu.com/view/db3b102fb4daa58da0114a1d.html) - [教程与演示](.47school./soft/Flash/yykf/2010/0304/60000.html) 这两个引擎...

    Flash2D+3D游戏引擎

    本文将详细介绍几种基于Flash平台的2D+3D游戏引擎,帮助开发者更好地了解这些工具的特点与应用。 #### 二、Flixel 位图引擎 Flixel是一款非常受欢迎的开源位图引擎,特别适用于那些需要大量动态元素同时出现在屏幕...

Global site tag (gtag.js) - Google Analytics