Forums Développement Multimédia

Aller au contenu

Appeler plusieurs swf à la suite en AS3

as3 appeler plusieurs swf vidéo

24 réponses à ce sujet

#1 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 02 December 2014 - 16:33 PM

Hello,
J'ai un niveau débutant.

J'ai fait une animation sous flash que j'ai découpée en 4 swf distincts. Chacun a un stop à la fin.
Je cherche à les appeler à la suite dans un seul fla en AS3 pour qu'elles se lisent comme une vidéo les unes à la suite des autres.

J'ai beau chercher sur le web, je n'ai pas trouvé de tuto en réponse à mon problème (qui pourtant ne me semble pas compliqué…).
En revanche j'ai trouvé des tutos pour appeler un seul swf (mais évidememment le code ne marche plus quand on en met plusieurs…)

Y aurait-il quelqu'un pour m'aider ?

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 02 December 2014 - 18:10 PM

Salut,

Oui c'est possible.

Si tu n'as pas besoin de code (AS3) et que ce sont juste des animations, tu peux te servir d'une chose que personne n'utilise jamais (ou presque) à savoir les séquences, tu crée une séquence par animation et tu les joues l'une à la suite de l'autre. Mais cette méthode est contraignante car elle va te bloquer si tu utilise du code, générer un SWF lourd, et t'obliger à modifier ton FLA (fichier de travail) et à recompiler le tout à chaque fois que tu veux faire une mise à jour ou ajouter une nouvelle séquence.

L'autre méthode consiste à utiliser un SWF parent qui va charger des SWF enfants, tu as donc un SWF qui se charge de charger les "séquences" et de les jouer dans un certain ordre, et chaque "séquence" est un SWF différent externe à ton application principale. Avec cette méthode tu va être libre d'utiliser du code que tu pourra passer d'une séquence à l'autre, utiliser un fichier XML pour ajouter supprimer des séquences, et donc éviter de recompiler le tout. Enfin, cette méthode va aussi alléger ton projet puisqu'il suffit de charger le SWF principal, et chaque séquence sera chargée en temps voulu.

Si tu veux utiliser la deuxième méthode, dis nous de quel tuto tu es parti et on essayera de te guider pour le transformer en un chargeur multi SWF. Tu peux aussi regarder ce sujet qui pose la même problématique que toi : http://forums.mediab...__fromsearch__1

#3 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 03 December 2014 - 14:51 PM

Waow merci pour cette réponse détaillée !
Eh bien c'est plutôt de la deuxième solution dont j'aurai besoin (selon les besoin les swf seront chargés dans un ordre différents)

J'ai essayé de m'y retrouver dans le lien que tu m'as conseillé, mais c'est d'un niveau trop avancé pour moi. Je ne sais pas où insérer le code qui corrige les problèmes de cette personne et quoi enlever (parce que je n'ai pas de problématique de texte à récupérer dans le xml) :-/

Si je pars avec ça, qu'est ce qu'il me manque ?
var chargementXML:URLLoader = new URLLoader();// objet de chargement
var fichier:URLRequest = new URLRequest("ordre_des_animations.xml");// url du fichier XML chargé
chargementXML.addEventListener( Event.COMPLETE, chargementComplet );
chargementXML.load( fichier );
// chargement terminé du fichier xml;
function chargementComplet(pEvt:Event):void
{// on récupère notre xml
var annonce:XML = new XML(pEvt.target.data);
var infos:XMLList = annonce.elements();
var total= annonce.children().length(); // comptabilise le nombre de noeud du xml
var i:int; // initialise le compteur
for (i=0; i<total; i++)
{
trace (annonce.infos[i])

}}


#4 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 03 December 2014 - 14:55 PM

J'ai oublié de préciser : sur le xml j'ai mis
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<annonce>
  <style>applications.swf</style>
</annonce>
<annonce>
  <style>reduction-app.swf</style>
</annonce>


#5 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 03 December 2014 - 15:40 PM

ca ressemble très fortement a se sujet.
http://forums.mediab...__fromsearch__1
@+

#6 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 12:12 PM

Oui effectivement, c'est le même lien que celui de Monsieur Spi. Mais comme je disais, je n'ai pas un niveau suffisemment avancé pour adapter cela à mon animation…
Je ne pensais pas que ce serait si compliqué d'appeler des swf en AS3 !

#7 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 12:35 PM

met ton projet en pièce jointe au moins.
sinon on va parler dans le vide
@+

#8 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 13:08 PM

Les voici.
Comme je l'ai dit je tatonne, j'ai essayé de remanier le code de l'autre post avec mes maigres connaissances, mais ça ne donne pas grand chose :-/

Fichier(s) joint(s)



#9 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 14:04 PM

j'ai pas cs6 sur cet ordi donc si tu peux creer en cs5 ou creer compile.swf
envois tous les swf ex applications.swf et reduction-app.swf

@+

#10 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 14:13 PM

Tu pourras trouver 2 des animes en flash5 sur ce lien (les autres sont faites sur le même modèle) http://we.tl/sTpYQw3MvW
Et voici le fichier "compile.fla" en flash5

Fichier(s) joint(s)



#11 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 14:51 PM

c'est pas en cs5.
mais je vois que reduction-app.swf possede 170 frame et que tu as mis un stop (); sur la frame 170.
bien
comme dans dans l'exemple page http://forums.mediab...__fromsearch__1 il faudrais mettre frame 170.
this.parent.parent["suite"] = 1;
et renvoyer le swf.

de meme pour appication frame 190
@+

#12 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 15:22 PM

Oups effectivement c'était flash 5.5 !!!

http://we.tl/WS2e2M0AgV
Les voici en flash 5. J'ai ajouté le code sur les swf appelés, comme tu me l'as conseillé mais je n'ai pas dû définir "suite" comme il faut, ça ne change pas grand chose…

#13 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 15:52 PM

erreur 1
va voir ton xml et corrige le.
@+

#14 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 15:58 PM

hum oui… une balise root qui n'était pas fermée.
Mais même corrigé il ne change pas de swf, il reste en boucle sur le premier…

#15 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 16:16 PM

oui bien sur
va voir http://www.citroen-france-tours-nord.fr/disto/compile
c'est ça que tu veux ?
@+

#16 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 16:55 PM

Aaaah oui c'est ça !!!
Que dois-je mettre comme code pour ça ?

(question bonus : sur le xml, je peux lui demander de lire le premier swf seulement à partir de la frame 80 ? pour que ça colle à la voix off… sinon je saurais le faire en modifiant l'anime je pense, mais au cas où je demande :-) )

#17 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 17:21 PM

le code:
le même que celui du sujet précédent.

import flash.events.Event;

var i:uint;// création de la variable i qui va être incrémenter pour nous servir a chercher les info dans le xml la i=0;
var suite:uint; //création de la variable  suite. tu as mis dans tes swf qui vont etre chargé un stop();
                                          // et  this.parent.parent["suite"] = 1; donc quand ton swf est fini il passe la variable suite a 1;
var annonce:XMLList; //création de la variable elle sera disponible dans tout le script
var loader:Loader;//création de la variable loader le conteneur des swf

var chargementXML:URLLoader = new URLLoader();// objet de chargement
var fichier:URLRequest = new URLRequest("ordre_des_animations.xml");// url du fichier XML chargé
chargementXML.addEventListener( Event.COMPLETE, chargementComplet );
chargementXML.load( fichier );
// chargement terminé du fichier xml;

function chargementComplet(pEvt:Event):void {
            // on récupère notre xml
                    var tonXml:XML = new XML(pEvt.target.data);  
                    annonce = tonXml.elements(); // tu peux faire un trace(annonce); pour voir.
                    charge(); // appel de la fonction charge qui sert a charger les swf
                    addEventListener(Event.ENTER_FRAME, suivante); // a chaque enterFrame la fonction suivante est appellée
            i++; // aprés avoir chargé un swf on increment i de + 1 pour pouvoir lors du chargement suivant charger l'autre swf
}
function charge():void{
                   var adresse:URLRequest = new URLRequest(annonce[i].style); // la tu faire un  trace(annonce[i].style);
                   loader = new Loader();
                   loader.load(adresse);
                   addChild(loader); // on charge et on pose sur la scene
}
function suivante (event:Event):void{ // appellé a chaque enterFrame
                          if(suite == 1){   // si suite et a 1 donc si ton swf charge et arrive a sa dernière frame
           removeChild(loader); // retire le loader de la scene ou le swf qui est fini
                                                    charge(); // fait la fonction charge pour recharge le swf suivant
           suite = 0; // la variable suite est reinitialisée a 0
           if(i < annonce.length()-1){   // si i est superieur au nombre de noeud de ton xml i = 0; pour repartir au debut  
                                  i++;
           } else {
                                  i = 0;
           }
         }
}
 
le fla est dispo dans le dossier "http://www.citroen-france-tours-nord.fr/disto/"
voila pour la reponse question 1

#18 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 04 December 2014 - 17:33 PM

la deuxieme question
rappel(question bonus : sur le xml, je peux lui demander de lire le premier swf seulement à partir de la frame 80 ? pour que ça colle à la voix off… sinon je saurais le faire en modifiant l'anime je pense, mais au cas où je demande :-) );

oui en changeant la structure du xml exemple

<root>
<annonce>
  <style>applications.swf</style>
 <page>80</page>
</annonce>
<annonce>
  <style>reduction-app.swf</style>
<page>1</page>
</annonce>
</root>
 
il te restera plus qu'a créer une variable
exemple
var page:uint;
dans la fonction charge tu fais varier aavec
page = annonce[i].page;

dans la premiere image de tes swf
tu mets
stop();
var page:uint = this.parent.parent["page"];
gotoAndPlay(page);

j'espere avoir répondu a tes attentes
@+

#19 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 04 December 2014 - 18:08 PM

oh c'est top c'est je te remercie (je me rends compte que j'aurai eu bien du mal à trouver ça toute seule… !!!)
Je vais m'empresser de tester ça :-)
Bonne soirée

#20 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 05 December 2014 - 05:28 AM

autre version en utilisant un Event
le xml .

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<annonce>
  <style>applications.swf</style>
  <images>80</images>
</annonce>
<annonce>
  <style>reduction-app.swf</style>
  <images>2</images>
</annonce>
</root>
 

l'animation principal (celle qui va charger les autres);

import flash.events.Event;

var i:uint;
var annonce:XMLList;
var loader:Loader;
var frame:uint;//variable qui va nous servir pour transmettre au swf chargé a quel frame demarrer la lecture

var chargementXML:URLLoader = new URLLoader();// objet de chargement
var fichier:URLRequest = new URLRequest("ordre_des_animations.xml");// url du fichier XML chargé
chargementXML.addEventListener( Event.COMPLETE, chargementComplet );
chargementXML.load( fichier );
// chargement terminé du fichier xml;
function chargementComplet(pEvt:Event):void {
                // on récupère notre xml
                        var tonXml:XML = new XML(pEvt.target.data);    
                        annonce = tonXml.elements();
                        charge();
   i++;
}
function charge():void{
                frame = annonce[i].images;// annonce[0].images donne 80 donc le swf démarrera sa lecture frame 80
                var adresse:URLRequest = new URLRequest(annonce[i].style);
                   loader = new Loader();
                   loader.load(adresse);
         loader.addEventListener("SUIVANTE",suivante);
        // on met un écouteur quand le swf chargé arrive a la fin il envois un Event (dispatchEvent)
        // et declenche la fonction suivante
                   addChild(loader);
}
function suivante (event:Event):void{
                removeChild(loader);
                   charge();
         if(i < annonce.length()-1){ i++;} else { i = 0;}
}
 

dans les swf que l'on va charger sur l'image 1


stop(); // arret de la lecture
try { // essaye d'aller a la page " this.parent.parent["frame"] variable frame qui se trouve dans l'anime principal " et pars en lecture
         gotoAndPlay(this.parent.parent["frame"]);
} catch (event:Error){ // si tu n'y arrive pas pars en lecture.
         play();
}
 

dans les swf que l'on va charger sur l'image a laquelle on veut que ça s’arrête


stop(); // arrete la lecture
this.parent.dispatchEvent(new Event ("SUIVANTE"));// envois l'Event qui sera détecté par l'anime principal et déclenchera la suite
 

en espérant que ça serve a quelqu'un
@+
gustave02

#21 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 05 December 2014 - 10:26 AM

Dans ta première proposition, pour l'histoire du démarrage sur la frame 80, quand je mets le code sur la première frame du swf applé, flash me retourne cette erreur : Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at applications_fla::MainTimeline/frame1()

et evidemment quand j'essaie de générer "compile" il me renvoie aussi une erreur…

pour info, voici le code mis sur la première frame du swf appelé :

stop();
var page:uint = this.parent.parent["page"];
gotoAndPlay(page);
 


#22 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 05 December 2014 - 13:53 PM

oui et
"" il te restera plus qu'a créer une variable
exemple
var page:uint;
dans la fonction charge tu fais varier aavec
page = annonce[i].page;""
regarde dans le deuxieme exemple dans l'anime principal je l'ai appellé frame
var frame:uint; en debut de script
et
frame = annonce[i].images; dans la fonction charge.
@+

#23 Disto

    Ceinture Jaune

  • Members
  • PipPip
  • 18 messages

Posté 05 December 2014 - 16:01 PM

Ok je commence à mieux saisir le fonctionnement, je te remercie d'avoir commenté le code en plus, ça m'aide bien pour m'y retrouver.

#24 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 10 December 2014 - 23:07 PM

Voir le messagegustave02, le 05 December 2014 - 05:28 AM, dit :

en espérant que ça serve a quelqu'un
@+
gustave02

Merci beaucoup pour toutes tes explications à Disto sur le forum, ça va me servir à moi aussi prochainement (xml j'y connais rien et donc tout ça tombe dans l'oeil d'une bonne entendeuse... ) ;) Cool !!!!!!!!! :P yeah je garde tout ça dans mes favz.

#25 alicerr

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 14 December 2014 - 12:55 PM

ça nous rend des grandes services.


----------------------------
coque Samsung Galaxy S5 mini
Coque Samsung Galaxy Trend Lite



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP