在Flash创作环境中,我可以编辑库符号,所有基于它的舞台实例都可以反映更改。如何在ActionScript中执行相同的操作?似乎没有办法解决图书馆符号。
例如:
在Flash CS3中,我创建了一个Square.swf文件,其中包含100个库符号Square实例。
现在,Square.swf被加载到另一个文件BlueSquare.swf中,我想将Square符号更改为蓝色方块,以便Square的所有实例都变为蓝色。
如何使用Actionscript执行此操作?
感谢您的帮助。
答案 0 :(得分:1)
剪辑库符号中的内容是该对象的作者时间定义 - 您无法在运行时更改它。相反,通常的方法是动态更改要更改的剪辑的内容(而不是定义),这可以通过各种方式完成,但所有这些的好方法都涉及使动态更改的剪辑了解如何更新它的外观。因此,您需要能够重新创作更改剪辑以满足您的需求。
如果您正在加载其他人制作的动画,并试图通过对象B替换对象A的所有实例,那么实现这一目的的唯一方法是遍历内容的显示列表寻找A,当你找到一个,删除它的孩子,并用B的内容替换它们。请注意,对于可能无法真正解决问题的动画,因为动画通常经常添加和删除剪辑,所以在任何给定的点你都可以替换所有带有“hand2”的“手”剪辑,但随后一帧以后新的“手”剪辑可能会出现。但是,如果没有打开SWF并更改内部的二进制数据,除非对象知道如何更改其内容,否则没有其他方法可以动态地将所有给定对象更改为其他对象。
答案 1 :(得分:1)
如果只是为了确保你附加的方块是蓝色的,你可以使用colorTransform来改变它的外观:
var someSquare:Square = new Square();
someSquare.transform.colorTransform = new ColorTransform(0,0,0,1,0x00,0x00,0xff,0x00 );
addChild( someSquare );
当然,这不会改变您已经附加的所有实例的颜色。
如果你真的想在Actionscript中更改实际的SWF符号,我看到的唯一方法是使用as3swf(http://wiki.github.com/claus/as3swf/)解析swf,找到符号的形状标记,更改它然后加载ByteArray通过loader.loadBytes()包含swf - 但这无疑是一种非常复杂的方式,您可以通过简单地将一些着色代码放入形状符号本身然后通过您广播的事件触发颜色更改来实现相同的结果主应用程序。
答案 2 :(得分:0)
当然,如果您创建自定义组件,则在更改时,更改将显示在该组件/类的所有实例上。以下是示例: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组件/类是您可以在飞行中创建或放弃的“符号” 模块是你可以加载的“电影”,它们可以独立运行,可以与主电影进行通信。
答案 3 :(得分:0)
最接近的方法是使用Bitmap
s。如果您更新他们显示的bitmapData
,则会自动更新。
然而,这种方法并不好。您应该在对象模型中单独维护应用程序状态,并在状态更改时进行可视化更新。
您要做的是在设计时滥用功能以更改图形外观,以在运行时更改应用程序状态。一般来说,像这样的想法可以被认为是坏事。
例如,如果您花时间分离状态模型和可视化层,将游戏状态保存在服务器上或与其他客户端同步以实现多用户功能将变得相当容易。
格尔茨
back2dos
答案 4 :(得分:0)
如果您正在尝试构建头像,用户可以自定义您的头像部分,例如手,腿,脸等等,你希望所有这些资产都保存在单独的swf文件中,这非常简单。您将所有资产保存在单独的swf或一个大型swf文件中,并在运行时加载它们。现在,维护您的头像对象实例并放置由用户选择的子对象。
答案 5 :(得分:0)
您可以在类中创建一个静态List,其中包含所有已创建实例的引用,然后使用静态方法应用更改。例如:
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;
}
}
}
}