开启左侧

AS3中访问主时间轴的方法兼谈元件绑定类的应用

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

下面以一个例子,来简单说明在AS3中如何访问主时间轴
clas-sample.jpg
   这个示例非常简单,即主时间一个形变动画,使用一个按钮来控制这个动画播放,可以将命令直接写在主时间轴上,此时可以直接调用:play()函数,因为此时主时间轴(root或MainTimeLine)在函数执行间已经完成实例化。
   但为了说明类绑定的使用,我们将按钮的功能利用元件绑定类,放在类文件中即:mplay.as
   注意在类中:就不能直接调用play()而必须等主时间轴实例化之后才能调用。
    clas-sample-1.jpg
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是动态类的实例化的因素吧。

示例文件下载: 元件类绑定-访问主时间轴方法.rar (12.58 KB, 下载次数: 620)

学教育技术,上教育技术论坛!http://www.etthink.com

精彩评论3

正序浏览
安丰塘往事 发表于 2012-12-8 10:34:14
每天的太阳都是新的,每天都是好的开始[tthread=baby-boyer, 彭小叙]http://app.qlogo.cn/mbloghead/e2cd915c2ec77e961afa[/tthread]
欢迎大家多发帖,参与讨论,增进彼此了解。
安丰塘往事 发表于 2012-12-10 11:03:34
转播微博[tthread=ningxia1523, 宁小霞]http://app.qlogo.cn/mbloghead/c24087dfbe4b972a376e[/tthread]
欢迎大家多发帖,参与讨论,增进彼此了解。
东拼西筹 发表于 2012-12-15 15:25:50 | 显示全部楼层
用as符给root强制转换类型为一个非空值,就可以通过编译了

如果root=null,再怎么转换也是null,向下转换前提还要本身不为null。。。
欢迎大家多发帖,参与讨论,增进彼此了解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


11关注

462粉丝

7857帖子

推荐阅读更多+
会员达人更多+
广告位

最新信息

更多+

关注我们:教育技术人

官方微信

官方微博

教育技术热线:

13955453231

学教育技术,上教育技术论坛!

教育技术论坛征稿范围:教育技术应用案例、教程文章、优秀作品等。

Email:sf@etthink.com

Copyright   ©2007-2026  应用思考-教育技术论坛  Powered by©Discuz!  技术支持:且行资源    ( 皖ICP备10014945号-4 )