3

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

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

我尝试创建一个新形状并使用 copyFrom() 图形方法无济于事,我相信这个方法只是在引用图形上进行绘制调用时复制它们,而我只是有一个已经存在的形状的引用画。

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

4

2 回答 2

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。这基本上是创建几个不同比例级别的形状位图,然后根据当前比例交换它们。对此进行编码具有一定的复杂性(使用辅助父级来调整比例会有所帮助),但它肯定会比使用许多形状符号(有或没有精灵父级)表现得更好。

于 2012-05-04T08:59:52.580 回答
1

这个很老了,但是在谷歌上还是很高的,所以我只是想分享一个真实的形状复制方法:

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

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

和繁荣。有用。不得不分享这个,因为它会在很久以前和很多方面帮助我。

更新:

有一些说明,我想补充一下为什么要使用此方法,用于复制和存储对 swf 中形状的引用。

如果您定位舞台上或影片剪辑中的 Shape 对象,Flash 渲染引擎会做一些奇怪的事情。它将回收 Shape 对象以渲染新图形,从而使您的 Shape 参考点指向完全不同的渲染。

例如:

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

第二次绘制形状而不重新分配形状参考时,有时会产生完全不同的形状。

只要知道,如果你不知道你在找什么,这个小怪癖会让你把头发拉出来:)

于 2015-06-10T18:08:34.267 回答