我在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. Delphi里的RTTI与反射(举例换掉FOnChange)

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...

  2. C#基础精华04(文件流,文件操作,File、Directory、Path,Directory)

    文件流 FileStream  可读可写  大文件  释放 StreamReader 读取   释放 StreamWriter 写入   释放 using 中释放 File 可读可写  小文件 操作文 ...

  3. Java读写Windows共享文件夹 .

    版权声明:本文为博主原创文章,未经博主允许不得转载. 项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片.文件等.那么如何使用Java读写Windows共享文件夹呢? Java可以使用JCIF ...

  4. PHP array_chunk() 函数

    今天在CSDN上,看到了一个问题 一维数组 PHP code   array('0'=>'a',1=>'b',2=>'c',3=>'d',4=>'e',5=>'f' ...

  5. 8款必备的免费移动Web开发框架(HTML5/JS)

    标签:JavaScript HTML5 移动开发 Web开发 jQuery 应用程序框架 插件 概述:随着智能手机和平板电脑的普及,移动开发逐渐成为众多开发者追逐的潮流.拥有一款优秀的移动Web开发框 ...

  6. 在SQLite中使用索引优化查询速度

    在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用SQLite做了一下测试. 建立三个表: create table t1 (id integer primary key,num inte ...

  7. Java中的字符串驻留(String Interning)

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  8. 【转】protobuf2.5.0在<delete [] elements_;>crash的问题。

    背景 项目中使用protobuf作为网络传输协议,最开始在项目中直接使用源代码编译,在真机上测试一直是正常的,直到某天开始在 CPU是64 bit的设备上发现protobuf导致crash了,于是就开 ...

  9. CXF之二(CXF发布webService)

    Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构.它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于spring的轻量级容器中,也可以部署在更高级的服务器上, ...

  10. WPF 中资源路径的问题

    WPF 中资源路径的问题 1. 引用当前工程的资源(注意xxxx.png的build action 应设置为Resource 或Embedded Resource) <ImageBrush Im ...