【问题标题】:AS3 Is it possible to duplicate a Shape object?AS3 是否可以复制 Shape 对象?
【发布时间】:2012-05-13 06:46:23
【问题描述】:

我正在尝试使形状可用于复制。以下是对我所做的事情、我正在尝试做的事情以及我遇到的问题的解释:

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

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

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

【问题讨论】:

  • 您可以尝试将其绘制到 bitmapData ,但没有其他方法可以从 IDE 克隆形状。
  • AFAIK 无法完成(ide 制作的形状与代码制作的形状的编译方式不同,因此您无法检索路径数据)。为什么不能创建更多 shapeMovieClips?
  • @Cay 这是我正在使用的当前解决方案,但我希望有比实例化多个不会使用的精灵更快的方法。
  • CarlMiller 您考虑过或尝试过@turbosqel 的建议吗?我相信,如果您一次要在屏幕上显示大量绘图实例,这可能是最好的主意。将DisplayObject绘制成BitmapData后就可以使用了,伪代码:graphics.beginBitmapFill(bmp); graphics.drawRect(x,y,bmp.width,bmp.height);否则,您不能在显示树的多个部分重复使用相同的显示对象,根据定义,树中的每个对象只有一个父对象。如果您愿意自己处理数据模型,尽管 bitmapData 工作得很好(低 CPU/内存)。
  • 如果您要运行的设备可能具有 GPU(和最新的 Flash Player),为了获得更高的性能,您可以利用 Stage3D 对象来绘制 2D 对象如果你关心性能,我在这里找到了一个很好的教程:active.tutsplus.com/tutorials/games/…

标签: actionscript-3 flash


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

【讨论】:

    【解决方案2】:

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

    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 帧
    • 再次绘制并验证您的形状

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

    只要知道,如果你不知道自己在寻找什么,这个小怪癖会让你大发雷霆:)

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2018-04-17
      • 2015-12-16
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多