Forums Développement Multimédia

Aller au contenu

communication entre swf

CODE Actionscript

6 réponses à ce sujet

#1 Jeff22

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 08 November 2011 - 09:56 AM

Bonjour à tous,

J'ai une question et donc un problème sur lequel je bute!
Est-il possible de faire passer la valeur d'une variable d'un swf chargé
vers un swf parent? et comment...bien sûr!
Disons que je charge un swf "conteneur" qui lui-même charge des swf (des animations)...
Je voudrais que l'affichage du premier swf se fasse quand il a finit de charger
les animations.
Pour être plus clair:
- J'ai un swf "racine" avec une barre de chargement
- dans cette "racine" je charge un autre swf "conteneur" qui lui même charge des animations.

Comment faire pour que la barre de chargement du swf "racine" vérifie à la foi
le chargement du swf "conteneur" et des animations?

Merci d'avance pour l'aide!

#2 deuxsucres

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 08 November 2011 - 10:24 AM

Bonjour,

J'utiliserai des évènements : à chaque progression de chargement d'un animation, le SWF conteneur calcul le taux de progression actuel est le distribue via un évènement flash.events.ProgressEvent.PROGRESS. Le SWF principal écoute cet évènement et peut utiliser le résultat.

#3 Jeff22

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 08 November 2011 - 11:38 AM

Oui ok!
En fait je vérifie déjà dans mon code le chargement des animations.
Je stock cette donnée dans une variable.
Jusque là tout va bien.
Mon problème c'est de retourner cette valeur vers mon swf "racine" pour
que mon écouteur principal puisse le prendre en compte lors du chargement!

J'ai regarder du côté de ce tuto mais il semble que l'on ne peut passer des variables
que de parent à enfant et pas l'inverse...en tout cas j'y arrive pas.
Si quelqu'un à donc un bout de la solution...

Merci.

#4 deuxsucres

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 08 November 2011 - 15:33 PM

Je ne pense pas dans ce cas qu'il y ai besoin de communiquer par variable. Le passage par variable de enfant à parent va nécessiter de charger le SWF conteneur dans le même domaine d'application que le SWF racine (Voir dans la doc flash.display.Loader et flash.system.LoaderContext). Si vous avez besoin de plus de communication qu'un simple relai de taux de chargement, il faudra partir sur cette solution. Sinon, la solution par évènement est plus simple :

Code dans le SWF conteneur :

/**
 * Méthode qui écoute le chargement des SWF animation
 */

public function animationsLoadHandler(event:ProgressEvent):void {
  //Traitement du calcul de progression
  //...

  //Distribution de l'évènement de calcul de progression
  dispacthEvent(new ProgressEvent(ProgressEvent.Progress, false, bytesLoaded, bytesTotal)) ;
}
 

Code dans le SWF racine :


// Une fois le chargement du SWF conteneur terminé, écoute le taux de chargement des animations.
swfConteneur.addEventListener(ProgressEvent.Progress, conteneurLoadHandler) ;

/**
 * Méthode qui écoute le chargement relayé par le SWF conteneur.
 */

public function conteneurLoadHandler(event:ProgressEvent):void {
  event.bytesLoaded ; //Bytes chargée
  event.bytesTotal ; //Total de bytes à charger
}
 


#5 Jeff22

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 09 November 2011 - 08:46 AM

Je préviens tout de suite que c'est bien la première foi que j'utilise un dispatchEvent...
donc ne soyez pas trop exigeant!

Si je suis ton raisonnement, dans mon swfConteneur j'ai mis:
chargeurAnim.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,chargementAnimEnProgress);

function chargementAnimEnProgress(evt:ProgressEvent) {
        loadingAnim = chargeurAnim.contentLoaderInfo.bytesLoaded/chargeurAnim.contentLoaderInfo.bytesTotal;
        dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, false, chargeurAnim.contentLoaderInfo.bytesLoaded, chargeurAnim.contentLoaderInfo.bytesTotal));
}
 

Puis dans mon swfRacine j'écoute le chargement du swfConteneur:

var loadingSite:Number;

function chargementEnProgress(evt:ProgressEvent) {
        loadingSite = chargeurSite.contentLoaderInfo.bytesLoaded/chargeurSite.contentLoaderInfo.bytesTotal;
}
 

Enfin dès qu'il a finit, il faut que je vérifie le chargement des animations!
donc il faut que je place tout ça dans une autre fonction?

chargeurSite.contentLoaderInfo.addEventListener(Event.COMPLETE,chargementTermine);

function chargementTermine(evt:Event) {
evt.bytesLoaded ;
evt.bytesTotal ;
???
}
 

Le problème c'est que "chargementTermine" n'est pas un ProgressEvent donc je ne peux pas
trouver bytesLoaded et bytesTotal.

En gros je suis paumé!!!
Au secour!

#6 deuxsucres

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 09 November 2011 - 09:27 AM

Les évènements fournissent généralement des infos utiles. C'est le cas de l'évènement ProgressEvent qui fournit deux propriétés bytesLoaded et bytesTotal. Pas besoin donc d'aller les rechercher dans le contentLoaderInfo.

Pour obtenir l'évènement COMPLETE depuis le SWF racine, il faut également le distribuer depuis le SWF conteneur, ce qui pourrai donner :


chargeurAnim.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, chargementAnimEnProgress);
chargeurAnim.contentLoaderInfo.addEventListener(Event.COMPLETE, chargementAnimComplet);

function chargementAnimEnProgress(evt:ProgressEvent) {
  dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, false, evt.bytesLoaded, evt.bytesTotal));
}

function chargementAnimComplet(evt:Event) {
  dispatchEvent(new Event(Event.COMPLETE));
}
 

Pour écouter un évènement, il faut ajouter un écouteur, ce que fait la méthode addEventListener. Comme dans le cas du SWF conteneur, c'est directement le SWF qui va distribuer les évènements, on l'écoute directement (contrairement au SWF conteneur qui écoute contentLoaderInfo de chargeurAnim). Ce qui donne :


conteneur.addEventListener(ProgressEvent.PROGRESS, contentEnProgress);
conteneur.addEventListener(Event.COMPLETE, contentComplet);

function contentEnProgress(evt:ProgressEvent) {
  // Chargement des animations depuis le SWF conteneur en cours
  var tauxChargement:Number = evt.bytesLoaded / evt.bytesTotal ;
}

function contentComplet(evt:Event) {
  // Chargement des animations depuis le SWF conteneur terminé
}
 


#7 Jeff22

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 09 November 2011 - 09:31 AM

Autres chose!

Quelqu'un saurait-il faire fonctionner un LoaderMax avec la propriété RequierWithRoot?
à tout hasard!



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

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