7.在不同的时间轴上访问变量
尽管在一个时间轴上的变量不能被其他时间轴上的脚本直接访问,但是它们可以被间接地访问。为了在不同的时间轴上创建变量、取回变量值、或为变量赋值,我们可以使用“点语句”(EMCA-262标准中的官方术语为:dot syntax)。点语句在面向对象的编程语言(如Java,C++,和JavaScript)中是一个很普通的标准符号。为了在不同的时间轴上定位某个变量,我们使用下述点语句的措辞通式: movieClipInstanceName.variablName
该通式描述了如何指向另一个时间轴上的某个变量:首先是该变量所在的电影剪辑的名字,随后是点操作符,最后是该变量的变量名。举例说明,在前面的设想中,为了在主时间轴上引用square电影剪辑中的变量x,我们可以这样: square.x
同样,在主时间轴中,我们可以这样引用circle电影剪辑中的变量y: circle.y
有了上述这些引用,我们可以在主时间轴上为square电影剪辑中的变量赋值以及取回它的值,象这样: square.z = 5; // assign 5 to z in square var mainZ; // create mainZ on the main timeline mainZ = square.z; // assign mainZ the value of z in square
你一定注意到了我频繁地使用限定词“主时间轴”。这是因为如果只是使用clip.variable这样的语法,那么我们就不能在circle电影剪辑中引用square电影剪辑中的变量。假设我们在circle电影剪辑的某个帧上的脚本代码中放置一个square.x这样的引用,解释器将试图在circle电影剪辑的内部寻找一个名为square的电影剪辑,但是,我们的square却位于主时间轴上。所以,为了从circle电影剪辑指向包含square电影剪辑的时间轴(在本例中是主时间轴),我们需要一种机制,而该机制带来了两个特殊属性形式:_root和_parent。
6.1_root和_parent属性 _root属性是对电影主时间轴的直接引用。从某个电影剪辑结构的任何嵌套深度中我们都能使用_root来定位主电影时间轴上的变量,象这样: _root.mainZ // access the variable mainZ on the main timeline _root.firstName // access the variable firstName on the main timeline
我们甚至能够将某个引用结合到_root上并借此形成对电影剪辑实例的引用,从而潜入电影的嵌套结构中。例如,变量x在电影剪辑square的内部,而square位于主电影时间轴上,我们可以这样定位x: _root.square.x
上述引用在电影中的任何位置上都可以工作 —— 无论电影剪辑的嵌套结构有多深 —— 因为该引用开始于我们的主电影时间轴:_root。下面是另一个嵌套的例子,演示如何访问变量area,area在实例triangle中,而triangle位于实例shapes的时间轴上,shapes则位于主电影时间轴上: _root.shapes.triangle.area
任何由关键字_root开始的引用都称为绝对引用,因为它们通过电影中固定且永恒不变的“主时间轴”来描述变量的位置。
有时候,我们想引用其他时间轴上的变量但是又不想通过主时间轴来引用(_root)。为此,我们使用_parent属性,该属性引用当前电影剪辑实例所在的时间轴。举例说明,若某段代码附着于电影剪辑square的某一帧上,在该代码段中,我们只要使用下述语法就可以引用square所在的时间轴上的变量: _parent.myVariable
由关键字_parent开始的引用被称为相对引用(或关系引用),相对引用完全与它们所在的电影剪辑的位置有关。
回到以前的例子中,假设我们有一个变量size,该变量被定义在电影的主时间轴上。我们将一个名为shapes的电影剪辑实例放置在主电影时间轴上,并且我们在shapes的时间轴上定义变量color。还是在shapes的时间轴上,我们放置一个名为triangle的电影剪辑实例。该电影的层次结构如下: img:\010205vs1
我们想要显示变量color(在shapes中)的值,但是要求代码附着在triangle的时间轴上。如何解决?方法一,我们可以使用一个绝对引用,如下: trace (_root.shape.color);
但是,这会使我们的代码依托于主电影时间轴。方法二,为使我们的代码更具灵活性,我们可以使用_parent属性创建一个相对引用,如下: trace (_parent.color);
方法一(使用_root)的工作原理是从顶向下的思维模式;它始于主时间轴并向下穿越电影剪辑层次直到触及变量color。方法二(使用_parent)的工作原理是从底向上的思维模式;它始于包含trace ()语句的电影剪辑(triangle),然后在电影剪辑层次中向上攀升一层并找到变量color。
我们可以在同一行中使用两次_parent,以在电影剪辑层次中向上攀升两层并访问到主时间轴上的变量size。下面,我们将一些代码附着在triangle上以引用主电影时间轴上的size: trace (_parent._parent.size);
连续两次使用_parent使我们向上提升了两层,在本例中,也就是说,将我们带到了电影的主时间轴上。
变量定位使用哪种方法取决于当你在不同的时间轴上放置电影剪辑符号的实例时你希望发生什么。在triangle例子中,如果我们在shapes电影剪辑中定义color的时侯希望对color的引用永远指向color,那么我们就应该使用_root语法,该语法为我们提供了对shapes中的color的一个固定的引用。但是,如果我们希望对color的引用指向某个变换了位置的color变量 —— 依赖于在哪个时间轴上有给定的triangle实例 —— 那么我们则应该使用_parent语法。这几句话好像不太容易理解,我希望你在继续之前,能够搞懂它们。为了帮助理解,我再提出一个设想:和上面的例子一样,假设我们在shapes中放置color变量,而shapes放在电影的主时间轴上,并且我们希望对该color变量的引用永远不要改变,那么对color使用绝对引用是合适的;变化一下,如果我们在电影的主时间轴上放置一个新的电影剪辑实例world,然后将shapes放置在world中以替代放置在主时间轴上,此时,上面的绝对引用出现了断点,因为shapes不再是主电影时间轴上的实例了,而是位于主电影时间轴上的world实例中。你看,_parent属性的优点现在体现出来了,尽管color变量相对于主时间轴的位置发生了变化(以前是:主时间轴 → shapes实例 → color变量;而现在是:主时间轴 → world实例 → shapes实例 → color变量。),但是使用_parent属性的相对引用却仍能指向它(_parent.color),这是因为color变量相对于triangle实例所在的时间轴的位置并未改变(以前是:color变量和triangle电影剪辑实例同处于shapes的时间轴上;而现在是:废话,还是同在shapes的时间轴上)。
6.2访问不同文档层上的变量 _root属性指向当前层(此层并非时间轴窗口上的层,而是指当前的电影文档在Flash播放器中的位置)的主电影时间轴。但是在Flash播放器的文档堆栈中能够容纳多个电影文档。顺便说一下,堆栈是计算机原理中的概念,涉及存储器和寄存器,有关堆栈的知识你可以在汇编语言中详细了解。载入播放器文档堆栈中的任何电影的主时间轴都被_leveln注明,n是该电影所在层的数字编号。层编号开始于0,象这样:_level0,_level1,_level2,_level3,等等。有关加载多个电影的知识我们在以后的章节中讨论。下面是一些展现多层变量定位的例子: _level1.firstName // firstName on level1
6.3变量访问语句 点语句对于引用变量和时间轴来说是非常便捷的方式。这里是一些变量定位的语句: _root 指向电影的主时间轴 _root.x 指向电影的主时间轴上的变量,x _root.clip1.x 指向电影的主时间轴上的实例clip1中的变量,x _root.clip1.clip2.x 指向电影的主时间轴上的实例clip1中的实例clip2中的变量,x 真累 :( _parent 指向当前电影剪辑所在的时间轴(当前电影剪辑的时间轴的上一层)[注释 1] _parent.x 指向当前电影剪辑所在的时间轴上的变量,x(当前电影剪辑的时间轴的上一层) _parent._parent.x 指向包含当前电影剪辑的电影剪辑所在的时间轴上的变量,x(当前电影剪辑的时间轴的上两层) clip1.x 指向实例clip1中的变量,x(clip1位于当前的时间轴上) clip1.clip2.x 指向实例clip2中的变量,x(clip2位于clip1的时间轴上,clip1在当前的时间轴上。) _level1.x 指向加载到电影文档层1中的电影的主时间轴上的变量,x _level2.x 指向加载到电影文档层2中的电影的主时间轴上的变量,x [注释 1]当前电影剪辑所在的时间轴和当前电影剪辑的时间轴是两个完全不同的概念。请仔细体会。
出处:蓝色理想
责任编辑:无意
上一页 变量(6)- 变量的作用域 下一页 变量(8)- 电影剪辑变量的生存期
◎进入论坛Flash专栏版块参加讨论
|