AS3:MovieClip(root)评估为null?

时间:2012-08-27 21:06:06

标签: actionscript-3 flash

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

  1. “场景1”

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

    • 此处显示地图并显示各种元素
    • 这里没有什么有趣的动作明智的
    • 但在这些元素中,有一个影片剪辑:
  3. “BTN-VB”

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

    • 这里我们找到几个带有一些基本动画的图层。
    • 在这些图层中,有三个代表同一个按钮的不同变体(可用,未准备好,禁止使用)。
    • 这三个层中的每一个都包含一个实例化对象(带有一些补间)
  5. 我需要的是这个:
    根据我在场景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:Error#1009”。

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

    知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

时间轴上任何位置的所有MovieClip(或通过ActionScript添加,实际的Loaders除外)都有一个loaderInfo属性,该属性指向您已经读取参数的相同loaderInfo,因此您不需要引用根。

此外,孩子对其父/祖父母/等有所了解是非常不好的做法。见encapsulation。相反,让子项公开父级可以使用正确信息填充的属性(变量)。因此,您的主时间轴将信息提供给btn-vb,它们都使用它并将其传递给vb_anim。