·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3的Stage、stage、root、this和MainTimeline相互关系

时间:2013-03-16 10:30CuPlayer.com
Stage 类代表主绘图区。 舞台表示显示 Flash 内容的整个区域。无法以全局方式访问 Stage 对象。 而是需要利用 DisplayObject 实例的 stage 属性进行访问

有些教程里的话,可能已经说得很明白,可是,往往看罢仍旧不知所云。所以,用最简单的语言,把一个意思说清楚,真不容易!

下面这句话:“Stage 类代表主绘图区。 舞台表示显示 Flash ® 内容的整个区域。无法以全局方式访问 Stage 对象。 而是需要利用 DisplayObject 实例的 stage 属性进行访问。”你看明白了吗?

如果你看明白了,那我问你:

  “Stage” 和“舞台”是什么关系?

  “主绘图区”和“舞台”是什么关系?

  “主绘图区”以外的绘图区叫做什么区?在哪里?

  “而是需要利用 DisplayObject 实例的 stage 属性进行访问。”中的“DisplayObject 实例”它指身的的是谁?可以举出一个例子吗?

再看下面的话:

  “stage:最顶层舞台。root:stage的下一级舞台,属于第二层舞台(继承自DisplayObject)。this:当前的对象(如果是主时间轴上的this,那它就是root )。”

  “as3中的根即顶级容器是stage,stage是Stage类的唯一实例,当你创建一个文档时,就创建了stage实例。root就是 stage下的一个可视实例。”

  “由于stage和root都是容器,所以当在时间轴写代码时。可以有2个选择。即可在stage下添加对象。也可在root下添加对象。”

  “stage下有1个显示对象即root,而且root是在stage下,root是Timeline0类的实例。”

你看明白了吗?

如果你看明白了,我问你:

  “Stage”是什么?

  “stage”是什么?

  “root”是什么?

  “this”是什么?

  它们之间到底是什么关系?

  “在时间轴写代码”实际上、本质上是在向什么地方写代码?

  1. //CuPlayer.com提示,做一下测试:在时间轴上写代码 
  2. trace(this)//[object MainTimeline] 
  3. trace(root)//[object MainTimeline] 
  4. trace(this.root)//[object MainTimeline] 
  5. trace(this==root)//true 
  6. trace(stage==root)//false 
  7. trace(stage)//[object Stage] 
  8. trace(Stage)//[class Stage] 
  9. trace(stage.parent)//null 
  10. trace(this.parent)//[object Stage] 
  11. trace(root.parent)//[object Stage] 

从上面的测试,你明白了什么?

this :正如它的意思,是个代词,代指当前实例,写在时间轴上,就代指“时间轴”,那么当前时间轴是不是个实例呢?是谁的实例?

  trace(this)//[object MainTimeline]表明:时间轴是个类,叫MainTimeline类,我们写代码的时间轴是随着文档的建立自动创建的时间轴实例。

  因此,我们在时间轴上写代码,就是再在MainTimeline类里添加属性(变量)和方法(函数)。

Stage:是个类,是class。是顶级容器。不可访问。但它的唯一的实例,和主时间轴MainTimeline一样,在文档被创建的同时就被实例化了,就是stage。所以:
trace(Stage)  //[class Stage]

          trace(stage)   //[object Stage]

    再所以:Stage是类,是类名,不可访问;stage是Stage类的一个实例,是实例名,是顶级容器,可访问。

root:是主时间轴的实例。所以:
trace(MainTimeline)  //[class MainTimeline]
trace(root)      //[object MainTimeline]
trace(this.root)    //[object MainTimeline]

  结论:既然Stage类的实例stage是顶级容器,那么MainTimeline类的实例root,只能在stage容器里(也称“在stage下”),成为它的必然的儿子。

stage是顶级容器,所以 trace(stage.parent)  //null  就是说,它是始祖,没有父类了。

root 则成了stage的儿子:trace(root.parent) //[object Stage]

**上面还有一句话:“也可在root下添加对象。”

测试一下吧:

var zzc:Stars=new Stars()
root.addChild(zzc)

报错:场景 1, 图层'图层 1', 帧 1,2行 1061: 调用可能未定义的方法 addChild (通过 static 类型 flash.display:DisplayObject 引用)。
这个方法不行。

只好用this代替root:

var ss:Stars=new Stars
this.addChild(ss)
ss.x=300

var dd:Stars=new Stars
stage.addChild(dd)
dd.x=200

再测试一下,看看两者的父亲是谁?


trace(ss.parent,dd.parent)

输出信息是:      [object MainTimeline]      [object Stage]

他们的父亲果然不一样!

              我的老师的老师对他说:别人的话不一定对不对,亲自做一做验证一下就知道了。

      不要混淆了类和实例。

//....................................

问:“stage.width”和“stage.stageWidth ”、“stage.height”和“stage.stageHeight”区别是什么?

答:stage.width :stage上所有child构成的范围的宽(没东西width就是0)。stage.stageWidth:stageWidth就是舞台的宽。余略。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器