August 12, 2006

【黑羽】AS3.0教程(9):强大的事件机制(5)

ActionScript3天地会公测中...

(如蒙转载,请留下我的Blog链接:www.kingda.org, thx)

有兄弟反映,似乎AS3的事件机制有些复杂。
在我看来,编程上 “复杂”这个词一般有两种定义:实现麻烦 ,或者内容众多。
AS3中的事件机制其实现并不麻烦,逻辑更加清楚简单,因此不是“实现麻烦”这一类。
那应该指的是“内容众多”这个意思。黑羽倒觉得"内容众多"往往是褒义词,意味着API丰富,控制范围和深度大。那么一旦得其要领,即思路通畅,记忆深刻,也就不会觉得“复杂”了。

我也会尽量写的简单通俗,照顾新手。但我又要同时考虑到AS2老手们的需求,不让他们打瞌睡。所以AS初学者 看到不懂的地方可以跳过,多用用Event后,有需要再回过头看看我教程的其它部分,一定会有收获。

拿今天要讲的事件发送来说,我预计写以下内容:
1. EventDispatcher和Event的简介
2. 回顾AS2.0事件发送
3. 继承EventDispatcher进行事件发送。
4. 合成EventDispatcher进行事件发送。
5. 实现IEventDispatcher接口来进行事件发送。 与设计模式中的装饰器模式相似。

那么新手看第一,第二,第三部分已经足够应付一般应用。AS2老手们要看看第四部分。 开发大型项目的AS开发者,则第五部分必看。

1.EventDispatcher和Event的简介。
AS3中Object是万物之宗母,且生养众多,共有220多个子类。Event(事件类)和EventDispatcher(事件发送者类)就是在这一代之中。 Event和EventDispatcher是事件机制的两大主角,二者缺一不可。
Event类及其子类的功能就是提供各种具体的事件供EventDispatcher使用,不能干别的。
EventDispatcher则是要让它所有的子类都能发送事件。
那么,AS3就让所有要发送事件的类都统统继承于EventDispatcher。而需要发送事件的类毫无疑问,都是些很重要的类,比如URLLoader,DisplayObject。
其中DisplayObject更是一代霸父,所有可视对象,比如MovieClip,Spirit等等等等统统都是它的子孙。
因此,父以子贵,EventDispatcher在Object的第一代子女中,位高权重,影响极大。

2. 回顾 AS2.0中发送事件
AS2.0中发送事件是怎么干的?
在类中留几个函数对象,如 dispatchEvent:Function,再搞一个EventDispatcher.initialize()来初始化一下要发送事件的类,然后,就搞定了。.....好简单。
但AS3中更简单,更加标准。

3.继承EventDispatcher进行事件发送。
继承是最方便最快的一种。
刚刚说过了,所有的可视对象都继承DisplayObject,是EventDispatcher的孙子辈,因此都可以直接使用dispatchEvent()来发送事件了。
看代码,我们让一个普通的MovieClip, KingdaMC,来发送一个莫名其妙的事件,比如说"KingdaPlaySC"。


KingdaMC.dispatchEvent(new Event("KingdaPlaySC"));

现在我们要让一个我们自己的类来发送事件。

  //【黑羽】ActionScript 3.0系列教程
  //http://www.kingda.org
//以下为一个名叫KingdaSampleClass的Document Class,请自行和一个Fla绑定。
//如果忘了怎么弄,看我第三篇教程

package {
import flash.display.Sprite;
import flash.events.Event;

public class KingdaSampleClass extends Sprite {

public function KingdaSampleClass() {
//生成一个KingdaSampleDispatcher的实例
var dispatcher:KingdaSampleDispatcher = new KingdaSampleDispatcher();

//标准的实现
dispatcher.addEventListener(KingdaSampleDispatcher.ACTION, actionHandler);
dispatcher.doSomething();

//可以用直接字符串标识事件类型,但推荐使用静态加const的字符串
dispatcher.addEventListener("KingdaPlaySC", anotherHandler);

//直接用new Event生成一个新的事件对象,该对象的事件类型为"KingdaPlaySC"
dispatcher.dispatchEvent(new Event("KingdaPlaySC"));
//输出:
//action的侦听器: [Event type="action" bubbles=false cancelable=false eventPhase=2]
//KingdaPlaySC的侦听器: [Event type="KingdaPlaySC" bubbles=false cancelable=false eventPhase=2]
}

private function actionHandler(event:Event):void {
trace("action的侦听器: " + event);
}

private function anotherHandler(event:Event):void {
trace("KingdaPlaySC的侦听器: " + event);
}
}
}

import flash.events.EventDispatcher;
import flash.events.Event;

class KingdaSampleDispatcher extends EventDispatcher {
public static var ACTION:String = "action";

//如果你需要在自己类中某个方法中发送事件,那么示例如下
public function doSomething():void {
//你的代码.....

//发送事件
dispatchEvent(new Event(KingdaSampleDispatcher.ACTION));
}
}



P.S:本教程受Creative Commons License.协议保护,未经作者同意,不得用于商业用途。

广告:哈哈,现在刚好是阿里妈妈推广期哦,你是站长吗?推荐注册阿里妈妈赚广告费

TrackBack

TrackBack URL for this entry:
http://www.kingda.org/mt/mt-tb.cgi/93

Comments (5)

old9:

:D sprite写成spirit鸟~

呵呵,真的唉。:P
还好代码里面没写错。
我所有发布的代码都是自己测试过的。

Adam:

自定义的Event有什么用途呢?

HUPEIKANG1:

ReferenceError: Error #1065: 变量 addFrameScript 未定义。
at KingdaSampleClass$iinit()

同样的问题。。。

如果 MovieClip就没有问题。。。请问是怎么回事呢?

我用的是 flash 9

HUPEIKANG1:

T_T 请问 这是怎么回事啊?

留下高见,发表评论

个人信息不会外泄,请放心填写。

姓名和Email必填。

发表评论后,请耐心等待,不要频繁刷新。提交完成后,刷新一下本页即可看到您的评论。^_^

请输入验证字符"t" :
文字广告:你是站长吗?注册阿里妈妈赚广告费

最近发表

归档

全部
Creative Commons License
此 Blog 中的日记
遵循以下授权:
Creative Commons
(创作共用) 授权
.
Google PageRank
本站被Adobe官方MXNA新闻聚合器收录
本站被蓝色理想BXNA收录