Flash Graphics类绘制的对象是否作为对象存在?

时间:2011-01-16 21:09:58

标签: flex flash actionscript-3

内部Flash显然保留了使用Graphics绘制的基元列表,所以我想知道你是否在Sprite中有很多这样的基元,你可以重新定位/删除/改变单个项目而不是清除并重新绘制一切?或者这比Flash允许(或推荐)更深入到Flash的内容?

4 个答案:

答案 0 :(得分:4)

用户代码一旦提交到图形上下文,就无法访​​问绘图基元,但如果需要快速绘图对象,则应使用形状而不是精灵。精灵是可以包含其他精灵和图形上下文的容器,形状是仅具有图形上下文和非交互的对象。

Sprite -> DisplayObjectContainer - > InteractiveObject -> DisplayObject
Shape -> DisplayObject

答案 1 :(得分:2)

不幸的是,这是不可能的:绘制项目后,您只能修改完整的形状,而不能修改绘图本身。

为了给你更多的解释,我搜索了Flash如何实际计算显示对象。不幸的是,我找不到具体的东西。

但我发现有足够的猜测: [编辑]:我在Anatomy of a Flash找到了一个非常有趣的PDF。它解释了渲染树以及如何在内部处理图形对象。

我知道在IDE中创建的所有形状补间都被编译成形状序列(每个帧都存储为单独的图像)。这样做是有意义的:必须计算电影的每个新帧,将所有矢量图像添加到树中,每个矢量图像都呈现为位图,组合并绘制为一个最终位平面,以便显示。因此,在编译时执行每个可能的形状计算是合乎逻辑的,而不是在运行时。

然后,位图将为每个像素存储32位颜色信息,而矢量存储在简单值中,存储x和y坐标,线条样式,填充样式等。某些矢量可以分组,以便对于更复杂的形状,线条和填充样式只需要存储一次,其余部分只需要坐标。此外,像圆形和矩形这样的原始形状比从许多单独的点和线组合的对象需要更少的信息。

[编辑]:上述PDF说明了这一点:

  

AS3和AS3 DisplayObject都是   在内部转换为SObjects。   SObject有一个相关的字符。   基于它具有的字符类型   不同的绘图方法,但一切   恢复绘画填充   不同的颜色来源。

如果它的宽度和高度大于几个像素,那么需要一个非常非常复杂的矢量形状来获取比其位图表​​示更多的单个信息。因此,将简单形状保持为矢量表示比使用存储完整位图消耗的内存要少得多 - 因此在编译时不进行形状渲染是合乎逻辑的(除了复杂的形状 - 然后是“cacheAsBitmap”) “财产发挥作用”。

考虑一下我对矢量,线条样式和填充样式等的看法 - 听起来很像我们在ActionScript中绘制时要编写的命令序列,对吧?我认为这些命令只是简单地1:1转换成我正在谈论的那种矢量表示。这将使编译器更快,二进制文件更小,并且IDE形状和AS形状的处理完全相同。

[编辑]:事实证明我不太对劲:

  

Edge&颜色

     
      
  • 遍历LSObjects树并创建边缘列表   
        
    • 边缘有颜色关联
    •   
    • 笔划转换为边
    •   
    • 颜色是显示数据的来源,例如。位图,视频,实心填充,   梯度
    •   
  •   
  • 光栅化   
        
    • 对边进行排序,并为每个像素计算颜色 - 像素为   
    • 只触及一次   
  •   
  • 演示   
        
    • 主光栅化器完成绘画后,内存缓冲区就是   复制到屏幕
    •   
  •   

现在想象所有这些向量都可以自由编辑: 命令序列将不再是最终的!如果您要在运行时添加,移动或擦除一个命令,该怎么办?例如:在填充矩形内部有一个矩形从外部形状中减去内部形状。如果您将其中一个角点移到外面怎么办?结果将是一个完全不同的形状!或者如果你添加了一个点?你不能再将形状存储为矩形,需要5个点项来绘制曾经是一个矩形项的相同的东西。简而言之:所有分组和内存优化都将不再有效。它还会大大减慢运行时图形的速度。这就是为什么它只允许在形状中添加新元素,而不是在绘制后修改它们。如果您希望更改现有形状,还必须清除和重绘图形。

[编辑]:你总是可以自己做计算来做复杂的事情。我仍然认为不将它们集成到基本图形功能中是一个很好的决定。

答案 2 :(得分:1)

使用Flash CS5和XFL文件格式,此数据现在可以XML格式访问。

对于我的示例,您可以制作由MovieClip中的“图形”项组成的图块地图,其中各种图块是各种图块。您很快就会遇到需要从“Shape”对象访问那些无法访问的帧索引的问题。

如果将它们放入符号(即使是未导出的符号)中,您可以在LIBRARY文件夹中的文件中找到它(保存为'xfl'后)。它反映了图书馆的内容。

   <DOMSymbolItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ns.adobe.com/xfl/2008/" name="Tileset_Level_Test" itemID="4e00fe7f-00000450" linkageExportForAS="true" linkageClassName="Tileset_Level_Test" sourceLibraryItemHRef="Symbol 1" lastModified="1308719656" lastUniqueIdentifier="3">
  <timeline>
    <DOMTimeline name="Tileset_Level_Test">
      <layers>
        <DOMLayer name="Layer 1" color="#4FFF4F" current="true" isSelected="true" autoNamed="false">
          <frames>
            <DOMFrame index="0" keyMode="9728">
              <elements>
                <DOMSymbolInstance libraryItemName="Tileset_Test" name="" symbolType="graphic" firstFrame="8" loop="play once">
                  <transformationPoint>
                    <Point/>
                  </transformationPoint>
                </DOMSymbolInstance>
                <DOMSymbolInstance libraryItemName="Tileset_Test" name="" symbolType="graphic" firstFrame="4" loop="play once">
                  <matrix>
                    <Matrix tx="48"/>
                  </matrix>
                  <transformationPoint>
                    <Point/>
                  </transformationPoint>
                </DOMSymbolInstance>
... lots more...
              </elements>
            </DOMFrame>
          </frames>
        </DOMLayer>
      </layers>
    </DOMTimeline>
  </timeline>
</DOMSymbolItem>

XML看起来相当复杂,但您可以使用XML类将其处理得更简单,并且(例如)从镜像这些帧索引的MovieClip构造碰撞掩码,并识别生成点和其他特殊类的东西。或者您可以自己处理数据并绘制整个地图,只需要一种方法来直观地构建它。您可能真正关心的是矩阵中的tx,ty属性(放置图块的位置),以及'DOMSymbolInstance'中的'firstFrame'属性(针对哪个图块)。

无论如何,您可以使用AIR小程序对其进行预处理,以便只生成您想要的数据,然后选择.as文件以包含在项目中,或者简化XML,或者您喜欢的任何内容。或者使用您喜欢的任何其他工具/语言,并将该处理步骤添加到构建脚本中。

xfl文件格式也可以方便地跟踪和修复Flash过于破碎/错误/ AFU修复的所有方式,例如零件零件的不明显部分中的剩余字体引用....您可以将它们固定在库中,或者直接删除有问题的部分的文件,或者手动编辑XML。 Grep和sed,find和xargs都是你完成这些任务的朋友。特别是对于将所有坐标捕捉到整数值或适当的单元格边界之类的事情,因为所有Flash的“捕捉”都被严重破坏了。通过sed管理XML文件对于你没有备份的文件非常有害,但对于那些知道自己正在做什么并且使用版本控制的邪恶人来说是非常有益的。

答案 3 :(得分:0)

每个DisplayObject只有一个图形引用。因此,如果你想在一个Sprite中移动(或缩放等)几个图形对象,我建议你按照预期使用显示树。 只需在一个Sprite中添加几个子节点(Sprite或MovieClips或......),每个Sprite都会在必要时重新绘制。