通过SWFBridge将BitmapData对象从AS2 swf传输到父AS3 swf

时间:2011-01-05 15:32:41

标签: actionscript-3 actionscript flash

我需要将在AS2 swf中创建的BitmapData对象传输到AS3 swf。我正在使用gskinner的SWFBridge在两部Flash电影之间建立双向通信。

AS3电影加载AS2 swf,它完全独立工作,让用户操作MovieClip,最后根据他创建的合成生成图像。我需要AS3电影来接收这个图像(bitmapData),做一些花哨的图像处理东西AS2无法做到并将新图像发送回AS2电影。

所以这是代码

AS2 swf:

var userCompo_mc:MovieClip = container.createEmptyMovieClip("userCompo_mc",10);
var image:BitmapData = new BitmapData(userCompo_mc._width, userCompo_mc._height);
finalCompo.attachBitmap(image); // Just to make sure the final bitmap is right
image.draw(userCompo_mc, compo.title);

//Send the image to the AS3 movie
sb1.send("imageTransfer",image);

AS3 swf:

function imageTransfer(bitmapData:BitmapData, title:String):void
{
    var bmp:Bitmap = new Bitmap(bitmapData);
    this.addChild(bmp);
    trace(title); // --> returns the right title
    trace(bitmapData); // --> returns null
}

我认为使用类似copyPixel32()之类的东西,将所有内容保存到数组中然后将其传递给AS3就可以解决这个问题,但这真的是一种性能问题。

另外,我不是允许将AS2 swf转换为AS3代码。

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

似乎as2电影为图像添加了一些装饰/动画片段。 之后,您绘制它并发送尝试将其发送到as3。

由于所有像素的循环很慢,正如你所提到的,我想从as3电影中绘制as2内容会更快。

e.g。

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded);
loader.load(new URLRequest('yourAS2Movie.swf'),new LoaderContext(true));

function loaded(event:Event):void{
    var as2Clip:AVM1Movie = AVM1Movie(loader.content);
    var bd:BitmapData = new BitmapData(as2Clip.width,as2Clip.height,false,0);
    bd.draw(as2Clip);
    addChild(new Bitmap(bd));
}

在此代码段中,as2内容在加载时绘制。在你的情况下,你会触发/调用一个函数,通过SWFBridge绘制as2内容,as2电影准备好/设置为你需要的。

这假设你想在as3电影中显示as2内容,这意味着你无论如何都要加载as2电影。如果没有,请加载as2内容,但不要将其添加到显示列表,这意味着您将加载as2电影。否则,您可以尝试使用服务器端语言(例如php)从as2电影中保存最终位图,然后通过SWFBridge在as3电影中触发一个函数,该函数将加载以前保存的图像。

HTH