应用思考-教育技术论坛

标题: AS3中访问主时间轴的方法兼谈元件绑定类的应用 [打印本页]

作者: etthink    时间: 2012-12-8 10:33
标题: AS3中访问主时间轴的方法兼谈元件绑定类的应用
在AS2中访问主时间轴非常方便,一个_root即可解决,但在AS3中使用root却经常出现问题,特别是在元件内部或者在绑定的类中访问更是经常出现问题,其主要原因在于:
1,在AS3中一些大家常用的主时间轴命令已经不是顶级函数,如play();stop()等,因此在很多地方已经不能直接使用,必须在相应对象实例化后才能使用。
2,root在as3中代表显示容器的顶级对象,但其只有转换为具体的显示对象实例才可以访问其相应属性与方法。

下面以一个例子,来简单说明在AS3中如何访问主时间轴
(, 下载次数: 69)
   这个示例非常简单,即主时间一个形变动画,使用一个按钮来控制这个动画播放,可以将命令直接写在主时间轴上,此时可以直接调用:play()函数,因为此时主时间轴(root或MainTimeLine)在函数执行间已经完成实例化。
   但为了说明类绑定的使用,我们将按钮的功能利用元件绑定类,放在类文件中即:mplay.as
   注意在类中:就不能直接调用play()而必须等主时间轴实例化之后才能调用。
    (, 下载次数: 73)
mplay功能:
  1. package  {
  2.         import flash.display.*;
  3.         import flash.events.*;
  4.         import flash.events.MouseEvent;
  5.         
  6.         public class mplay extends SimpleButton{

  7.                 public function mplay() {
  8.                         this.addEventListener(MouseEvent.CLICK,playF);
  9.                         
  10.                 }
  11.                 function playF(event:MouseEvent):void {
  12.                         trace("hi");
  13.                         (this.root as Object).play();
  14.                         }

  15.         }
  16.         
  17. }
复制代码
使用元件绑定类的最大优势在于:既能实现了代码分离,也充分利用了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是动态类的实例化的因素吧。

示例文件下载: (, 下载次数: 102)


作者: 安丰塘往事    时间: 2012-12-8 10:34
每天的太阳都是新的,每天都是好的开始[tthread=baby-boyer, 彭小叙]http://app.qlogo.cn/mbloghead/e2cd915c2ec77e961afa[/tthread]
作者: 安丰塘往事    时间: 2012-12-10 11:03
转播微博[tthread=ningxia1523, 宁小霞]http://app.qlogo.cn/mbloghead/c24087dfbe4b972a376e[/tthread]
作者: 东拼西筹    时间: 2012-12-15 15:25
用as符给root强制转换类型为一个非空值,就可以通过编译了

如果root=null,再怎么转换也是null,向下转换前提还要本身不为null。。。




欢迎光临 应用思考-教育技术论坛 (http://www.etthink.com/) Powered by Discuz! X3.4