Actionscript 3 AS3:MovieClip(根)的计算结果为空?

Actionscript 3 AS3:MovieClip(根)的计算结果为空?,actionscript-3,flash,Actionscript 3,Flash,好的,我不太习惯Flash,我在这个问题上已经被困了好几个小时,所以非常感谢您的帮助… 我有一个相当复杂的FLA,基本上是这样设置的: “第一场” 一些加载动画(和代码) 作为从FlashVar(在HTML代码中)接收值并验证它们的代码 在场景1时间线的末尾,我们输入第二个电影剪辑: “地图总计” 这里显示了一张地图,地图上显示了各种元素 这里没有什么有趣的动作脚本 但在这些元素中,有一个电影剪辑: “btn vb” 这里,各层;其中一个包含另一个电影剪辑(vb_动画) 还包含一些AS

好的,我不太习惯Flash,我在这个问题上已经被困了好几个小时,所以非常感谢您的帮助…
我有一个相当复杂的FLA,基本上是这样设置的:

  • “第一场”

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

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

    • 这里,各层;其中一个包含另一个电影剪辑(vb_动画)
    • 还包含一些AS代码,使vb_动画在鼠标滚动时变大,在鼠标离开时变大(并对单击作出反应)
  • “vb_动画”

    • 在这里,我们找到了几个带有一些基本动画的层
    • 在这些层中,三个表示同一按钮的不同变体(可用、未就绪、禁止)
    • 这三个层中的每一层都包含一个实例化对象(带有一些中间层)
  • 我需要的是:
    根据我在场景1中接收到的FlashVar,我需要在“vb_动画”中显示或隐藏这三个对象中的一个或多个

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

    var global:MovieClip = MovieClip(root);
    // allows for access to the "root" variables
    // e.g. global.myVar
    
    我已经在“btn vb”中使用了相同的代码(为了定义onclick事件,我需要访问flashvars提供的信息),它的工作方式很有魅力

    然而,当从“vb_anim”内部调用时,MovieClip(root)的计算结果似乎为null。因此,不可能从场景1访问变量,当我尝试这样做时,Flash抛出一个“TypeError:Error#1009”

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


    知道我做错了什么吗?

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


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

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

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


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

    您可以发布更多代码吗?或者您的.fla?谢谢您的回答。我不确定是否要使用类(因为我的日程排得很紧,我不熟悉如何使用它们),但这确实是正确的做法。我仍然不明白为什么我可以在Level 3上访问MovieClip(root),但在Level 4上却不能访问(尽管它只是嵌入到Level 3中)…实际上我需要访问根上的其他变量(不仅仅是loaderInfo中的参数)。无论如何,我确实使用了一个可以从任何地方访问的类来解决了这个问题。无论如何,谢谢你的回答。希望这个项目不会变得太大,或者需要由多个人维护。