从ActionScript编辑库元件

mwkjh3gx  于 2022-09-21  发布在  Apache
关注(0)|答案(6)|浏览(179)

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

例如:

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

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

如何使用ActionScript执行此操作?

谢谢你的帮助。

50few1ms

50few1ms1#

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

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

v1uwarro

v1uwarro2#

如果只是为了确保要附加的正方形是蓝色的,则可以使用ColorTransform更改其外观:

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

当然,这不会更改已附加的所有示例的颜色。

如果你真的想在ActionScrip中更改实际的SWF符号,我看到的唯一方法是用as3swf(https://github.com/claus/as3swf/wiki)解析SWF,找到符号的形状标签,更改它,然后通过loader.loadBytes()加载包含SWF的Byte数组-但无可否认,这是一个相当复杂的方法,你只需将一些着色代码放入形状符号本身,然后通过主应用程序广播的事件触发颜色更改,就可以达到同样的效果。

ffvjumwh

ffvjumwh3#

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

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

因此,MXML/AS组件/类是您可以即时创建或拖放到舞台上的“符号”。
模块是可以加载的“电影”,它们可以自己运行,并有可能与主电影通信。

jdgnovmf

jdgnovmf4#

实现这一点的最接近的方法是使用Bitmaps。如果更新它们显示的bitmapData,它们将全部自动更新。

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

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

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

问候
Back2Dos

svgewumm

svgewumm5#

如果你正在尝试建立一个阿凡达,用户可以定制你的阿凡达部分,例如手、腿、脸等,你希望所有这些资产都保存在单独的SWF文件中,这是非常简单的。您可以将所有资源保存在单独的SWF或一个大型SWF文件中,并在运行时加载它们。现在,维护您的阿凡达对象示例并放置用户选择的子对象。

btqmn9zl

btqmn9zl6#

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

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

  }
}

相关问题