AS3是否可以复制Shape对象?

时间:2012-05-03 17:47:44

标签: actionscript-3 flash

我正在尝试制作可用于复制的形状。这是对我所做的事情,我正在做的事情以及我被困在哪里的解释:

  • 在Flash IDE(画笔)中手动绘制形状。
  • 创建一个包含形状的新动画片段;出口作为一个阶级。
  • 实例化类(var mc:MovieClip = new shapeMovieClip())。
  • mc 中添加对我想要的形状的引用(var myShape:Shape = mc.getChildAt(0)为Shape;
  • 这很完美,我现在有了自己的形状,但如何在不实例化父MovieClip类的情况下复制它 - 是否可能?

我尝试创建一个新形状并使用copyFrom()图形方法无效,我相信这个方法只是在引用的图形上复制绘制调用而不是我只是有一个形状的引用那已经被画了。

现在我将movieclip扩展为精灵,实例化,从父级拉出形状并保存其引用,然后将精灵归零。有没有人知道以这种方式复制形状的更好,更轻量的策略?

2 个答案:

答案 0 :(得分:1)

基本上取决于您是否需要缩放形状。如果你不这样做,并且可以使用固定大小的形状位图表示法进行处理,那么你将获得更好的性能,将你的形状绘制成BitmapData(它被称为rasterisation)并实现Bitmap对象(如其他评论者指出)。代码将是这样的:

var base:Sprite = new shapeMovieClip();
var bmd:BitmapData = new BitmapData(base.width, base.height, true, 0);
bmd.draw(base);
var clip1:Bitmap = new Bitmap(bmd);
var clip2:Bitmap = new Bitmap(bmd);

如果您确实需要缩放剪辑,您将使用位图获得像素化。缩小Bitmap.smoothing可以在某种程度上有所帮助(也可以在旋转时),但如果你需要扩展,你可能需要使用某种mip-mapping。这基本上是在不同的比例级别创建一些形状的位图,然后根据当前比例交换它们。编码这有一些复杂性(使用辅助父级来调整比例可能会有所帮助),但它肯定比使用许多形状符号(有或没有精灵父级)更好。

答案 1 :(得分:1)

这是非常古老的,但它在谷歌中仍然很高,所以我只是想分享一个真正的形状重复方法:

var shapeonstage:Shape = shapeMadeInIDE;
var g:Vector.<IGraphicsData> = shapeonstage.graphics.readGraphicsData();

var shapecopy:Shape = new Shape();
shapecopy.graphics.drawGraphicsData(g)

繁荣。有用。不得不分享这一点,因为它会在很长一段时间内以很多方式帮助我。

<强>更新

有一些说明我想添加为什么要使用此方法,以复制AND以存储对swf内的Shapes的引用。

如果您在舞台上或影片剪辑中定位Shape对象,则Flash渲染引擎会执行一些奇怪的操作。它将RECYCLE Shape对象渲染新图形,从而使您的Shape参考指向完全不同的渲染。

例如:

  • 使用movieclip创建fla。
  • 在影片剪辑中制作10帧。
  • 在每个框架上绘制不同的形状
  • 在您的代码中,获取对形状的引用(第1帧上的形状)
  • 绘制并验证您的形状(绘制到位图然后将bmp放在舞台上)
  • 现在让Flash引擎播放5帧
  • 再次绘制并验证您的形状

第二次在没有重新分配形状参考的情况下绘制形状时,SOMETIMES会产生完全不同的形状。

要知道,如果你不知道自己在寻找什么,这个小怪癖会让你脱掉头发:)