Forums Développement Multimédia

Aller au contenu

[résolu] Dupliquer image chargée dans deux MC de destination différents

CODE

3 réponses à ce sujet

#1 guu-ji

    Ceinture Jaune

  • Members
  • PipPip
  • 25 messages

Posté 22 April 2014 - 15:10 PM

Bonjour !

Une petite incompréhension...
Je charge une liste d'images dans un tableau via XML. Cette liste d'image, j'en ai besoin dans deux endroits différents (2 mc en dur dans l'appli) pour deux utilisations complètement différentes.

J'ai tenté cela :

function zobilamoucheC(pEvt:Event):void{
var ldr:Loader=pEvt.target.loader;
//1er mc de destination
var c:MovieClip=new MovieClip();
with (c) {
  name = "c"+nbBtCharge;
  addChild(ldr);
}
c.x=c.y=0;
mc1_destination.addChildAt(c,nbBtCharge-1);
//2ème mc de destination
var v:MovieClip=new MovieClip();
with (v) {
  name = "v"+nbBtCharge;
  addChild(ldr);
}
v.x=v.y=0;
mc2_destination.addChildAt(v,nbBtCharge-1);
nbBtCharge++;
if(nbBtCharge<=nbBT){
  chargeCalk(nomDossierContenu+txtArray[nbBtCharge][1]);
}else{
  //instructions
}
}
function chargeCalk(pNom:String):void {
var ldrFd:Loader=new Loader();
var ldrInfo:LoaderInfo=ldrFd.contentLoaderInfo;
ldrInfo.addEventListener(Event.COMPLETE, zobilamoucheC);
ldrFd.load(new URLRequest(pNom));
}
 

ça ne fonctionne pas... les seuls mc dispos sont ceux de la deuxième série. si je mets la deuxième série en commentaire, la 1ère série s'affiche bien

function zobilamoucheC(pEvt:Event):void{
var ldr:Loader=pEvt.target.loader;
//1er mc de destination
var c:MovieClip=new MovieClip();
with (c) {
  name = "c"+nbBtCharge;
  addChild(ldr);
}
c.x=c.y=0;
mc1_destination.addChildAt(c,nbBtCharge-1);
/*
//2ème mc de destination
var v:MovieClip=new MovieClip();
with (v) {
  name = "v"+nbBtCharge;
  addChild(ldr);
}
v.x=v.y=0;
mc2_destination.addChildAt(v,nbBtCharge-1);
*/

nbBtCharge++;
if(nbBtCharge<=nbBT){
  chargeCalk(nomDossierContenu+txtArray[nbBtCharge][1]);
}else{
  //instructions
}
}
function chargeCalk(pNom:String):void {
var ldrFd:Loader=new Loader();
var ldrInfo:LoaderInfo=ldrFd.contentLoaderInfo;
ldrInfo.addEventListener(Event.COMPLETE, zobilamoucheC);
ldrFd.load(new URLRequest(pNom));
}
 

Le seul truc que j'ai trouvé, c'est de tout doubler et de charger deux fois les images du tableau... je me retrouve donc avec une function chargeCalk2 et zobilamoucheC2... là ça fonctionne...

mais ça n'a pas l'air très optimisé... il doit y avoir un moyen de faire mieux non ?

merci à ceux qui m'apporteront des pistes !

G.

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 April 2014 - 15:45 PM

Bonjour Guu-ji


2 petits soucis qui expliquent ton problème.

Un loader, c'est un objet d'affichage.
Quand tu lui appliques un addChild :
un_mc.addChild(ldr);
le loader s'abonne à la liste d'affichage du movieclip un_mc.

Si tu lui affecte un autre addchild :
Quand tu lui appliques un addChild :
un_autre_mc.addChild(ldr);
le loader va se désabonner de la première liste pour s'abonner à celle de un_autre_mc.
C'est le principe de base, il faut l'accepter.

Donc, pour afficher 2 fois ton image, il te faut 2 objets d'affichage… mais construits 'à la main', si l'on peut dire.

Tu as plusieurs façons de procéder : créer un Bitmap aux dimensions de ton image et appliquer un draw du premier.
Ou
Récupérer le Bitmapdata de l'image contenue dans ton loader, et créer un nouveau Bitmap autour du Bitmapdata.




Il y a une petite gymnastique à comprendre entre les bitmap et les bitmapdata :

Le bitmapdata, c'est ce qui contient les pixels et leurs couleurs. Beaoucoup d'infos, c'est lourd. Du coup, on en utilise un seul, même si l'on veut l'afficher plusieurs fois. Pour cela, on crée un Bitmap, qui n'est qu'une coquille vide d'affichage, et on lui demande d'afficher le Bitmapdata.

Quand tu charges une image extérieure, tout cela est transparent pour toi, mais ça fonctionne sur le même principe.
Tu as un Bitmapdata, affiché par un Bitmap, affiché dans ton loader.
Il faut cibler le bitmapdata du bitmap de ton loader et s'en servir pour créer un 2e bitmap, que tu pourras afficher ou tu veux.

De mémoire :
var la_copie:Bitmap = new Bitmap(Bitmap(ldr.content).bitmapdata);
addChild(ldr);
addChild(la_copie);


Est-ce clair ?

#3 guu-ji

    Ceinture Jaune

  • Members
  • PipPip
  • 25 messages

Posté 22 April 2014 - 15:54 PM

Bonjour dldler !

déjà merci car tu es là pour beaucoup de flasheurs dans la panade ! C'est pas la première fois que tu me dépatouilles !
J'ai compris pour le loader qui ne peut s'abonner qu'à une seule liste d'affichage.

Pour le bitmap et bitmapdata, il faut que je patouille un peu avant de voir si j'ai capté.
Donc, je vais tester et je reviens te dire si mon ptit cerveau a réussi à tout avaler.

merci encore (pour les bonnes pistes, pour les explications et pour ta rapidité de réponse) !

G

#4 guu-ji

    Ceinture Jaune

  • Members
  • PipPip
  • 25 messages

Posté 22 April 2014 - 16:30 PM

raaaaaaaa trop bien !
je mets la syntaxe exacte pour ceux qui tomberaient sur ce post en quête d'une solution


function zobilamoucheC(pEvt:Event):void{
var ldr:Loader = pEvt.target.loader;
var bitmapData:BitmapData;
bitmapData = Bitmap(LoaderInfo(pEvt.currentTarget).content).bitmapData;
var img:Bitmap= new Bitmap (bitmapData);
mc1.addChild(ldr);
mc2.addChild(img);
etc...
 

si comme moi vous êtes confrontés à :

Citation

Contrainte implicite d'une valeur du type flash.display:BitmapData vers un type sans rapport flash.display:DisplayObject.
au moment du addChild, c'est que (si j'ai tout compris) bitmapData n'hérite pas de DisplayObject alors que bitmap oui.

Encore merci dldler !!!!



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)