[url]http://bbs.9ria.com/viewthread.php?tid=85961&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000[/url]
* 在读本教程之前,建议看完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中。然后一个图形就显示在舞台上了:-)
[img]http://dl.iteye.com/upload/attachment/502259/45a31be3-5c55-3043-916d-af927f00615c.jpg[/img]
* 在读本教程之前,建议看完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中。然后一个图形就显示在舞台上了:-)
[img]http://dl.iteye.com/upload/attachment/502259/45a31be3-5c55-3043-916d-af927f00615c.jpg[/img]