0

好的,我不太习惯 Flash,我在这个问题上已经被困了几个小时,所以任何帮助都会非常感激......
我有这个非常复杂的 FLA,它基本上是这样设置的:

  1. “场景一”

    • 一些加载动画(和代码)
    • AS 代码从 flashvars(在 HTML 代码中)接收值并验证它们
    • 在场景 1 时间线的末尾,我们输入了第二个影片剪辑:
  2. “地图总”

    • 这里显示了一张地图,上面出现了各种元素
    • 这里没有什么有趣的动作脚本
    • 但在这些元素中,一个影片剪辑:
  3. “btn-vb”

    • 这里,各种层;其中一个包含另一个电影剪辑(vb_anim)
    • 还包含一些 AS 代码以使 vb_anim 在鼠标滚动时变大,并在鼠标离开时反转(并对点击做出反应)
  4. “vb_anim”

    • 在这里,我们找到了一些带有一些基本动画的图层。
    • 在这些层中,三个代表同一个按钮的不同变体(可用、未准备好、禁止)。
    • 这三层中的每一层都包含一个实例化对象(带有一些补间)

我需要的是:
根据我在场景 1 中收到的 flashvars,我需要在“vb_anim”中显示或隐藏这三个对象中的一个或几个。

为了访问场景 1 中设置的变量,我使用以下快捷方式:

var global:MovieClip = MovieClip(root);
// allows for access to the "root" variables
// e.g. global.myVar

我已经在“btn-vb”中使用了相同的代码(我需要访问 flashvars 提供的信息才能定义 onclick 事件),它就像一个魅力。

但是,当从“vb_anim”内部调用时,MovieClip(root) 的计算结果似乎为 null。因此,无法访问场景 1 中的变量,并且当我尝试这样做时,Flash 会抛出“TypeError:错误 #1009”。

由于“vb_anim”只是嵌入在“btn-vb”中,我不明白为什么它看不到 MovieClip(root) 而它的父级可以。

知道我做错了什么吗?

4

2 回答 2

1

您在 IDE 中的 MovieClip 时间轴上声明的变量仅属于该剪辑,IDE 中的代码生成器将从它们为它为您使用的 MovieClip 生成的类生成类字段。这就是为什么它不起作用的原因,我想。即,您在只有与包含该代码的 MovieClip 关联的代码可以访问它的位置声明了此变量,但与您所称的相反,它不是全局的。

ActionScript 并没有真正的全局变量的概念,变量可以被限定为一个类(字段,或也称为成员)或包级变量(一种很少使用且很大程度上不鼓励的做法),而第二种可能有时服务于全局变量的目的,它没有提供确保唯一性的机制,因此存在潜在的错误危险和/或安全风险。在 AS3 中没有办法解决这个问题,这就是为什么最好完全避免它。

但这不是您的代码的唯一问题。您正在投射root到 MovieClip 只是因为它可以让您避免类型检查(使您的代码更容易出错)。解决这种情况的正确方法是为根容器创建一个类,并通过IDE(IDE 将此类称为“文档类”)分配给根容器。然后,无论何时使用root,您都可以将其强制转换为该类,从而允许代码辅助和编译器帮助您更快地编写更安全的代码。

于 2012-08-28T06:52:55.550 回答
0

时间轴上任何位置的所有影片剪辑(或通过 ActionScript 添加的,实际加载程序除外)都有一个 loaderInfo 属性,该属性指向您已经在读取参数的同一个 loaderInfo,因此您不需要参考根。

此外,对于孩子来说,了解其父母/祖父母/等的任何事情都是非常糟糕的做法。见封装。相反,让孩子公开一个属性(变量),父母可以用正确的信息填充该属性(变量)。因此,您的主时间线将信息提供给 btn-vb,btn-vb 既使用它又将其传递给 vb_anim。

于 2012-08-28T01:30:12.177 回答