Apache flex 从ActionScript编辑库符号

Apache flex 从ActionScript编辑库符号,apache-flex,flash,actionscript-3,Apache Flex,Flash,Actionscript 3,在Flash创作环境中,我可以编辑库符号,并且基于它的所有舞台实例都会反映更改。如何在ActionScript中执行相同的操作?似乎没有办法称呼图书馆符号 例如: package { import flash.display.MovieClip; import flash.geom.ColorTransform; public class Square extends MovieClip { public static var instances:Array = n

在Flash创作环境中,我可以编辑库符号,并且基于它的所有舞台实例都会反映更改。如何在ActionScript中执行相同的操作?似乎没有办法称呼图书馆符号

例如:

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;
        }
     }

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

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

如何使用Actionscript实现这一点


谢谢您的帮助。

当然,如果您创建了自定义组件,当您更改它时,更改将显示在该组件/类的所有实例上。下面是一个例子:

另一方面,如果您使用的模块与您在Flash中使用的swf-s基本相同,那么当您重新编译它们时,更改将反映在使用它们的主应用程序上。以下是模块的示例:

因此,MXML/AS组件/类是您的“符号”,您可以动态创建或放置在舞台上。

模块是可以加载的“电影”,它们可以独立运行,并可以与主电影进行通信。

实现这一点的最接近的方法是使用位图。如果更新它们显示的
位图数据
,它们都将自动更新

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

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

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

格里茨

back2dos

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


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

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

如果只是为了确保所附着的正方形为蓝色,则可以使用颜色变换来更改其外观:

var someSquare:Square = new Square();
someSquare.transform.colorTransform = new ColorTransform(0,0,0,1,0x00,0x00,0xff,0x00 );
addChild( someSquare );
当然,这不会更改已附加的所有实例的颜色


如果您真的想更改Actionscript中的实际SWF符号,我看到的唯一方法是使用as3swf()解析SWF,找到符号的shape标记,更改它,然后通过loader.loadBytes()加载包含SWF的ByteArray-但这的确是一种非常复杂的方法,只需在形状符号本身中添加一些着色代码,然后通过主应用程序广播的事件触发颜色更改,就可以获得相同的结果。

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

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;
        }
     }

  }
}

自定义组件不适用于我们,因为我们将此技术用于动态动画。这些符号是“手”、“腿”、“武器”和其他在运行时需要更改的图形。同样,模块也不适用。谢谢。下面是你的答案。顺便说一句:你可以在运行时加载/卸载模块。