2009-09-11 5 views
1

J'ai besoin d'un moyen de copier dynamiquement le contenu d'un clip (avec plusieurs images) dans un autre en utilisant as3.Comment copier le contenu d'un clip (avec plusieurs images) sur un autre clip dans flash actionscript 3?

Voici comment j'ai essayé de le faire:

var table:Table = new Table(); //A custom class that extends MovieClip. 
var swf:MovieClip = this.content.swf; //The movie clip I want to copy from. 
for (var z:int = 0; z < swf.totalFrames; z++) //for every given frame of swf. 
{ 
    swf.gotoAndStop(z); 
    table.gotoAndStop(z); 

    for (var i:int = 0; i < swf.numChildren; i++) //for every child of swf. 
    { 
     table.addChild(swf.getChildAt(i)); //copy child from swf to table. 
    } 
} 

Cela ne fonctionne pas correctement. Il copie seulement la première image. Comment puis-je copier chaque image de swf sur la table afin que la table puisse jouer et s'arrêter à travers l'animation tout comme swf peut le faire?

Répondre

1

Il y a plusieurs raisons pour lesquelles cela ne fonctionnera pas, mais l'essentiel est que les cadres n'existent pas à l'exécution de la façon dont vous essayez d'y accéder. Les images sont un concept auteur-temps - lorsque vous mettez certains contenus sur l'image 1 et différents contenus sur l'image 2, au moment de l'exécution, Flash ne garde pas trace des différents ensembles d'enfants pour chaque image. Ce qui est compilé dans le fichier SWF est simplement des instructions selon lesquelles certains enfants doivent être automatiquement ajoutés ou supprimés lors du passage de l'image 1 à l'image 2, ou inversement.

Si vous voulez simplement une deuxième copie d'un MC donné, qui joue à travers les mêmes animations que le premier, ce que vous devez plutôt faire est de dupliquer l'objet lui-même. Dans AS2 vous auriez pu faire avec l'API duplicateMovieClip(), mais malheureusement AS3 n'a pas de commande équivalente. Au lieu de cela, vous devez créer une nouvelle instance du clip que vous voulez dupliquer, avec le code de cette forme:

var swf:MovieClip = this.content.swf; 
var swfClass:Class = swf.constructor; 
var newSwf:MovieClip = new swf.constructor; 

Notez que cela ne fonctionnera pas à moins que l'objet que vous essayez de dupliquer (this.content. swf) a été attaché à une classe (c'est-à-dire que la case à cocher "exporter pour ActionScript" a été sélectionnée) lors de sa publication. Si ce n'était pas le cas, pour autant que je sache, il n'y a aucun moyen de le dupliquer dans AS3. Si c'est le cas, je pense que le mieux que vous pouvez faire est une solution de contournement - par exemple, au lieu de créer une copie du clip, vous pouvez créer un bitmap, et chaque image rend simplement l'apparence du clip original dans BitmapData, et peignez ces données dans le bitmap "dupliqué".

+0

Aucune de ces solutions ne peut m'aider, car mon swf n'a pas d'export vers AS et je ne veux pas utiliser BitmapData car j'ai besoin de mettre à l'échelle mon movieClip sans perte de qualité. J'ai donc créé un nouveau MovieClip et ajouté l'autre en tant qu'enfant, pas parfait, mais assez bon puisque comme vous l'avez dit, il semble qu'il n'y ait pas d'autre moyen de dupliquer un MovieClip dans AS3. Merci pour la réponse. –

+0

Eh bien, si vous n'avez pas réellement besoin de deux copies du clip - vous en avez juste besoin déplacé d'un endroit à l'autre - puis reparent il devrait bien fonctionner. (D'ailleurs, c'est ce que faisait votre code original - quand vous ajoutez un clip à quelque part, vous le supprimez de ce qu'il était auparavant.) Mais en remarque, la solution Bitmap fonctionnerait toujours avec la mise à l'échelle. Lorsque vous restituez un élément dans une image bitmap (avec la méthode BitmapData.draw()), vous pouvez spécifier une transformation (avec rotation, mise à l'échelle, etc.) à appliquer lors du rendu du clip. – fenomas

2

Comme il semble que vous chargez un fichier SWF vous avez une autre option ...

Chargez le fichier SWF en utilisant ByteArray URLoader plutôt que chargeur. Ensuite, vous pouvez créer des objets Loader chaque fois que vous avez besoin d'une nouvelle copie de votre fichier SWF: vous utilisez simplement la méthode loadBytes de Loader pour retirer le fichier SWF de ByteArray.

Questions connexes