stage和root

当创建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类的实例.

你可能感兴趣的:(stage和root)