[AS3]as3的Stage、stage、root、this和MainTimeline相互关系
有些教程里的话,可能已经说得很明白,可是,往往看罢仍旧不知所云。所以,用最简单的语言,把一个意思说清楚,真不容易!
下面这句话:“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”是什么?
它们之间到底是什么关系?
“在时间轴写代码”实际上、本质上是在向什么地方写代码?
- //CuPlayer.com提示,做一下测试:在时间轴上写代码
- trace(this)//[object MainTimeline]
- trace(root)//[object MainTimeline]
- trace(this.root)//[object MainTimeline]
- trace(this==root)//true
- trace(stage==root)//false
- trace(stage)//[object Stage]
- trace(Stage)//[class Stage]
- trace(stage.parent)//null
- trace(this.parent)//[object Stage]
- 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就是舞台的宽。余略。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例