在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新手,如果对此的理解不对,敬请各位高手不吝赐教。

  程序运行结果在这里,例子比较简单就不上传源文件了:

posted @ 2012-07-21 12:49  caochao88  阅读(1064)  评论(2编辑  收藏  举报