【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系统中, ...
随机推荐
- Android 设定activity的进入和退出效果
看了android的源代码和资源文件,终于明白如何去修改设置Dialog和Activity的进入和退出效果了.设置Dialog首先通过 getWindow()方法获取它的窗口,然后通过getAttri ...
- Oracle Exception 处理
1.问题来源Oracle中可以用dbms_output.put_line来打印提示信息,但是很容易缓冲区就溢出了.可以用DBMS_OUTPUT.ENABLE(1000000);来设置缓冲区的大小.但是 ...
- android 电容屏(三):驱动调试之驱动程序分析篇
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- Unable to open c
1. Unable to open c:\Cadence\PSD_14.2\tools\capture\allegro.cfg for reading. Please correct the abov ...
- [PHP] - 逗号和点号的区别
比如:1. echo 'abc'.'def'; //用点号连接字符串 2. echo 'abc','def'; //用逗号连接字符串 也许很多人都知道逗号要比点号快.但是不知道为什么.更不知道这两者到 ...
- C#如何使用和开发自定义配置节
在日常的程序设计中,如何灵活和巧妙地运用配置信息是一个成功的设计师的首要选择.这不仅是为了程序设计得更灵活性和可扩展性,也是为了让你的代码给人以清新的感觉.程序中的配置信息一般放在应用程序的app.c ...
- storm - 使用过程中的一点思考
引子 这几天为了优化原有的数据处理框架,比较系统的学习了storm的一些内容,整理一下心得 1. storm提供的是一种数据处理思想,它不提供具体的解决方案 storm的核心是topo的定义,而top ...
- 深入理解Java虚拟机 - 虚拟机内存划分
在内存管理方面,Java相对于C和C++的区别在于Java具有内存动态分配以及垃圾收集技术,但平时我们很少去关注JVM的内存结构以及GC,在出现内存泄露或溢出方面的问题,排查工作将变得异常艰难. ...
- Terrocotta - 基于JVM的Java应用集群解决方案
前言 越来越多的企业关键应用都必须采用集群技术,实现负载均衡(Load Balancing).容错(Fault Tolerance)和灾难恢复(Failover).以达到系统可用性(High Avai ...
- js如何判断是手机端还是PC端访问
function isMobile(){ var sUserAgent= navigator.userAgent.toLowerCase(), bIsIpad= sUserAgent.match(/i ...