难以从外部Flash SWF库中的movieClip获取位图

时间:2014-01-24 16:01:06

标签: actionscript-3 flash

我的测试平台能够将一千个元素合成到屏幕上的剪辑中,但是我无法动态地从外部swf中为Starling提取位图或导出到png。

(我是一个代码屠夫,但尝试了很多变化,并通过spritesheet生成示例))

我已经看到了建议“你不能从一个只有displayObjects(MClip,Sprite)的类中获取bitmapData”,我的行:s = new AssetClass()似乎解决了这个问题。 Correct usage of addtoStage when loading external swf

我能够生成内部矢量movieclip的位图,并使用as3corelib.PNGEncoder.as将其保存到.png,但我最终使用外部swf中的剪辑进行空白png,在Flash Pro中运行CC ..

释义代码:

// swf load done handler:

testBitmap = new Bitmap(new BitmapData(w, h , true, 0x0));

var AssetClass:Class = getDefinitionByName("assetNameFromDatabase") as Class;
var s:MovieClip = new AssetClass();  // AddChild(s) functions properly

var m:Matrix = new Matrix(1, 0, 0, 1, 400, 300);

testBitmap.bitmapData.draw(s, m);

// addChild(testBitmap); or send to PNGEncoder rsult is blank


// internal clip test that does convert to bitmap
var b:MovieClip = new testdMovieClip();
var m:Matrix = new Matrix(1, 0, 0, 1, 200, 300);
testBitmap.bitmapData.draw(b, m);

// ----------------------------

谢谢Vesper,无法用你的建议解决问题,我实际上已经添加到movieClip,只是将它从简化的代码示例中删除,我确实尝试了一些在绘制到位图之前添加实例的变量,仍然没有结果。

// -

***修正案:看起来libs嵌入了“显示但不复制”保护代码?有人可以验证这一点。

我正在使用以swf格式提供的合并movieclip库(我有单独的fla源,我希望避免处理库swfs中的数百个资源,他们从Flash Pro cc中删除swf导入是一个进一步的agrrevation)这是退役游戏的公共领域资料。

使用Trillix试用版,我检查了嵌入式类文件,以及他们拥有此代码的通常的单个资产类:

public override function get movieClipData():flash.utils.ByteArray 
{
  if (bytes == null)
   {
     bytes = flash.utils.ByteArray(new dataClass());
    }
   return bytes;
}


{
   bytes = null;
}

internal static var bytes:flash.utils.ByteArray=null;

// the classes also have
 import flash.utils.*;
 import mx.core.*;      // as well as embedded package mx  files, is that for Flex?

我正在考虑为Air / iOS创建一些无代码的外部库文件,我可能需要学习如何尽快自动合并FLA。

1 个答案:

答案 0 :(得分:0)

我看到了形状/精灵对象的宽度和高度属性的奇怪行为,而它们没有添加到显示列表中,它们返回-100万或其他东西。所以你应该添加,然后绘制,然后删除。当我编写动态生成的精灵时,这个技巧帮助了我。

testBitmap = new Bitmap(new BitmapData(w, h , true, 0x0));
var AssetClass:Class = getDefinitionByName("assetNameFromDatabase") as Class;
var s:MovieClip = new AssetClass();  // AddChild(s) functions properly
addChild(s); // !
var m:Matrix = new Matrix(1, 0, 0, 1, 400, 300);
testBitmap.bitmapData.draw(s, m);
removeChild(s);
addChild(testBitmap); // now should display properly