`

[教程] 了解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是一个开源的模块化游戏引擎,你可以通过 https://github.com/PushButtonLabs/PushButtonEngine 得到其代码和相关文档。

    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...

    python学习导航.txt

    python

    node-v8.3.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    嵌入式微处理器设计及应用

    摘要:为满足智能家居座椅的交互式运动控制需求,基于AT89S52设计了嵌入式座椅运动控制系统。使用VB.net设计了游戏手柄按键读取软件,并在此基础上设计了座椅运动控制软件,软件可分别在“手柄模式”和“鼠标模式”下与嵌入式座椅运动控制器通信,进而控制座椅进行加速、减速、正转和反转等运动;构建了控制系统实验装置,实验结果表明,“鼠标模式”下,通过鼠标点击控制软件上功能按钮可实现对座椅的准确运动控制;“手柄模式”下,游戏手柄不仅可控制座椅运动,还可同步控制电脑上运行的游戏或远程遥控车,实现浸入感较强的座椅运动娱乐应用。

    2024年中国NFC RFID阅读器行业研究报告.docx

    2024年中国NFC RFID阅读器行业研究报告

    node-v9.9.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    04-18 周四 为LLM-inference项目配置GitHub CI过程记录

    04-18 周四 为LLM-inference项目配置GitHub CI过程记录

    2024年中国AI和机器视觉行业研究报告.docx

    2024年中国AI和机器视觉行业研究报告

    计算机二级【公共基础知识速学教程】.pdf

    内容概要:这份资料包含了计算机二级公共基础知识速学教程的内容大纲,涵盖了数据结构与算法、程序设计基础、软件工程基础、数据库设计基础等多个章节。其中包括了算法复杂度、数据结构、栈、队列、链表、二叉树、查找、排序等内容,以及程序设计方法、软件工程概念、数据库设计原理等知识点。 适用人群:适合希望系统学习计算机二级公共基础知识的学生、计算机专业学习者、程序员、软件工程师以及对数据结构、算法和数据库设计感兴趣的人群,希望通过系统学习提升自己的计算机基础知识和技能。 使用场景及目标:该教程可用于计算机相关专业的课程学习、自学提升或备考计算机二级公共基础考试。学习者可以通过逐章学习和实践,掌握数据结构与算法、程序设计基础、软件工程基础和数据库设计基础等知识,提高自己在计算机领域的理论基础和实践能力。 其他说明:学习者在使用这份教程时,可以结合实际案例和练习题进行深入学习和巩固。建议按照章节顺序系统学习,理解各个知识点的概念和应用,并通过实践项目或练习加深对计算机基础知识的理解和掌握。通过系统学习,可以提升自己在计算机领域的专业水平和能力。

    减肥管理,全球前10强生产商排名及市场份额.docx

    减肥管理,全球前10强生产商排名及市场份额

    04-19 周五 GitHub actions-runner 程序解释

    04-19 周五 GitHub actions-runner 程序解释

    node-v8.16.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Gnuradio与Hackrf的无线通信收发系统的实现.pdf

    基于Gnuradio与Hackrf的无线通信收发系统的实现.pdf

    5g与数字孪生赋能数字化矿山总体解决方案.pptx

    5g与数字孪生赋能数字化矿山总体解决方案.pptx

    ISO IEC TS 27022-2021 信息技术信息安全管理系统过程指南.pdf

    ISO IEC TS 27022-2021 信息技术信息安全管理系统过程指南.pdf

    一篇关于图像和视频去噪技术的研究论文,它介绍了一种基于稀疏3D变换域的协同滤波方法

    "Image and video denoising by sparse 3D transform-domain collaborative filtering" 是一篇关于图像和视频去噪技术的研究论文,它介绍了一种基于稀疏3D变换域的协同滤波方法。这种方法的核心思想是利用图像或视频中的空间和时间冗余信息来去除噪声

    IEC 60364-7-712-2017 低压电气装置.第7-712部分:特殊装置或位置的要求.太阳能光伏PV电源系统

    IEC 60364-7-712-2017 低压电气装置.第7-712部分:特殊装置或位置的要求.太阳能光伏(PV)电源系统.pdf

    全国海拔高度文件,精度1公里

    附python查询脚本,需要请联系我

    BS EN 60068-2-2-2007 第2-2部分:试验——试验B:干热.pdf

    BS EN 60068-2-2-2007 第2-2部分:试验——试验B:干热.pdf

Global site tag (gtag.js) - Google Analytics