FlashMX2004的事件机制

2008-04-02 10:38:20来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  前言:论坛里关于AsBroadcaster(广播)类的讨论很多,有很多精妙的讲述,但为了和EventDispatcher(派遣)类有个比较,不得不把这位"老兄"拉来客串一下。对他我不会讲的很周详,不解的地方能够去搜搜前辈的帖子哦。

  AsBroadcaster(广播)类在MX(flash6)里写做"ASBroadcaster",这是为什么有时会发生以前的程式在2004版里发生异常的原因之一。AsBroadcaster 类具备四个静态的方法:

  ------------------------------------------------------------------------------

  static function initialize(o:Object);

  //o:对象

  //initialize:初始化方法,为对象o附加上作为事件源的各项功能。那么事件源都有什么功能呢?

  static function broadcastMessage(msg:String);

  //msg:消息

  //broadcastMessage:广播方法,事件源的一个主要功能就是向外界广播一条消息,告知听广播的人"某一事件发生啦!"

  static function addListener(o:Object);

  //o:对象

  //addListener:注册监听者方法,也就是决定广播消息给谁听的意思

  static function removeListener(o:Object);

  //o:对象

  //removeListener:注销监听者方法,也就是消息不再广播给谁听

  --------------------------------------------------------------------------------

  如此看来AsBroadcaster类也不怎么复杂嘛,下面看看他的具体使用吧!

  -----AsBroadcaster测试.fla 开始------

  var 司令部=new Object();

  //啊,司令部是个发布指挥消息的地方,用他做事件源是个不错的选择

  AsBroadcaster.initialize(司令部);

  //这里直接用AsBroadcaster来引用AsBroadcaster类,原因如上述

  //调用AsBroadcaster类的静态方法initialize,为司令部附加上作为事件源的各项功能

  var 步兵=new Object();

  //生成步兵对象

  步兵.on进攻=function(){

  //on进攻: 这里之所以用’on’做前缀,是为了表明这个方法是响应一定事件的方法

  trace("步兵接到司令部来电,轻装上阵,火速向敌方阵地前进!");

  // 接到’on进攻’消息后采取的措施

  }

  步兵.on驻守=function(){

  //同上

  trace("步兵接到司令部来电,就地待命,多设岗哨,严防来犯之敌!");

  }

  司令部.addListener(步兵);

  //将步兵添加为司令部的监听者,从现在起他将听从司令部的指令行事

  //以下雷同的地方,恕不赘述

  var 装甲兵=new Object();

  装甲兵.on进攻=function(){

  trace("装甲兵接到司令部来电,加足马力,火速向敌方阵地开进!");

  }

  装甲兵.on驻守=function(){

  trace("装甲兵接到司令部来电,就地待命,检修装甲,作好随时进攻的准备!");

  }

  司令部.addListener(装甲兵);

  var 炮兵=new Object();

  炮兵.on进攻=function(){

  trace("炮兵接到司令部来电,向敌方阵地猛烈轰击!");

  }

  炮兵.on驻守=function(){

  trace("炮兵接到司令部来电,就地待命,确保弹药准备充足!");

  }

  司令部.addListener(炮兵);

  //-------------------下面开始演示------------------------------------

  trace("司令部一号指示");

  司令部.broadcastMessage("on进攻");

  //司令部用’broadcastMessage’ 方法广播’on进攻’指令

  trace("司令部二号指示");

  司令部.removeListener(步兵);

  //"将在外,君令有所不授",司令部用’removeListener’方法注销了’步兵’听从指令的义务

  司令部.broadcastMessage("on驻守");

  //司令部用’broadcastMessage’ 方法广播’on驻守’指令。注意:步兵现在不会驻守哦

  -----AsBroadcaster测试.fla 结束-----

  具体的测试结果,大家试试便知。现在我们看看AsBroadcaster类的局限所在:

  1、假如司令部发出的指令是"向一号高地进攻",这个消息应该怎么广播呢?我们当然能够为步兵定义一个'on向一号高地进攻'的方法,然后监听司令部广播的'on向一号高地进攻'的消息。可是假如需要发出N个'向某高地进攻'的指令,岂不是要定义N个类似的事件方法?假如进攻的目标是随即确定的,那又该怎么去写?假如步兵同时监听"战地指挥部"的广播,他怎样根据不同的指挥者采取不同的措施?步兵并不能确定一个'on进攻'消息是来自司令部还是'战地指挥部'呀。所以说,AsBroadcaster类的第一个局限就是他虽然广播了一个'消息',却不能给出消息的具体说明。

  2、我们知道战争时期为了做到策略的"因时因地制宜",常常会设一个"战地指挥部"。假设我们希望把步兵的进攻的指挥权交给"战地指挥部",而把步兵的驻守权交给"司令部"。因为司令部同时拥有装甲兵和炮兵的进攻和驻守的指挥权,所以他能够广播"on进攻"消息,但一件意想不到事将会发生:步兵也跟着进攻了!

  为了防止出现差错,司令部就不得不在进攻前"removeListener(步兵)"。但为了防止广播 "on驻守"消息时步兵不再驻守,所以在广播完"on进攻"消息后必须再次"addListener(步兵)"。司令部何其累哉!所以说,AsBroadcaster类的第二个局限就是他注册了一个监听者,却并不关心监听者到底是监听他的什么事件。

  3、AsBroadcaster类的第三个局限其实是由第二个局限来的,就是他有些情况下会造成运行的低效。假设更有一支空军, 他有"on空袭"事件方法,并且归司令部指挥。当司令部广播"on空袭"消息时,得,步兵、装甲兵和炮兵就会也试图执行"on空袭"事件方法,当然是浪费时间啦.

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: FLASH转化为VCD没电脑也看FLASH

下一篇: 入门教程-倒影发光字