Flash AS学习:深入BroadcasterMX

  AsBroadcaster看不到原文件,这个跟那个差不多,只有一点不同,可以研究一下广播是怎么实现的。
如果你看这帖子格式怪怪的,可以到这看,格式清晰一些。

以下内容为程序代码:
class mx.transitions.BroadcasterMX { 
 #include "Version.as"
  //版本信息
 private var _listeners:Array;
 //_listeners列表
 static function initialize (o:Object, dontCreateArray:Boolean) {
  /*
  静态方法initialize(),用来把参数o变成事件源
  dontCreateArray这个参数如果设置为true则不给o创建_listeners数组,偶不知道为什么有这个参数,
  貌似不给o创建_listeners数组,广播就没有用了。哪位高人知道为什么,希望给我解释解释。。
  */
  if (o.broadcastMessage != undefined) delete o.broadcastMessage;
  //如果对象o已经存在broadcastMessage,则删除
  o.addListener = mx.transitions.BroadcasterMX.prototype.addListener;
  //使o对象具有addListener方法,见后边知识点1
  o.removeListener = mx.transitions.BroadcasterMX.prototype.removeListener;
  //使o对象具有removeListener方法,见后边知识点1
  if (!dontCreateArray) o._listeners = new Array();
  //_global.ASSetPropFlags (o, "addListener,removeListener,_listeners", 1);
  //隐藏addListener,removeListener,_listeners
 }
 function addListener (o:Object):Number {
  //填加兼听者,送给监听者一个broadcastMessage方法,并把他填到广播器的订阅列表_listensrs中
  this.removeListener (o);
  if (this.broadcastMessage == undefined) {
   this.broadcastMessage = mx.transitions.BroadcasterMX.prototype.broadcastMessage;
   //_global.ASSetPropFlags (this, "broadcastMessage", 1);
  }
  return this._listeners.push(o);//这里返回数组长度
 }
 
 function removeListener (o:Object):Boolean {
  //从广播器列表中删除一个监听器
  var a:Array = this._listeners; 
  var i:Number = a.length;
  //这里用while没用for,就是遍利列表,从中删除o,如果列表空了,就把broadcastMessage也删了
  while (i--) {
   if (a[i] == o) {
    a.splice (i, 1);
    if (!a.length) this.broadcastMessage = undefined;
    return true;
   }
  }
  return false;
 }
 
 function broadcastMessage ():Void {
  //发出广播函数
  var e:String = String(arguments.shift());
  //将传入的第一个参数转换成String类型,这个参数应该是个函数名,见后边知识点2
  var a:Array = this._listeners.concat();
  //concat方法参数为空的时候返回数组的副本(见帮助)
  var l:Number = a.length;
  for (var i=0; i<l; i++) a[i][e].apply(a[i], arguments);
  //遍利列表执行函数,并把参数传过去,apply用法见知识点3
 }
};

知识点:1.
as1中给自定义类填加方法有两种方法:
A:写在函数中

以下内容为程序代码:
function A(){
 this.myFunc = function(){trace("A.myFunc");}
}

B:写在函数的原型-prototype上

以下内容为程序代码:
function B(){
}
B.prototype.myFunc = function(){
 trace("B.myFunc");

到了as2中:
以下内容为程序代码:
class a{
function haha(){
trace(".......")
}
}

这个haha方法写到哪了呢?经过h人提点,看了看asv,答案果然是h人所说的,写在prototype上的,相当与B的写法.
知识点:2.
调用函数的时候,会在函数内部自动生成一个argments对象,这个对象是你传入函数的所有参数组成的数组。
arguments.shift()是数组的第一个元素。
知识点:3.
apply是Function类的方法,也就是说所有的function都有这个方法。这个方法使一个函数在另一个域中工作,不知道描述对不- -b看例子吧

以下内容为程序代码:
a = {};
a.toString = function() {
 return "我是a";
};
function 函数() {
 trace(this);
 trace(arguments);
}
函数(1, 2, 3);
//输出:_level0  1,2,3
函数.apply(_root, [1, 2, 3]);
//输出:_level0  1,2,3
函数.apply(a, [1, 2, 3]);
//输出:我是a  1,2,3

明白点了吧,for (var i=0; i<l; i++) a[i][e].apply(a[i], arguments);
看这个是类中最后遍历那段,遍历列表,a[i]为监听器列表中的每个元素,a[i][e]就是是每个对象的e方法,a[i][e].apply(a[i]),就是在a[i]域中执行a[i][e]方法,别忘了把参数传过去,就这样了。a[i][e].apply(a[i], arguments)。好了完了,上边有个问题谁给回答了~谢谢
睡觉了88

时间: 2024-09-11 16:37:28

Flash AS学习:深入BroadcasterMX的相关文章

Flash从零开始学习创建单选按钮

核心提示:Flash从零开始学习创建单选按钮教程. 我们将使用画图工具和ActionScript 3.0中的时间轴,鼠标事件做一个好看的单选按钮. 最终预览 我们先看一下最终作品: 第一步:概述 一个单选按钮或选项按钮是一个图形用户界面元素,允许用户只选择一个预定义的选项集的类型. 在这个教程中,我们将创建一个传统的单选按钮. 第二步:设置Flash 打开Flash创建一个新文档,舞台大小设为320*190,颜色为#181818 ,帧频为 24fps. 第三步:界面 这是我们将要使用的界面:一个

Flash怎样学习鼠绘

  "Flash动画鼠绘入门班"第一课教材--认识鼠绘 序言 针对网络学员以初学电脑作图为多的特点,为使学员了解认识鼠绘的慨念.学习的目的及有关方法,为培养学习鼠绘的兴趣,树立信心,为继续深入学习鼠绘奠定基础而举办本期鼠绘入门班.因此本期鼠绘班不同于以往的鼠绘教材.它的宗旨就是领你入门. 第一课的主要内容: 1.闲话鼠绘 2.怎么样学习鼠绘 3.认识软件 一.闲话鼠绘 1.首先认识一下鼠绘: (1)鼠绘的概念:在电脑上用鼠标控制相关软件绘制的画; (2)鼠绘与纸画的不同之处:鼠绘的可修

Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地

必须有摄像头上面的演示才能正常播放. 思路 使用摄像头以及在线抓屏在上一节Flash/Flex学习笔记(2)捕获摄像头 里已经讲过了就不重复粘贴了至于在客户端保存文件Flash里用起来也很简单:直接调用 FileReference 即可另外为了减少图片大小还可能借助AS3.0的扩展库项目地址http://code.google.com/p/as3corelib/把bmp格式的位置转换成jpeg再保存   扩展 结合本文的方法再配合Flash/Flex学习笔记(4)如何打开网页及Get/Post数

Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K

以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害. 用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):

Flash/Flex学习笔记(57):实用技巧

布朗运动: varnumDots:uint=50; varfriction:Number=0.9; vardots:Array; varlife:uint=0; functioninit(){ graphics.lineStyle(0,0xffffff,.5); dots=newArray(); for(vari:uint=0;i<numDots;i++){ vardot:Ball=newBall(2,0x00ff00); dot.x=Math.random()*stage.stageWidth

Flash/Flex学习笔记(46):正向运动学

所谓"正向运动学"通俗点讲就是把几个连接部件的一端固定起来,另一个端可以自由(向前/向外)运动.比如人的行走,单个下肢可以理解为脚连接小腿,小腿连接大腿,大腿连接腰.行走的过程,相当于二条腿相对固定于腰部,大腿运动驱动小腿,小腿又驱动脚,从而带动整个连接系统的一系列运动. 先来一个基本的关节类Segment:(就是一个圆角矩形+二个小圆圈) package { import flash.display.Sprite; import flash.geom.Point; public cl

Flash/Flex学习笔记(24):粒子效果

粒子爆炸: 仍然要用到以前的小球类,不过稍加改造 package { import flash.display.Sprite; //小球 类 public class Ball extends Sprite { public var radius:uint;//半径 public var color:uint;//颜色 public var vx:Number=0;//x轴速度 public var vy:Number=0;//y轴速度 public function Ball(r:Number

Flash/Flex学习笔记(25):摩擦力与屏幕环绕

摩擦力: 假如一个物体在某个方向上沿直线运行,摩擦力会使该方向上的速度越来越小,直到停止. 上图示意了该过程,物体以moveAngle角度正向运动,最终的速度speed矢量为vx矢量与vy矢量的矢量和,在每个单位时间内的位移即Speed矢量的大小,分解到x,y轴后,即为vx与vy:加入摩擦力后,speed矢量每单位时间将减少Friction值,也就是视觉上的越来越慢. var ball:Ball = new Ball(10); ball.x = stage.stageWidth/2; ball.

Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动

对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象,这startDrag/stopDrag是不能用的,这时候只能采用最通常用做法:利用Mouse_Down,Mouse_UP,Mouse_Move事件来处理 注意:对象的Mouse_Move事件,只有当鼠标在对象上时才能被监听,如果用户鼠标移动过快,超出了对象的范围,该事件就不起作用了,所以监听Mous

Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器

今天折腾了大半天,总算搞出了一个功能简单的视频播放器,可以向公司领导交差了 :) 步骤: 1.Flash CS4 中 先拖一个"FLVPlayback"组件到舞台上 注:FLVPlayback本身已经具备了flv播放的基本功能,简单设置下属性就能播放视频了 2.加载xml数据源 xml数据源格式如下: <?xml version="1.0" encoding="utf-8"?> <data> <item flv=&q