IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Discussion :

Problème d'accès aux variables d'un MovieClip chargé dynamiquement


Sujet :

Flash

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut Problème d'accès aux variables d'un MovieClip chargé dynamiquement
    Bonjour à tous,

    Pour l'application sur laquelle je travaille, j'ai 2 types d'interface utilisateur: une en 16/9 et une en 4/3, les 2 comportent les mêmes objets mais sont disposées différemment.

    Pour ne pas avoir à écrire deux fois mes scripts, je charge ces variables depuis un swf de base interface_base.swf qui ne comprend qu'un clip chargement_ecran qui va contenir mon interface visuelle.

    En fonction du contexte je charge l'interface 4/3 ou 16/9. Dans chacune de ces interface visuelle, il y a un clip ecran qui doit charger un autre swf. Je voudrais ne mettre aucun script dans les fichiers interface_4_3 et interface_16_9, ils ne sont qu'une couche de présentation.

    Mon problème est que je n'arrive pas à accéder à ce clip ecran depuis l'interface de base. Je m'explique .

    - Je charge interface_16_9.swf dans ecran_chargement
    - Lorsque je veux accéder à ecran_chargement.ecran, ça me dit que la variable est undefined

    Avez-vous une idée de pourquoi?

    Merci d'avance

  2. #2
    Membre averti Avatar de aorgerit
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 257
    Points : 301
    Points
    301
    Par défaut
    bonjour,

    première piste à étudier : vérifier que le swf soit bel et bien chargé avant d'interroger l'objet.
    exemple qui ne marche pas :
    _root.mon_clip.loadMovie("fichier.swf");
    trace(_root.mon_clip.ma_variable);
    ça ne passe pas car ton fichier "fichier.swf" n'est pas encore chargé dans "_root.monclip"

    à vérifier donc de ton coté, car si la var écran éxiste bel et bien sur le root de chacun de tes deux fichiers :
    _root.ecran_chargement.ecran
    devrait être reconnue par le flash player.

    bien à toi

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Je connais ce problème, c'est pour cela que j'ai utilisé un Listener:

    voici la portion de mon code concernée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    var loadListener:Object = new Object();
    loadListener.onLoadComplete = function(target_mc:MovieClip, httpStatus:Number):Void {
    	_root.ecran = ecran_chargement.ecran;
    	ecran_chargement.ecran.loadMovie("animations/" + _root.g_tTypeLieu[_root.type_lieu_courant]);
    }
    
    var mcLoader:MovieClipLoader = new MovieClipLoader();
    mcLoader.addListener(loadListener);
    
    
    function onMessage(chaine)
    {
    	_root.xml_file = "lieu_"+chaine.firstChild.attributes.lieu+".xml";
    	_root.lieu_chargement = chaine.firstChild.attributes.lieu;
    	_root.type_lieu_courant = chaine.firstChild.attributes.type;
    	if (_root.type_lieu_courant >= 3 ) {
    		mcLoader.loadClip("animations/interface_4_3.swf", ecran_chargement);
    	} else {
    		mcLoader.loadClip("animations/interface_16_9.swf", ecran_chargement);
    	}
    }
    quand je mets les 2 lignes en gras dans interface_4_3.swf, ça fonctionne sans problème et je peux afficher _root.ecran, elle vaut "_level0.ecran_chargement.ecran" mais comme ça, ça ne fonctionne pas.

  4. #4
    Membre averti Avatar de aorgerit
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 257
    Points : 301
    Points
    301
    Par défaut
    je pense que la solution ets là :
    _root.ecran = ecran_chargement.ecran;

    à remplacer par :
    _root.ecran = _root.ecran_chargement.ecran;

    bien à toi.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Merci encore pour ta réponse.

    Je viens de tester ta proposition et ça ne fonctionne pas. _root.ecran reste undefined.

    Je ne vois vraiment pas pourquoi ça ne fonctionne pas. Soit j'ai fait une énorme boulette, soit ce n'est pas possible (mais ça serait tout de même étonnant)

  6. #6
    Membre averti Avatar de aorgerit
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 257
    Points : 301
    Points
    301
    Par défaut
    bonjour,

    je ne suis une buse je n'ai pas vu ça :

    var loadListener:Object = new Object();
    loadListener.onLoadComplete = function(target_mc:MovieClip, httpStatus:Number):Void {
    _root.ecran = ecran_chargement.ecran;
    ecran_chargement.ecran.loadMovie("animations/" + _root.g_tTypeLieu[_root.type_lieu_courant]);
    }

    ta deuxième ligne tu charge à nouveau ... dans une var, non dans un un mc, non ?

    bien à toi.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Non, dans la deuxième ligne je définis le comportement du listener. C'est le code qui sera appelé quand le movieclip aura fini son chargement

  8. #8
    Membre averti Avatar de aorgerit
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 257
    Points : 301
    Points
    301
    Par défaut
    bonjour,

    _root.ecran = _root.mcLoader.ecran_chargement.ecran;

    mais j'ai une question, à quoi correspond "ecran" dans ecrab_chargement.

    bine à toi

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Bonjour et désolé de répondre si tard, j'étais parti en week-end

    Déjà pour répondre à ta question "ecran_chargement est un movieclip, indépendant de "ecran" tout seul. Les deux sont donc bien distincts.

    sinon j'ai essayé ta proposition, malheureusement elle ne fonctionne pas non plus... :/

  10. #10
    Membre averti Avatar de aorgerit
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 257
    Points : 301
    Points
    301
    Par défaut
    bonjour

    peux tu mettre ton fla à dispo de base je te prie, avé le fichier xml si possible

    merci

  11. #11
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Bonjour et merci beaucoup pour ton aide.

    J'ai trouvé une explication (et une solution) à mon problème.

    Effectivement, le hic est bien celui que tu pensais, la variable ecran n'existe pas encore. Je pensais qu'en utilisant un MovieClipLoader et un Listener, comme je l'ai fait, j'allais pouvoir attendre l'instanciation du Clip pour exécuter le traitement mais j'avais tort:
    Au moment de l'execution du code contenu dans onLoadComplete le clip est bien chargé mais il n'est pas encore instancié. Et c'est cette nuance qui fait toute la différence.

    J'ai donc mis le code que je veux exécuter dans le gestionnaire d'événement de mon clip "ecran_chargement" et là ça fonctionne très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    onClipEvent (load) {
    	if (ecran != null) {
    		_root.ecran = ecran;
    		_root.ecran.loadMovie("animations/"+_root.g_tTypeLieu[_root.type_lieu_courant]);
    	}
    }
    Penses-tu que la solution est bonne?
    Merci encore

  12. #12
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    Salut,

    Citation Envoyé par Tourix
    Penses-tu que la solution est bonne?
    moi je pense que non Pourquoi ? Pour les points suivants :
    - le onClipEvent(...) c'est du Flash 5 et c'est obsolète. Depuis flash mx, on nomme les clips et on fait monClip.onLoad = function(){...}
    - les _root sont à éviter ! C'est du ciblage absolu. Préfère l'utilisation de this et _parent

    voilou déjà ca

    @++
    Libzippp (C++)
    Lost in AStorm

  13. #13
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Bonjour thecaptain et merci de ta participation.
    Je vais me défendre sur les deux points que tu as soulevés

    Citation Envoyé par thecaptain
    - le onClipEvent(...) c'est du Flash 5 et c'est obsolète. Depuis flash mx, on nomme les clips et on fait monClip.onLoad = function(){...}
    Je me justifierai par un extrait du guide de référence ActionScript:

    Citation Envoyé par Classes ActionScript > MovieClip > onLoad (gestionnaire MovieClip.onLoad)
    Si vous souhaitez qu'un gestionnaire d'événements soit appelé lors du chargement d'un clip spécifique, vous devez utiliser onClipEvent(load) ou la classe MovieClipLoader à la place de ce gestionnaire ; par exemple, lorsque vous utilisez MovieClip.loadMovie() pour charger un fichier SWF de manière dynamique
    Et c'est ce que je fais, je charge un swf externe de manière dynamique, d'où l'utilisation de onClipEvent.

    Concernant le deuxième point

    Citation Envoyé par thecaptain
    - les _root sont à éviter ! C'est du ciblage absolu. Préfère l'utilisation de this et _parent
    Je sais bien que _root est du ciblage absolu, et c'est justement ce que je cherche en fait L'architecture de mon application est relativement complexe et charge beaucoup de fichiers externes. Si bien que la hierarchie est plutôt difficile à connaitre depuis chaque fichier. J'utilise _root justement pour toujours savoir où j'en suis. Je m'en sers pour avoir des fonctions et variables globales quoi

  14. #14
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    re,

    Alors en ce qui concerne les onClipEvent(...) et autres on(...), dans la communauté des flasheurs, tout le monde s'accorde à dire qu'il faut les éviter. Pourquoi ? Ce n'est pas que ca ne marche pas MAIS imagine qu'un gaillard doive pour une raison x ou y fouiller ton code et que tout le code est éparpillé sur des clips avec des onClipEvent et autre, on s'en sort pas ! C'est pour cela que depuis Flash MX, on concentre au maximum le code sur les frames (d'ailleurs on code à 100% sur les frames ), comme ça on s'y retrouve beaucoup plus facilement.

    En ce qui concerne le _root, je suis en fervant opposant à ca Il n'y a que très peu de cas ou on est "forcé" d'utiliser le _root (FlashVars par exemple). Dans tous les autres cas, on préfère le this et _parent. Ca posera beaucoup moins de souci si tu dois changer ta hiérarchie

    @++
    Libzippp (C++)
    Lost in AStorm

  15. #15
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Je suis bien d'accord avec toi sur le premier point. C'est d'ailleurs pour ça que je concentre tout mon code sur un calque de la première frame, c'est d'ailleurs ce que j'essaie de faire depuis le début. Mais le problème c'est qu'apparemment, si dans ce calque, je mets une fonction ecran_chargement.onLoad = function() { ... } ça ne fonctionne pas et j'ai trouvé l'explication dans la doc (cf l'extrait que j'ai cité auparavant)

    Donc au final, je n'ai pas vraiment le choix

    Voici ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ecran_chargement.onLoad = function() {
    	if (ecran_chargement.ecran != null) {
    		_root.ecran = ecran_chargement.ecran;
    		_root.ecran.loadMovie("animations/"+_root.g_tTypeLieu[_root.type_lieu_courant]);
    	}
    	ecran_chargement.pda.onRelease = function() {
    		ecran_chargement.Pages.loadMovie("animations/pda.swf");
    	};
    }
    En ce qui concerne le _root, la raison est que j'ai besoin d'accéder à certaines variables et certaines fonctions depuis n'importe où. A la limite je pourrais utiliser un singleton peut-être (je ne sais pas Flash le permet, bien qu'il me semble logique que oui) mais bon en soi ça ne changerait pas grand chose

  16. #16
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    re,

    pour la gestion de l'arrivée du clip dans flash, je te conseille plutot de passer par MovieClipLoader. Personellement, je n'utilise jamais le onLoad de MovieClip Quant aux _root, je te conseille trèèèès fortement de passer par un Singleton

    @++
    Libzippp (C++)
    Lost in AStorm

  17. #17
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Re,

    Comme je l'ai dit précédemment, je passais à l'origine par un MovieClipLoader, mais ça ne résout pas mon problème. le mcloader propose bien une méthode onLoadComplete mais elle est appelée quand le swf que je load est chargé, avant qu'il ne soit instancié. Donc quand je fais référence à la variable ecran de mon swf chargé dynamiquement par ce biais, elle n'existe pas encore

  18. #18
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    re,

    Je te soupçonne de ne pas avoir lu la doc Tu as l'événement onLoadInit qui est appelé lorsque le clip commence à jouer (et donc est instancié) !!

    @++
    Libzippp (C++)
    Lost in AStorm

  19. #19
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Tes soupçons ne sont pas fondés. J'ai lu la doc, mais je l'ai mal lue

    Effectivement, c'est la méthode onLoadInit qu'il me fallait depuis le début et que je cherchais désespérément alors qu'elle était sous mon nez

    Bon j'avoue j'ai honte de moi sur ce coup..

    en tout cas un grand merci à toi, ça règle mon problème et j'ai pu remettre tout mon code dans le calque de la première frame.

    Merci

  20. #20
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut
    Citation Envoyé par Tourix
    Tes soupçons ne sont pas fondés. J'ai lu la doc, mais je l'ai mal lu
    héhé pas de souci ca arrive à tout le monde

    @++
    Libzippp (C++)
    Lost in AStorm

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème enum et tableau (accès aux variables)
    Par vangoeth dans le forum Android
    Réponses: 24
    Dernier message: 21/12/2012, 20h29
  2. [C#] Accès aux variables Session
    Par kalan dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/08/2005, 16h40
  3. [FLASH MX2004] [AS2] Accès aux variables d'une classe
    Par stailer dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 17/07/2005, 12h58
  4. [Language]Accès aux variables
    Par Adaemon dans le forum Langage
    Réponses: 12
    Dernier message: 27/04/2005, 14h17
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo