2009-07-01 9 views
2

J'ai un MovieClip avec et l'image à l'intérieur que je peux faire glisser, redimensionner et faire pivoter.Cloner MovieClip en temps réel

Je crée un petit thumbview, ainsi l'utilisateur peut voir à quoi cela ressemblera. C'est essentiellement une petite version du MovieClip principal.

Comment puis-je cloner le MovieClip dans un plus petit, de sorte que lorsque je fais glisser, tourner ou redimensionner l'image dans le MovieClip principal le petit sera mis à jour avec les changements.

J'ai essayé BitmapData draw(), mais c'est trop lent.

Une autre solution?

Mise à jour
Voici le code que je suis actuellement en utilisant:

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); 
} 

la fonction createThumbnail est appelée à chaque glisser, redimensionner, faire pivoter.

Si quelqu'un a une meilleure/moyen plus rapide, laissez-moi savoir;)

+0

i ont du mal à croire qu'un tirage BitmapData serait trop lent Pouvez-vous poster peut-être le code que vous utilisez – grapefrukt

+0

GRAPEFRUKT:.? J'ai ajouté le code –

+0

Si vous n'êtes pas limité à Flash Player 9, vous pouvez utiliser la librairie intelligente pour rééchantillonner votre image afin que les vignettes soient bien nettes lors du redimensionnement. Http://www.brooksandrus.com/blog/2009/03/11/bilinear-resampling-with-flash-player-and-pixel-bender/. Bonne chance! –

Répondre

4

Le dessin de BitmapData est extrêmement rapide: vous devez essayer de modifier votre createThumbnail pour réutiliser le bitmap et le redessiner, l'instanciation d'objet est un gros succès, donc si vous créez un BitmapData et un Bitmap sur chaque . cadre, qui est probablement la source de votre problème

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); 
} 
+0

Oui, mais cela n'en fait qu'une copie bitmap, si c'était, par exemple, une animation, ou quelque chose avec du code, cela ne fonctionnerait pas. Cela fonctionne cependant dans cette situation, donc de toute façon. – bgw

1

Ma première solution allait être BitmapData.draw(), mais vous avez dit que est trop lent. La seule autre route que je pense est de propager son apparence à un autre clip, par exemple. Avoir des écouteurs d'événements lorsque vous le faites pivoter, et réglez la rotation sur le thumnail pour correspondre, en fonction de combien vous pouvez changer cela peut prendre beaucoup de travail. Ainsi, BitmapData.draw pourrait être votre meilleure option. J'ai utilisé BitmapData.draw avant et il n'a jamais semblé me ​​ralentir.

0

Si votre MovieClip peut être créé avec seulement un constructeur, vous pouvez essayer:

//(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; 
} 

Il n'est pas parfait (si besoin de votre constructeur arguments, ou si le clip a été modifié), mais il est le meilleure solution que j'ai vu.

Il n'y a pas de manière explicite en flash pour cloner un MC. : --(

Questions connexes