【Stage3D学习笔记续】山寨Starling(一):从事件说起
我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D
山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中只会贴出核心的代码,完整的代码和示例大家可以去GitHub中查看。
同时为了避免Starling中和原生API重名的问题,所有可能导致重名的类名我都会在后面加上2D,比如Starling中的EventDispatcher被我山寨过来后就重命名为EventDispatcher2D。
另外由于高版本的Starling中采用了很多的优化技术来提高运行效率,但这些技术会使阅读难度增大,所以我参照的是比较老的版本。
=============================================================
那么从哪里开始看呢,既然显示列表的基类是EventDispatcher,那就从事件开始吧!
“Starling为啥要自己重新写一个EventDispatcher,这不是脑残么?难道他认为自己写的会比原生的效率更高?”
额,其实不是这样,Staling是在模仿AS3原生显示列表,那么很重要的一环就是要实现事件的冒泡,原生的事件冒泡是在原生显示列表中实现的,所以想要在Starling的显示列表中也实现事件的冒泡功能就需要自己另做一套事件体系了。
事件其实就是实现观察者模式+责任链模式,而作为冒泡功能的实现,是非常值得一看源码的,主要的逻辑是在发送事件时,设置target和currentTarget的值,另一个是实现终止冒泡的逻辑,以及向父层调用dispatchEvnet方法实现冒泡。
下面列出核心代码以供参考:
public function dispatchEvent(event:Event2D):void
{
var listeners:Vector.<Function> = _eventListeners ? _eventListeners[event.type] : null;
//如果当前没有任何侦听同时事件不需要冒泡则可以停止执行
if(listeners == null && !event.bubbles)
{
return;
}
//记录下当前的事件目标对象
var previousTarget:EventDispatcher2D = event.target;
//如果没有事件目标对象或当前目标对象存在则设置当前对象为事件目标对象, 注意最后会对目标对象进行还原
if(previousTarget == null || event.currentTarget != null)
{
event.setTarget(this);
}
//抛出侦听的事件
var stopImmediatePropagation:Boolean = false;
if(listeners != null && listeners.length != 0)
{
//设置当前目标对象
event.setCurrentTarget(this);
//抛出事件
for each(var listener:Function in listeners)
{
listener(event);
//如果事件被立即终止则跳出循环
if(event.stopsImmediatePropagation)
{
stopImmediatePropagation = true;
break;
}
}
}
//判断事件是否可向上进行冒泡
if(!stopImmediatePropagation && event.bubbles && !event.stopsPropagation && this is DisplayObject2D)
{
var targetDisplayObject:DisplayObject2D = this as DisplayObject2D;
if(targetDisplayObject.parent != null)
{
//设置当前目标对象为空
event.setCurrentTarget(null);
//事件冒泡
targetDisplayObject.parent.dispatchEvent(event);
}
}
//还原为第一个抛出的事件目标对象
if(previousTarget != null)
{
event.setTarget(previousTarget);
}
}
完整代码:
【Stage3D学习笔记续】山寨Starling(一):从事件说起的更多相关文章
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...
- 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...
- 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程
这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽
还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...
- 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵
如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...
- 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序
本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...
- 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...
- 【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法
Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中, ...
随机推荐
- Xcode中的iOS工程模板
1. Application类型 我们大部分的开发工作都是从使用Application类型模板创建iOS程序开始的.该类型共包含7个模板,具体如下所示. Master-Detail Applicati ...
- IMX515开发备忘
1.多个PAD可以选择为同样的功能引脚 IMX515处理器一个PAD可以作为多种功能引脚,比如EIM_D25可以作为UART3_RXD,定义如下: 图1 而处理还有一个另一个UART3_RXD的PAD ...
- 【HDOJ】4358 Boring counting
基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...
- C#中this在构造函数时的使用
今天编程的时候,想要用this来处理构造函数,想了半天没有想起来 后来找了自己以前记录的 http://www.cnblogs.com/chucklu/p/4842766.html public Cu ...
- 基于注解的SpringMVC整合JPA
转载位置:http://www.blogjava.net/sxyx2008/archive/2010/11/02/336768.html 实体类 Department package com.sj.b ...
- 转: Linux 技巧:让进程在后台可靠运行的几种方法
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...
- unity3d中获得物体的尺寸(size)
1:获得诸如Plane.Cube的size. 1):可以为它们添加Collider,然后使用XXX.collider.bounds.size;该方法获得的size和缩放比例有关,是一一对应的,缩 ...
- Spring3中用注解直接注入properties中的值
在bean(可是controller, service, dao等了)中,使用@Value注解: @Service public class TestService{ @Value("${s ...
- OK335xS Qt network hacking
/********************************************************************** * OK335xS Qt network hacking ...
- apache开源项目--HttpComponents
HttpComponents 也就是以前的httpclient项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议.不 ...