我在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);
}
}

完整代码:

EventDispatcher2D

Event2D

【Stage3D学习笔记续】山寨Starling(一):从事件说起的更多相关文章

  1. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

    批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...

  2. 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西

    我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...

  3. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  4. 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系

    我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...

  5. 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

    还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...

  6. 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

    如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...

  7. 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序

    本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...

  8. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  9. 【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法

    Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中, ...

随机推荐

  1. ConfigurationManager配置操作

    /// <summary> /// 配置信息维护 /// </summary> public class AppConfig { public static Configura ...

  2. python学习笔记二--列表的使用

    一.基本列表操作 1. 合并‘+’:左右两边必须均为列表 可以用str(),%,list()做类型的转换后再做合并 2. 重复‘*’: 3. 迭代和解析: x作为for循环里步进变量,由于列表是序列, ...

  3. 【剑指offer】求逆序对的个数

    2013-09-07 10:50:31 面试题36:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对.输入一个数组,求出这个数组中逆序对的总数. 小结: 最直观的的方法是: ...

  4. ruby中Block, Proc 和 Lambda 浅析

    Block 与Proc的区别: Block是代码块,Proc是对象: 参数列表中最多只能有一个Block, 但是可以有多个Proc或Lambda; Block可以看成是Proc的一个类实例. Proc ...

  5. MediaPlayer中创建AudioTrack的过程

    使用MediaPlayer播放音视频时,会创建AudioTrack对象用于播放音频数据.下面就来看看MediaPlayer创建AudioTrack的过程: 1.创建AudioTrack对象MediaP ...

  6. poj 1328 Radar Installation(贪心)

    题目:http://poj.org/problem?id=1328   题意:建立一个平面坐标,x轴上方是海洋,x轴下方是陆地.在海上有n个小岛,每个小岛看做一个点.然后在x轴上有雷达,雷达能覆盖的范 ...

  7. 结构体 typedef struct hash_cell_struct hash_cell_t;

    typedef struct hash_cell_struct hash_cell_t; struct hash_cell_struct{ void* node; /*!< hash chain ...

  8. mvc源码解读(20)-controller和view之查找view

    很多时候在mvc项目中我们需要去扩展自己的视图引擎,大概看起来应该下面这个样子的: public class RazorEngineExpand : RazorViewEngine { private ...

  9. 记一次Sql优化过程

    这几天在写一个存储过程,反复优化了几次,从最开始的7分钟左右,优化到最后的几秒,并且这个过程中我的导师帮我指点了很多问题,这些指点都是非常宝贵的,独乐乐不如众乐乐,一起来分享这次的优化过程吧. 这个存 ...

  10. NOI2004 小H的小屋

    还是纯粹不会啊……到底该怎么办 http://blog.sina.com.cn/s/blog_86942b1401016m3g.html http://www.cnblogs.com/datam-cy ...