http://bbs.9ria.com/viewthread.php?tid=79831&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
今天找到分析Stage,root,和MainTimeLine之间关系的文章,特此转载,共同学习!
当创建Flash文档文件时,系统会自动创建舞台和主时间轴这两个对象,舞台和主时间轴都属于容器.那么是舞台包含主时间轴呢? 还是主时间轴包含舞台呢?
在ActionScript 3.0中,舞台做为顶级容器,所有的显示对象都直接或间接的包含在舞台中.所以主时间轴也包含在其中.
默认情况下,主时间轴位于舞台的左上方,如果不用程序去改变主时间轴的位置,主时间轴将永远位于舞台的左上方.
变量stage与舞台
舞台有自己的名字:stage. 这个名字实际上是变量名,即stage是控制舞台的变量. 通过stage就可以动态的控制舞台. 由于stage是系统自定义的,所以就不需要用户再去定义,因此可以直接使用变量stage.
// 输出stage=[object Stage] ,object代表对象,Stage表示类. 所以stage是Stage类的对象.
trace("stage="+stage);
类可以看出是创建对象的模板,既舞台stage是由Stage类创建的. 因此以后就可以把舞台成为舞台对象了.实际上, 任何变量都与类有关.当用trace函数输出变量时,会自动调用toString()方法. 对于不同的类,它的toString()方法返回的信息就有所不同. 像Stage类的toString()方法返回的是"[object 类名]"的信息.
舞台是保存数据的容器,并且舞台容器中又有很多小的容器,所以舞台是容器的容器.通过这种容器的嵌套,就可以保存非常复杂的数据. 像这种复杂数据的东西一般被称为负责对象.要访问对象中的变量,需要使用点语法,形式如下:
对象名.变量名
例如,对于舞台这个复杂对象来说,它的对象名就是stage,可以用下面的代码来定义和访问舞台中的变量:
//定义舞台的帧频
var frameRate = 12;
//定义舞台的宽和高
var stageWidth = 550;
var stageHeight = 400;
//访问stageWidth变量
trace("舞台的宽度:" + stage.stageWidth);
对象中的变量在面向对象编程中称为属性, 属性由属性名和属性值组成. 属性名其实就是变量名,属性值就是变量值. 访问对象的属性的形式为:
对象名.属性名
应当说明的是,舞台的帧频,宽高是在[属性]面板中设置的,而与前面用var定义的孤立(root)变量的设置无关.而通过点语法虽然可以读取舞台容器中的非孤立变量值,但是由于Flash为这些变量规定了只读属性,所以暂时尚无法通过类似"stage.stageWidth = 800"这样的语句为舞台中的变量重新赋值.
变量root与主时间轴
主时间轴与舞台类似,也是容器的容器.即变量root保存的也是复杂数据,主时间轴也是用类创建的.管理主时间轴的类叫MainTimeline类.
//输出root = [object MainTimeline]
trace("root = "+root);
前面写的代码都是在帧的[动作]面板中, 所以定义的变量都应属于主时间轴.可以这样认为,写在帧中的变量都在MainTimeline类中,而root是由MainTimeline类创建的对象,这些变量都成了root的属性,因此可以用"root.属性"的形式来访问这些变量. 例如:
//定义变量
var speed = 10;
//直接访问变量
trace("speed="+speed);
//把变量当成属性访问
trace("speed="+root.speed);
另外,MainTimeline类是动态类, 由动态类创建的root可以动态地添加属性:
//向root动态添加属性propl
root.prop = 5;
//尝试直接访问propl
trace(prop);
//通过点语法访问
trace(root.prop);
从上面测试的两段程序可以看出,在主时间轴上用var定义的变量会呗添加到MainTimeline类中,成为主时间轴root的属性, 而通过root动态添加的属性并没有添加到MainTimeline类中.
这里特别要注意,Stage类不是动态类,不能向舞台stage动态的添加属性,下面的代码是错误的:
stage.prop = 5;
另外,由类创建对象的过程称为实例化,所以由类创建的对象也称为实例.因此, 可以称舞台stage是Stage类的实例,主时间轴root是MainTimeline类的实例.