在ActionScript 3.0使用自定义事件
进入新公司快两周了,这两周里基本在自学as语言基础。最近新游戏立项了,版本发布计划也出来了。工作压力终于来了。对于一个as新人,第一次就要面对巨量代码,感觉有点凌乱。本文作为作者平时学习笔记,特此记录。
首先,我们知道,在as3中可通过dispatcher(event)触发事件,addEventListener(type,handler)监听事件,removeEventListener(type,handler)移除监听。
现假设有上级(Leader),工人(Worker)各一名,上级给下级安排工作,这个过程中的安排工作事件在as3基类库是没有的。因此我们想到了定义自己的事件。这个自定义的事件或许可以是这样的:
package events { import flash.events.Event; /** * 自定义事件,代表上leader给worker安排工作的事件 */ public class ArrangeEvent extends Event { public static const ARRANGE_WORK:String="arrange_work"; //工作数组,表示有多少工作安排 private var _works:Array; public function get work():Array{ return this._works; } public function ArrangeEvent(type:String,works:Array, bubbles:Boolean=false, cancelable:Boolean=false) { this._works=works; super(type, bubbles, cancelable); } } }
由于可同时安排多个工作,因此在事件中有个Array类型的_works变量用以保存上级给工人安排的多个工作。
接着是上级(Leader)类定义,由于要在其对象上调用dispatcher方法,因此需要继承自flash.events.EventDispatcher类:
package events { import events.ArrangeEvent; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; /** * 上司类,可给worker指派工作 */ public class Leader extends EventDispatcher { private var _name:String; public function get name():String{ return this._name; } public function Leader(leader:String,target:IEventDispatcher=null) { this._name=leader; target=this; super(target); } //leader给worker安排工作 public function arrange(works:Array):void{ var event:ArrangeEvent=new ArrangeEvent(ArrangeEvent.ARRANGE_WORK,works); dispatchEvent(event); } } }
Leader类有个公有arrange方法表示给工作指派工作,该方法惟一要注意的是dispatchEvent方法发送了上一步中我们自定义的ArrangeEvent事件。另外我在构造函数中将target指向该类自身不知道正确与否?经过测试有无此步都可得到预期的结果,园子里有高人可帮忙看看。
然后是工人类(Worker),代码如下:
package events { import events.ArrangeEvent; /** * 工人类,可接受上司工作安排 */ public class Worker { private var _name:String; public function get name():String{ return this._name; } public function Worker(name:String) { this._name=name; } //响应leader派发工作事件 public function doWork(event:ArrangeEvent):void{ trace("上司" + event.target.name + "您好!您安排的工作是:/r" + event.work); trace("我是"+name+",我会将工作立马完成!"); } } }
工人类中需定义一个方法对上级指派工作时作出响应。在这里是doWork方法,接收我们自定义的ArrangeEvent类型参数。event.target指向的便是向其指派工作的上级(Leader)。
最后是程序入口:
package { import events.ArrangeEvent; import events.Leader; import events.Worker; import flash.display.Sprite; public class UserEvent extends Sprite { public function UserEvent() { var leader:Leader=new Leader("leader1"); var worker:Worker=new Worker("worker1"); //注意,只能监听自己发送的事件 leader.addEventListener(ArrangeEvent.ARRANGE_WORK,worker.doWork); leader.arrange(["偷菜","接送女儿上学","完成ppt"]); } } }
我们让上级实例leader监听了ArrangeEvent事件,以工作的doWork方法作为handler响应该事件。需要特别注意的是,事件发送者和监听者必须为同一个对象(实例)。
笔者在这一点上走了不少弯路,希望看到本文的朋友们不要在这一点上再犯了同样错误。另本人是as新手,如果对此的理解不对,敬请各位高手不吝赐教。
程序运行结果在这里,例子比较简单就不上传源文件了:
邮箱: caochao88@gmail.com
出处: http://www.cnblogs.com/tudas
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。