stage和MainTimeLine是不一样的

在开发flash应用时,必不可少的就是将原件添加到舞台上,所以天天都会用到下面的语句

this.addChild(mc);
//或
stage.addChild(mc);

今天在学习load加载swf交互方法时,突然发现stage和this是不一样的(我这里指的是在主时间轴或文档类中使用stage和this)

  • stage:可以看做是一个静态顶级变量。不管在哪里调用,都是指最外层swf的舞台。
  • this:它是文档类(如果没有文档类,在编译时会自动生成)的一个实例对象,同样也是stage的child。

所以通常的this.addChild或addChild都添加到了文档类MainTimeLine的实例中;而stage.addChild是直接添加到了舞台上。

对于加载与被加载swf,stage和this的层次关系是

通过下面的实例可以更好的理解这一点:

一、创建子SWF

创建一个名为ext_swf的文件,并创建两个尺寸相同的蓝色和红色的矩形,通过下面的代码将他们添加到舞台上

this.addChild(new Red());
//蓝色框始终在(0,0)位置,因为它永远在stage上
stage.addChild(new Blue());

编译ext_swf.swf后,只能看到蓝色矩形,因为它把红色矩形完全覆盖了,效果如下:

二、加载SWF

创建一个名为container的文件,通过loader加载ext_swf.swf,并将loader添加到舞台上,代码如下:

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;

var loader:Loader=new Loader();
loader.load(new URLRequest("ext_swf.swf"));

addChild(loader);
//红色框会被移动到(200,200)的位置
//因为它被添加到ext_swf的主事件轴实例上
loader.x=loader.y=200;

你觉得结果会是什么样子的呢?是不是像下面这样呢?

因为红色矩形是通过this.addChild添加,所以它的父级是文档里对象,也就是MainTimeLine。所以它会随着这个对象位移。

而蓝色矩形是通过stage.addChild添加的,所以它始终都是以stage的坐标系为基准的。

源代码下载

联系作者

公众号:拉小登 | 微博:拉登Dony | B站:拉小登Excel

6 Replies to “stage和MainTimeLine是不一样的”

  1. 一、创建子SWF
    创建一个名为ext_swf的文件,并创建两个尺寸相同的蓝色和红色的矩形,通过下面的代码将他们添加到舞台上

    1
    2
    3
    this.addChild(new Red());
    //蓝色框始终在(0,0)位置,因为它永远在stage上
    stage.addChild(new Blue());

    这里一段觉得好像不能表示什么吧,蓝色后addChild所以在最上层。
    不过很赞同你另外所说的。
    学习了

  2. 嗯嗯,我刚看想说的就是这个问题,这个不能说明什么的,虽然理解的人都知道,但是新手小白是看不懂的!少年!

    -bylanzhipeng

  3. 子级的SWF文件中的stage貌似不能用吧?和主SWF中的stage应该会冲突 报错的吗?求解释…..

  4. 不冲突,只不过子级SWF的stage也是指的主SWF力的stage,他们其实是一个东东。
    这样会导致单独运行子级SWF时通过stage调用的对象是正常的,而在主SWF中加载子级SWF时,可能会因为stage引用主SWF的stage而引发错误!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注