【问题标题】:AS3 Components in Flash DesignerFlash Designer 中的 AS3 组件
【发布时间】:2008-11-26 22:20:46
【问题描述】:

在 ActionScript 2 项目中,我可以创建一个新的 MovieClip,在库上右键单击它并选择“组件定义”以添加可以在 MovieClip 中引用的参数。可以在 MovieClip 的属性中轻松更改此参数。

现在,我正在处理一个 ActionScript 3 项目,但还没有找到一种方法来获取这些参数中传递的值。

我定义了一个名为“textToDisplay”的参数,但是当我在第一帧的 Actions 中编写以下内容时,出现错误:

trace(textToDisplay);

这是错误:

1120: Access of undefined property textToDisplay.

你知道如何获取那个参数的值吗?

谢谢

PS:我在 Windows XP 上使用 Adob​​e Flash CS3 Professional

【问题讨论】:

    标签: flash actionscript-3 actionscript


    【解决方案1】:

    考虑到查找有关自定义组件设置的信息有多么困难,我想我会根据我的经验来澄清该过程的某些方面。

    初始化事件:

    上面的 aaaidan 示例大部分是正确的,但有一个例外。

    addEventListener(Event.INIT, onInit);
    

    应该是:

    loaderInfo.addEventListener(Event.INIT, onInit);
    

    DisplayObject 的 loaderInfo 属性引用了一个 LoaderInfo,您的组件从中获取其参数设置。 INIT 事件在它获取数据后被调用(或者你可以使用 COMPLETE 事件,它应该在 INIT 之后直接触发)

    可检查的元数据:

    当您使用元数据 [Inspectable] 标签设置要访问的属性时,您还可以使用以下方法定义默认值:

     [Inspectable(defaultValue="whatevervalue")]
    

    根据我的经验,参数似乎无法处理除字符串(可能还有数字)以外的任何内容,因此我建议使用获取字符串值的集合函数并使用它们来获取您可能想要的其他值。例如,如果您想加载特定命名类的新实例

     [Inspectable(defaultValue="flash.display.Sprite")]
    public function set className(value:String):void{
           var ClassReference:Class = getDefinitionByName(value) as Class;
           _class = new ClassReference();
    }
    

    在此示例中,如果参数设置为“flash.display.Sprite”,则调用“new _class() 将创建一个新的 Sprite 实例。

    设置大小函数:

    如果您希望自定义组件以其他方式调整大小,而不是简单地拉伸高度和宽度值,您需要一个公共 setSize 函数。每次在 Flash 中调整组件大小时都会调用此函数。

    public function setSize(w:Number, h:Number):void{
       _menuWidth = w;
       _menuHeight = h;
    }
    

    现在,当您在 Flash 中调整组件的大小时,这很有效,但是一旦您实际发布您的 swf 文件,您会注意到它切换回拉伸宽度和高度,而不是使用您的 setSize 函数(我不知道为什么,但这就是它的作用)。要解决此问题,您需要在 onInit 函数中获取宽度和高度,将它们输入 setSize,然后将 scaleX 和 scaleY 值重置为 1:

    public function onInit(e:Event):void{
       setSize(width,height);
       scaleX = 1;
       scaleY = 1;
       //add other functions that need to be run once the parameters are loaded
    }
    

    (如果有人发现这样做不那么混乱的方式,请告诉)

    希望这有助于某人启动并运行他们的自定义组件。

    【讨论】:

    • omg,感谢有关将 INIT 添加到 loaderInfo 的提示...我几乎把头发都扯掉了
    • Even.ADDED_TO_STAGE 在我的舞台实例中首先发生在我身上,所以我最终改为倾听。
    【解决方案2】:

    在 as3 中,您必须创建一个外部类文件,其中包含一个或多个您将使用的 public var 声明(您也可以使用公共 get/set 函数)。如果您不确定如何使用,请在 Google 上搜索。

    在您的外部文件中,在您的 var 之前使用 [Inspectable] 元数据标签,如下所示:

    package myPackage {
      import flash.display.MovieClip;
    
      public class MyComponent extends MovieClip {
    
        [Inspectable]
        public var myFancyComponentParameter:String;
    
        [Inspectable]
        public var myOtherFancyComponentParameter:int;
    
      }
    
    }
    

    然后您可以打开“组件定义”对话框,将“类”字段设置为您的外部类的名称(包括包名称),Flash 将根据您的[Inspectable] 标签自动为您的组件创建参数。或者您可以手动创建它们。

    设置完成后,您可以在时间线代码中访问组件变量:

    trace("Here's my var: " + myFancyComponentParameter);
    

    [Inspectable] 标签(包括数据类型)的详细信息可在metadata livedocs 获得。

    如果你想让你的外部类做任何事情而不是保存组件值,那么在链接对话框中设置类名也是一个好主意。

    我还建议将代码放在您的外部类中,而不是放在时间线中。这种方式更具扩展性。如果您这样做,请记住您的组件参数在INIT 事件被触发之后才被设置。以下是如何收听的:

    // package and import statements omitted for brevity
    public class MyComponent extends MovieClip {
    
      [Inspectable]
      public var myFancyComponentParameter:String;
    
      public function MyComponent() {
        // myFancyComponentParameter not set here yet
        trace(myFancyComponentParameter); // prints null
        addEventListener(Event.INIT, onInit);
      }
    
      public function onInit(e:Event) {
        // now we can use component parameters!
        trace(myFancyComponentParameter); // prints the param value
      }
    
    }
    

    【讨论】:

    • 由loaderInfo对象调度的Event.INIT
    【解决方案3】:

    终于让它工作了(使用基本的 MovieClips,到目前为止没有太多扩展)。我有两点要补充:

    1. 需要为 ActionScript 导出符号(即具有 链接 定义)。只在组件定义中设置类是不行的。如果没有导出设置,[Inspectable] 标记将被解释,但其余代码将被完全忽略。甚至类的构造函数中的东西。
    2. [Inspectable] 标记中的 default 值在编译时似乎不起作用,或者它会导致 null。我只使用了一个字符串,它位于“组件参数”框中,但可以追踪到null。即使在Event.INIT 之后(我正在点击跟踪)。这似乎不是“值未结转”的情况,因为手动输入默认值仍会导致null。在[Inspectable] 中设置默认值有效地定义了一个无法使用的值。

    附:使用 CS5。

    【讨论】:

      【解决方案4】:

      我没有使用过这个特定的功能,但您可能需要为该 MovieClip 定义一个自定义类(只是 MovieClip 的子类)并添加该额外变量。 Actionscript 3 已经远离了 actionscript 2 的动态特性,开始时可能会有些混乱,但最终它更加健壮。

      【讨论】:

        【解决方案5】:

        我在 MovieClip 类定义中没有看到 INIT 事件,而且它似乎没有被调用。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题 - MovieClip 没有 INIT 事件 - 但除此之外,此解决方案工作正常。我能看到解决此问题的唯一方法是使用 Event.ENTER_FRAME 并在第一次调用处理程序时再次删除侦听器。从下一帧开始可以访问我的组件参数,但我发现在实例化影片剪辑时不存在官方事件令人惊讶。

          【讨论】:

            【解决方案7】:

            有一个 ADDED_TO_STAGE 事件比 steve-mann 建议的 ENTER_FRAME 事件效果更好。

            【讨论】:

              【解决方案8】:

              在 CS4 10.0.2 版本中,您可以再次右键单击并手动添加组件参数。

              注意两点:

              1. 您仍需要等待 loaderInfo Event.INIT 才能引用自定义值(即:loaderInfo.addEventListener(Event.INIT, initComponent)
              2. 您需要在第 1 帧 (var paramName) 上定义参数,以便能够在没有编译器错误的情况下引用它。

              希望这对您有所帮助...我知道它对我有所帮助!

              ~格雷格

              【讨论】:

                猜你喜欢
                • 2011-01-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-01
                • 1970-01-01
                • 2011-07-19
                • 2010-12-30
                • 1970-01-01
                相关资源
                最近更新 更多