实时克隆影片剪辑

Posted

技术标签:

【中文标题】实时克隆影片剪辑【英文标题】:Clone MovieClip in realtime 【发布时间】:2010-11-07 10:50:03 【问题描述】:

我有一个 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 函数。

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

【问题讨论】:

我很难相信位图数据绘制会太慢。您可以发布您正在使用的代码吗? grapefrukt:我已将代码添加到我的帖子中。 如果您不受 Flash Player 9 的限制,您可以使用智能库对图像进行重新采样,以便在调整大小时缩略图看起来清晰。双三次(更锐利)应该这样做。看看这里:clevrlib.riaforge.org 和这里:***sandrus.com/blog/2009/03/11/…。祝你好运! 【参考方案1】:

我的第一个解决方案是 BitmapData.draw() 但你说这太慢了。我认为唯一的其他途径是将其外观传播到另一个电影剪辑,例如当您旋转它时有事件侦听器,并将缩略图上的旋转设置为匹配,这取决于您可以更改多少,这可能需要大量工作。所以 BitmapData.draw 可能是你最好的选择。我以前使用过 BitmapData.draw,但它对我来说似乎从来没有慢过。

【讨论】:

【参考方案2】:

如果您的 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;

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

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

【讨论】:

【参考方案3】:

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。

以上是关于实时克隆影片剪辑的主要内容,如果未能解决你的问题,请参考以下文章

无法在实时服务器中克隆 WordPress 子模块

如何使用 as3 同时访问所有影片剪辑(以及影片剪辑中的影片剪辑......)?

如何在影片剪辑中获取ChildAt 影片剪辑?

如果仅单击五个影片剪辑(不是更多),如何使影片剪辑可见

5 秒实现 AI 语音克隆(Python)

子数涵数·Flash——影片剪辑的控制命令1