在AS2中访问主时间轴非常方便,一个_root即可解决,但在AS3中使用root却经常出现问题,特别是在元件内部或者在绑定的类中访问更是经常出现问题,其主要原因在于:
1,在AS3中一些大家常用的主时间轴命令已经不是顶级函数,如play();stop()等,因此在很多地方已经不能直接使用,必须在相应对象实例化后才能使用。
2,root在as3中代表显示容器的顶级对象,但其只有转换为具体的显示对象实例才可以访问其相应属性与方法。
下面以一个例子,来简单说明在AS3中如何访问主时间轴:
这个示例非常简单,即主时间一个形变动画,使用一个按钮来控制这个动画播放,可以将命令直接写在主时间轴上,此时可以直接调用:play()函数,因为此时主时间轴(root或MainTimeLine)在函数执行间已经完成实例化。
但为了说明类绑定的使用,我们将按钮的功能利用元件绑定类,放在类文件中即:mplay.as
注意在类中:就不能直接调用play()而必须等主时间轴实例化之后才能调用。
mplay功能:- package {
- import Flash.display.*;
- import flash.events.*;
- import flash.events.MouseEvent;
-
- public class mplay extends SimpleButton{
- public function mplay() {
- this.addEventListener(MouseEvent.CLICK,playF);
-
- }
- function playF(event:MouseEvent):void {
- trace("hi");
- (this.root as Object).play();
- }
- }
-
- }
复制代码 使用元件绑定类的最大优势在于:既能实现了代码分离,也充分利用了FLASH可视化编辑优秀。
另关于在元件中访问主时间轴的方法详细说明如下:
在主时间轴上定义
var a:Number=100;
在其他时间轴上怎么访问这个变量呢?
比如我新建一个mc,把他放到主场景里面,在这个mc的侦上怎么访问a?
trace(root.a);
trace(parent.a);
这两种方法都出现错误 1119: 访问可能未定义的属性 a
正确的写法应当是:(root as MovieClip).a
以调用主时间轴的gotoAndPlay()函数为例): //方法1,共N种解决方式,效果都一样
(this.root as MainTimeline).gotoAndPlay(2);
(this.root as Object).gotoAndPlay(2);
(this.root as MovieClip).gotoAndPlay(2);
Object(this.root).gotoAndPlay(2);
MovieClip(this.root).gotoAndPlay(2);
MainTimeline(this.root).gotoAndPlay(2); //方法2
//var test:Object=this.root;
//test.gotoAndPlay(2); //方法3
//root["gotoAndPlay"](2);
对于加载的 SWF 文件中的显示对象,root 属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。 对于代表已加载图像文件的位图对象,root 属性就是位图对象本身。 对于第一个加载的 SWF 文件的主类的实例,root 属性就是显示对象本身。 Stage 对象的 root 属性是 Stage 对象本身。 对于任何未添加到显示列表的显示对象,root 属性设置为 null,除非它已添加到符合以下条件的显示对象容器:不在显示列表中,但属于已加载 SWF 文件中顶级显示对象的子级。
例如,如果您通过调用 Sprite() 构造函数方法创建新的 Sprite 对象,则其 root 属性将为 null,除非您将其添加到显示列表中(或添加到不在显示列表中但属于 SWF 文件中顶级显示对象的子级的显示对象容器中)。
对于加载的 SWF 文件,即使用于加载文件的 Loader 对象未在显示列表中,SWF 文件中的顶级显示对象也会为其本身设置 root 属性。 在 Loader 对象添加为对其设置 root 属性的显示对象的子级前,它不会设置自己的 root 属性。
编译时,元件还没有添加到显示列表里面,这时元件里面的this.root的值是null,还没有给赋值,所以编译出错。。用as符给root强制转换类型为一个非空值,就可以通过编译了。
编译通过开始运行时,元件开始显示时,this.root会被赋值实例话,就可以调用主时间轴下得变量和函数了,AS3编译比较严格,所以就爆出了错误1061: 调用可能未定义的方法 。
之所以提示是“可能未定义的方法”,是因为root是动态类的实例化的因素吧。
示例文件下载:
元件类绑定-访问主时间轴方法.rar
(12.58 KB, 下载次数: 613)
|