AS3:如何补充现有库中的函数调用?

时间:2012-06-06 13:28:00

标签: actionscript-3 oop

我有一个半新手的问题。我已经编程多年了,但我早期的经验都是在OOP之前,我的大脑就这样解决了。我也是Actionscript的新手。所以希望这对某人来说很容易。

我正在使用as3svgrendererlib来导入SVG。它工作得很好,但我需要能够序列化它输出的图形。但我不能序列化精灵,所以我必须一直到IGraphicsData级别才能得到我能做到的东西。但图书馆没有给我这些数据。它只给了我精灵。所以我需要改变它。

由于最终只使用了少数几种绘图方法(beginFilldrawRect等),我的想法是,如果我可以挂钩并用我自己的代码补充它们输出IGraphicsData,然后我就会开展业务。现在我知道我可以通过使用“扩展”类来实现这一点,但这需要对库进行大量修改,以便将所有标准调用更改为自定义类。

所以我想知道:是否有一种神奇的OOP方式来编写方法,这些方法将普遍拦截对现有方法的调用,而无需修改原始调用?

谢谢! :)

编辑:我需要独立于分辨率,因此将图形保留在矢量中并且不将它们转换为位图非常重要。

1 个答案:

答案 0 :(得分:0)

您不能在OOP中执行此类操作,您需要覆盖该类(但在您的情况下可能无法实现)或直接修改库。

但是,在您的情况下,可能的解决方案是:

  1. 使用库将SVG绘制为精灵。
  2. 将精灵画到BitmapData
  3. 最后,使用getPixels()获取像素数据并对其进行序列化。
  4. 这样的事情应该有用;

    var sprite:Sprite = new Sprite();
    
    // Add the child to the stage...
    // Draw the SVG to the sprite...
    
    var bmpData:BitmapData = new BitmapData(spriteWidth, spriteHeight);
    bmpData.draw(sprite);
    
    var pixelData:ByteArray = bmpData.getPixels(new Rectangle(0, 0, bmpData.width, bmpData.height));
    
    // Here serialize the byte array
    

    在这个例子中,请注意spriteWidth / spriteHeight不一定是“sprite.width”和“sprite.height”(精灵通常报告尺寸与您的预期不同)。因此,您需要事先确定渲染SVG的大小,并在构建BitmapData时使用它。