Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3事件体系结构_Actionscript 3 - Fatal编程技术网

Actionscript 3 AS3事件体系结构

Actionscript 3 AS3事件体系结构,actionscript-3,Actionscript 3,我对AS3项目的最后一块拼图有困难 我知道目标类继承自EventDispatch或实现IEventDispatch,并且可以注册(以及其他方法)事件侦听器 但是,目标类注册的是什么?如果发生事件,AS3如何知道将事件传递给目标类 问候,, shwell.阅读这篇关于事件阶段的文章,它将更有意义: 希望这有帮助。祝你度过愉快的一天。你可以看看starling活动是如何进行的 当一个displayObject冒泡一个事件时,它将检查displayObject的父对象是否存在,并在displayO

我对AS3项目的最后一块拼图有困难

我知道目标类继承自EventDispatch或实现IEventDispatch,并且可以注册(以及其他方法)事件侦听器

但是,目标类注册的是什么?如果发生事件,AS3如何知道将事件传递给目标类

问候,,
shwell.

阅读这篇关于事件阶段的文章,它将更有意义:


希望这有帮助。祝你度过愉快的一天。

你可以看看starling活动是如何进行的

当一个displayObject冒泡一个事件时,它将检查displayObject的父对象是否存在,并在displayObject的祖先为null时将父对象添加到bubbleList

以下代码在starling eventDispatcher中

var element:DisplayObject = this as DisplayObject;
var chain:Vector.<EventDispatcher> = new <EventDispatcher>[element];

while ((element = element.parent) != null)
    chain[int(length++)] = element;
var元素:DisplayObject=此为DisplayObject;
变量链:向量新[元素];
while((element=element.parent)!=null)
链[int(length++)]=元素;

在AS3中,
EventDispatcher
是观察者设计模式的实现。此类实现了
addEventLister
removeEventListener
dispatchEvent”和
hasEventListener`方法。在内部,它还维护一个字典或类似的数据结构,其中包含当前正在侦听的事件,以及在调度事件时必须调用的方法列表。像这样的-

{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]};
在对象上调用
addEventListener
时,它会为相关事件创建一个新键,并将方法引用添加到其关联的值列表中

在类上调用
dispatchEvent
时,它将获取与事件关联的所有方法,并调用与事件关联的方法。每个方法都通过
事件
类或其子类的实例调用


删除事件侦听器显然与添加相反。

我想您缺少
addEventListener()
机制。这对事件引擎有全局性的副作用,注册回调函数和调用者
值,以提供激发事件的正确上下文,并通过静态或动态调用
globalToLocal()
来更新
event.localX
event.localY
属性,随着事件的上下起伏


如果你像我一样,对Flash player如何确定事件的目标感到困惑——有一个内部“焦点”指针,它确定SWF的哪个组件具有键盘焦点,并且该指针用于确定键盘事件的目标。对于鼠标事件,最有可能的是Flash引擎调用
getObjectsUnderPoint()
来查询最顶层的
IEventDispatcher
兼容对象(并非所有的DisplayObjects都可以处理事件),并向其中一个发送鼠标事件,使用上一个事件的目标接收say
MouseEvent.ROLL\u OUT
MouseEvent.MOUSE\u OUT
(如果目标已更改)。对于其他事件,很可能整个显示列表都会做出反应。

对于显示列表中的对象,下面的Adobe摘录就是答案“当Adobe®Flash®Player分派事件对象时,该事件对象将从显示列表的根节点往返到目标节点,检查每个节点是否有注册的侦听器。”


对于非显示对象,AS3运行时维护一个包含绑定变量的所有AS3事件的字典。绑定变量是对事件侦听器的引用。

好吧,现在我不知道一些事情。Flash player如何知道哪个对象应该是事件的目标,例如,在鼠标单击事件上?它使用了什么确切的方法o确定实际目标?与移动相同,它是否检查被其他对象遮挡的对象?可以通过过滤
getObjectsUnderPoint()完成
对于最顶端的
IEventDispatcher
并指定该对象为目标,但这主要是一个猜测。您好Romi,您链接中的这一行解释了显示对象的情况,并主要回答了我的问题。但非显示对象呢?-“当Adobe®Flash®Player发送事件对象时,该事件对象从显示列表的根节点往返到目标节点,检查每个节点是否有注册的侦听器。“尽管我可以想象非显示对象的类似‘往返’。您好,Pranav,如果字典位于目标外部,那么似乎还必须存储对目标的引用?这是对的吗?我假设你指的是分派事件的类。在这种情况下,不,字典不是外部的。类继承自EventDispatcher,因此字典成为类本身的内部。我想我现在明白了,事件是否传递给所有EventDispatcher类?如果我没记错的话,Starling为他们的框架创建了一个完全不同的事件体系结构/模式,因为Flash体系结构很重,尤其是在垃圾收集方面。