实时克隆MovieClip

时间:2009-07-01 20:07:37

标签: flash actionscript-3 image-processing movieclip

我有一个带有和里面图像的MovieClip,我可以拖动,调整大小和旋转。

我正在创建一个小拇指视图,因此用户可以看到它的外观。这实际上是主要MovieClip的一个小版本。

如何将MovieClip克隆成较小的一个,这样当我在主MovieClip中拖动,旋转或调整图像大小时,将会根据更改更新小图片。

我尝试过BitmapData draw(),但速度太慢了。

还有其他解决方案吗?

更新
这是我目前正在使用的代码:

import flash.display.Bitmap;
import flash.display.BitmapData;

function createThumbnail() {
    var bmd:BitmapData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C);    
    bmd.draw(mcBig);
    var b:Bitmap = new Bitmap(bmd);
    b.smoothing = true;
    b.scaleX = 0.2;
    b.scaleY = b.scaleX;
    mcSmall.addChild(b);
}

每次拖动都会调用createThumbnail函数,调整大小,旋转。

如果有人有更好/更快的方式,请告诉我;)

3 个答案:

答案 0 :(得分:4)

BitmapData绘图非常快。您应该尝试修改createThumbnail以重用位图并重新绘制它。对象实例化是一个很大的问题,所以如果你在每一帧上创建一个新的BitmapData和Bitmap,那可能是你问题的根源。

import flash.display.Bitmap;
import flash.display.BitmapData;

private var _myThumb:Bitmap;            // you'll probably want to have one of these for each mcSmall instance, instead of a class-level variable - this is just here for sample reference
private var _myThumbData:BitmapData;

function createThumb() {
    _myThumbData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C);
    _myThumb = new Bitmap(_myThumbData);
    _myThumb.smoothing = true;
    _myThumb.scaleX = _myThumb.scaleY = 0.2
    mySmall.addChild(_myThumb);
}

createThumb();    // call this just once per thumbnail

function createThumbnail() {    //call this every draw frame
        _myThumbData.draw(mcBig);
}

答案 1 :(得分:1)

我的第一个解决方案是BitmapData.draw(),但你说这太慢了。我认为唯一的其他路线是将其外观传播到另一个影片剪辑,例如旋转时有事件监听器,并设置thumnail上的旋转以匹配,具体取决于你可以改变多少,这可能需要很多工作。所以BitmapData.draw可能是你最好的选择。我之前使用过BitmapData.draw,它似乎从来没有对我表现得太慢。

答案 2 :(得分:0)

如果只使用构造函数创建MovieClip,则可以尝试:

//(stolen from http://www.dannyburbol.com/2009/01/movieclip-clone-flash-as3/)
public function duplicateDisplayObject(
                                source:DisplayObject,
                                autoAdd:Boolean = false
                                ):DisplayObject
{
    // create duplicate
    var sourceClass:Class = Object(source).constructor;
    var duplicate:DisplayObject = new sourceClass();

    // duplicate properties
    duplicate.transform = source.transform;
    duplicate.filters = source.filters;
    duplicate.cacheAsBitmap = source.cacheAsBitmap;
    duplicate.opaqueBackground = source.opaqueBackground;
    if (source.scale9Grid) {
        var rect:Rectangle = source.scale9Grid;
        // WAS Flash 9 bug where returned scale9Grid is 20x larger than assigned
        // rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;
        duplicate.scale9Grid = rect;
    }

    // add to source parent’s display list
    // if autoAdd was provided as true
    if (autoAdd && source.parent) {
        source.parent.addChild(duplicate);
    }
    return duplicate;
}

它不完美(如果你的构造函数需要参数,或者剪辑是否被修改过),但这是我见过的最佳解决方案。

在Flash中没有明确的方法来克隆MC。 : - (