【问题标题】:Editing A Library Symbol From ActionScript从 ActionScript 编辑库符号
【发布时间】:2010-05-26 08:05:53
【问题描述】:

在 Flash 创作环境中,我可以编辑库元件,所有基于它的舞台上的实例都会反映所做的更改。如何在 ActionScript 中做同样的事情?似乎没有办法解决库符号。

例如:

在 Flash CS3 中,我创建了一个 Square.swf 文件,其中包含 100 个库符号 Square 的实例。

现在,Square.swf 被加载到另一个文件 BlueSquare.swf 中,我想将 Square 符号更改为蓝色正方形,以便 Square 的所有实例变为蓝色。

如何使用 Actionscript 执行此操作?

感谢您的帮助。

【问题讨论】:

    标签: apache-flex flash actionscript-3


    【解决方案1】:

    剪辑库符号中的内容是该对象的创作时定义 - 您无法在运行时更改它。相反,通常的方法是动态更改要更改的剪辑的内容(而不是定义),这可以通过多种方式完成,但所有这样做的好方法都涉及使动态变化的剪辑了解如何更新它的外观。因此,您需要能够重新创作不断变化的剪辑以满足您的需求。

    如果您正在加载其他人制作的动画,并尝试遍历并用对象 B 替换对象 A 的所有实例,实现此目的的唯一方法是遍历内容的显示列表以查找 A,当你找到一个时,删除它的子元素并用 B 的内容替换它们。请注意,动画可能无法真正解决你的问题,因为动画通常会频繁添加和删除剪辑,所以在任何给定点你都可以替换所有带有“hand2”的“手”剪辑,但随后一帧可能会出现新的“手”剪辑。但是除了打开 SWF 并更改其中的二进制数据之外,没有其他方法可以将给定对象的所有内容动态更改为其他内容,除非该对象知道如何更改其内容。

    【讨论】:

      【解决方案2】:

      如果只是为了确保您附加的正方形是蓝色的,您可以使用 colorTransform 来改变它的外观:

      var someSquare:Square = new Square();
      someSquare.transform.colorTransform = new ColorTransform(0,0,0,1,0x00,0x00,0xff,0x00 );
      addChild( someSquare );
      

      当然,这不会改变您已附加的所有实例的颜色。

      如果您真的想更改 Actionscript 中的实际 SWF 符号,我看到的唯一方法是使用 as3swf (https://github.com/claus/as3swf/wiki) 解析 swf,找到符号的形状标记,更改它,然后加载包含通过 loader.loadBytes() 的 swf - 但这无疑是一种相当复杂的方式,您只需将一些着色代码放入形状符号本身,然后通过由您的主应用程序广播的事件触发颜色变化,即可获得相同的结果.

      【讨论】:

        【解决方案3】:

        当然,如果您制作自定义组件,当您更改它时,更改将出现在该组件/类的所有实例上。示例如下:http://livedocs.adobe.com/flex/3/html/intro_3.html

        另一方面,如果您使用模块乳清与您在 Flash 中使用的 swf-s 几乎相同,那么当您重建-重新编译它们时,更改将反映在使用它们的主应用程序上。这是模块的示例:http://blog.flexexamples.com/2007/08/06/building-a-simple-flex-module/

        因此,MXML/AS 组件/类是您的“符号”,您可以在舞台上动态创建或删除它们。
        模块是您可以加载的“电影”,它们可以自行运行,并有可能与主电影进行通信。

        【讨论】:

        【解决方案4】:

        最接近的方法是使用Bitmaps。如果你更新它们显示的bitmapData,它们都会自动更新。

        但是,这种方法一点都不好。您应该在对象模型中单独维护应用程序状态,并在状态更改时更新可视化。

        您想要做的是滥用在设计时更改图形外观的功能,在运行时更改应用程序状态。一般来说,像这样的想法会被认为是糟糕的。

        例如,如果您花时间将状态模型和可视化层分开,那么将游戏状态保存在服务器上或与其他客户端同步以实现多用户功能将变得相当容易。

        问候
        back2dos

        【讨论】:

          【解决方案5】:

          如果您正在尝试构建 Avatar,并且用户可以自定义您的 Avatar 部件,例如手、腿、脸等,您希望所有这些资产都保存在单独的 swf 文件中,这非常简单。您将所有资产保存在单独的 swf 或一个大的 swf 文件中,并在运行时加载它们。现在,维护您的 Avatar 对象实例并放置用户选择的子对象。

          【讨论】:

            【解决方案6】:

            您可以在类中创建一个静态列表,其中引用所有创建的实例,然后使用静态方法应用更改。例如:

            package
            {
              import flash.display.MovieClip;
              import flash.geom.ColorTransform;
            
              public class Square extends MovieClip
              {
            
                 public static var instances:Array = new Array();
            
            
                 public function Square():void
                 {
                    Square.instances.push(this); // This is the trick. Every time a square is created, it's inserted in the static list.
                 }
            
                 // This property gets the color of the current object (that will be the same of all others because the setter defined below).
                 public function get color():ColorTransform
                 {
                    return this.transform.colorTransform;
                 }
            
                 public function set color(arg:ColorTransform):void
                 {
                    // Sets the color transform of all Square instances created.
                    for each(var sqr:Square in Square.instances)
                    {
                       sqr.transform.colorTransform = arg;
                    }
                 }
            
              }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-02-25
              • 2011-02-06
              • 2019-12-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多