October 17, 2006

【黑羽】注意!超简便的事件发送&管理器EventSender 1.5版发布

ActionScript3天地会公测中...

Version 1.5版本发布
下载: EventSender Ver1.5:超简便的事件发送&管理器
语言:ActionScript 2.0
大小:8kb

超简便的事件发送器发布后,很多美工兄弟都很喜欢它。下载的次数也蛮多,也有不少人转载。在美工编辑MovieClip时,爱在那帧发事件,就在那帧发事件;要谁发事件,谁就发事件!两行代码就搞定。轻松方便。
但ActionScript 开发者们不乐意了,这玩意好用,但你却建议我们不要多用,这不是吊人胃口吗?!你就不能改进一下的??而且这两次开发游戏,代码和美工打交道多,且软件架构就有好几层。开发者同事都爱用这个东东,屡禁不止。

堵之不如导之,所以我就花了一些时间,增加了EventSender的功能,使之适合在大项目工程中使用。
新手也可以用,一旦发现使用官方的事件发送机制不方便时可以试试我这个东东。

大家可能注意到标题中EventSender不再是简单的发送类了,还多了一个头衔,管理器。到底有多好用呢?听我慢慢道来。
先发一个API总览:


public static var debug:Boolean = false;

public static function send(evtType:String, targetObj:Object):Void

public static function dispatch(evtObj:Object):Void;

public static function addListener(evtType:String, lisObj:Object) ;

public static function removeListener(evtType:String, lisObj:Object) ;

public static function showQueue(); //abandoned: reserved to keep campatibility with old applications;

public static function getQueue();

public static function removeEvents (evtType:String)

public static function removeListeners(lisObj:Object);

public static function reset();


只要是编过一点稍微有规模的AS2程序的人都知道,查找Event发送者是一件很痛苦的事儿。
而且事件用多了,都不知道加成功了没有,删除成功了没有,目前还有多少事件侦听器依然有效等等。
对程序调试来说,是一大痛苦。
如果事件发送者是在和我们打交道的类下面的组成子类中的组成子类,那么我们要做多层桥接来getEventDispatcher(),更是非常不方便。

AS3中有事件冒泡机制,可以层层上递,非常方便。那么AS2就一定要受这个苦吗?不必要。用事件发送器EventSender发送和接受都很简单。老API使用方法见:
【黑羽】超简便的事件发送器:EventSender类

这个工具类编程不难,但也花了一些我不少时间来编写调试和写帮助。希望对大家有所助益!当然了,如果你在你项目中使用了这个小工具,能够在感谢中给我和我的博客留个名,我也是非常高兴的。如果空间不够,那就算了。:-)

本次1.5版本新增功能有:
1.EventSender.debug = true;
如上句,设置debug标志等于true后,那么使用EventSender会出现很多对调试有帮助的信息。

2.removeListener(evtType:String, lisObj:Object)
代码范例:


//随时随地
EventSender.removeListener(事件名称,侦听器);

早就加入的移除函数侦听,但一直没有在公布的版本中更新。抱歉,这次大家一起更新了吧。用法格式与官方相同,大家一定很习惯。

如果将EventSender. debug设为true后:
(a)如果你remove了一个并不存在的(事件,侦听器),那么会输出面板会出现提示信息:


<<<< EventSender:!!!!Error:
eventtype=事件名or listener=[侦听器类型] is not in the EventSender's queue

(b)如果你不小心多remove 了一次某个(事件,侦听器),那么输出面板会出现提示信息:

<<<< EventSender:!!!!Warning:
eventtype=sdf or listener=[type Function] is already removed

更有意思的功能来了:
3.removeListeners(lisObj)
呵呵,比removeListener多了一个s,意思是将侦听器为lisObj绑定的所有事件统统清除。
方便吧,呵呵。
适合在destroy()函数中使用。再说明白点,举个例子,如果你注册了很多事件给lisObj,那么只需要下面一句就可以统统删除


EventSender.removeListeners(侦听器);

如果debug设为true,那么:
(a) 如果你用对了,会告知你共删除了几次listener,你心里也就知道了去掉了几个侦听器。对调试很有帮助。

EventSender:==========found Listener=[侦听器类型]:次数 times, and removed all of them ======

(b) 如果你删除错了侦听器,那么会输出:

<<<< EventSender:!!!!Error:
listener=[侦听器类型] is not in the EventSender's queue

(c)之前已经删过这个的侦听器了,那么会告诉你之前删除过几次

<<<< EventSender:!!!!Warnging:
listener=[侦听器类型] is not found this time!!
this Listener was removed 次数 times before. please check again.

4.removeEvents(事件名称);
和上一个功能相似,清除所有事件名为“事件名称”的事件侦听机制。
调试信息与以上相似,不赘述了。

5.getQueue():Array
返回所有事件队列,每个Array元素结构为 "{type:String, listener:Object}"。本功能供高级使用者使用。
如果设置debug= true,那么会在输出面板显示信息:


EventSender:==========all events and listeners ======
No.0 type:事件名 listener:[侦听器类型];
No.1 type:事件名 listener:[侦听器类型];
No.2 type:事件名 listener:[侦听器类型];
============ END ===============

6.reset():Void
删除EventSender中所有的事件侦听机制,重新开始。
如果设置debug=true,会告诉我们共清空了几个机制:


EventSender:==========all events and listeners are cleared. Total Number:次数

API介绍完了。可以看出使用EventSender来发送和管理事件非常方便,顺手。但如果在大项目中使用,那么有以下几点要注意:
1.事件名称的管理。
(a)如果有几百个事件名称,难保不发生冲突。比较好的办法是,为每个项目建立一个Event类,集中管理事件名称。


class TestEventList {
public static var CLICKSPOT:String = "clickspot";
public static var CLICKPOINT:String = "clickpoint";
public static var CLICKSQUARE:String = "clicksquare";

}


使用时,就这样使用,有点像AS3提倡的用法

EventSender.addListener(TestEventList.CLICKPOINT, listenerObj);

(b)更好的方法是借鉴AS3的思路,建立相应的Event类,和EventList类进行管理。EventSender来dispatch的都不是一般的Object,而是定义好的Event类的实例。
Event类和EventList类都可以继续扩展,适应整个系统的科学架构。
以下是我项目中的实例代码


class com.test.plugin.events.NoteEvent extends TestEvent {
public var type:String = SimtestPluginMng.NOTE;
public var target:Object;

估计看到这一部分的都是有经验的老手,我也不多废话了,看一点就都会明白我是什么意思了。

2.定期的释放和清理
以前使用官方的事件机制时,要特别注意清除侦听器。一旦注册事件过多,很难管理。但现在有了removeListeners(ListenerObj)和removeEvents(Event)就可以轻松管理大量事件。更有reset()。拿不准的还有getQueue()供调试和特殊使用。getQueue()可以给你所有的事件和侦听器列表,让你从始到终,对事件的管理井井有序,清清楚楚。不再为以前来无踪去无影或层层嵌套的事件机制烦恼了。

希望大家喜欢。

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

TrackBack

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

Comments (9)

Yang:

哈, 我来报名了.
你到Leavic那里看看,那个span插件有更好的了。

这么多好东西啊
我就不客气收下了 ^_^

唉,自己以前推荐的插件现在自己都不用了,还要拖累一大帮兄弟,惭愧惭愧。

acfeel:

你好,很喜欢你的博客。
申请下文字友情链接
博客名:ACfeel经典广告
网址:http://www.acfeel.com
贵站连接已做好:)

vicki:

您好,我想问一下您,在Flash里面 TextArea 控件怎样输入上标和下标,就是Html标签里面的和,问了好多人都连一个头绪都没有。万分感谢!~我用的是AS3

飞雨影:

一直想写个这样的,无奈水平有限,总是写得不够好。做得不错,好东西。

我刚试了一下,还不错

brandon:

我见到的as2下解决事件管理的最好方法了,非常非常感谢!

一定要好好研究一下,支持你~!

留下高见,发表评论

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

姓名和Email必填。

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

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

最近发表

归档

全部
Creative Commons License
此 Blog 中的日记
遵循以下授权:
Creative Commons
(创作共用) 授权
.