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

ActionScript 3 Discussion :

Utiliser une classe dans une autre


Sujet :

ActionScript 3

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut Utiliser une classe dans une autre
    Bonjour,

    J'ai créé une classe "Case" étendant MovieClip pour gérer des temps d'attente au niveau d'une image précise dans un MovieClip.
    J'ai une autre classe, "Planche", qui charge des SWF utilisant cette classe Case.

    Jusqu'à présent, j'utilisais ce SWF en tant que MovieClip et ça fonctionnait sans problème, les temps d'attente étaient bien gérés, tout comme ils le sont bien si le SWF en question est exécuté individuellement.

    J'ai essayé d'améliorer le système en permettant de changer ce temps d'attente depuis la classe Planche, aussi j'ai changé mon système d'appel du SWF, de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.clip = MovieClip(this.caseAnim.content);
    this.clip.play();
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.clip = Case(this.caseAnim.content);
    this.clip.play();
    La classe Case étant bien ajoutée aux imports du paquetage.

    Ce second code ne me renvoie aucun message d'erreur, que ce soit à la compilation ou à l'exécution, mais les temps d'attente sont tout simplement ignorés.

    Des idées sur la cause du problème ?

    Merci de votre aide.

  2. #2
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    ca dépend du contenu de : this.caseAnim.content
    soit un new ou un as

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut
    J'ai testé les deux, aucun ne marche.
    En fait this.caseAnim est un Loader, donc son contenu est un MovieClip de classe Case.

    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.clip = new Case(this.caseAnim.content);
    j'ai l'erreur
    1137: Nombre d'arguments incorrect. Nombre maximum attendu : 0.
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.clip = this.caseAnim.content as Case;
    les fonctions de Case ne sont pas exécutées.

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    ahhh ... dans ce cas crée ton clip a part et fait un addChild() du content

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut
    Comment ça le créer à part ?
    Le clip est déjà créé, après je ne fais que charger le SWF et le jouer, mais j'aimerais être capable d'interagir avec lui directement.

  6. #6
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    utilise les bibliotheque partager.

    D'autre part tu peux utiliser les events , par exemple ton stage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dispatchEvent(new Event(Event.COMPLETE));
    enverra un event de type Event.COMPLETE au clip qui l'a chargé.

    Pour utiliser simplement une class dans une autre :

    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
    package test {
             public Class A {
                     function A(){
     
                     }
             }
    }
     
    package {
             import a.A; //On import le package , si c'est le package par defaut pas besoin.
             public Class B {
                    var objA:A; 
                    function B(){
                          objA = new A(); 
                    }
             }
    }

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut
    D'accord mais là cet exemple montre comment créer un objet, or je ne veux pas en créer un nouveau mais utiliser celui existant dans mon SWF chargé.

  8. #8
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    adapte en passant la référence au constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package {
             import a.A; //On import le package , si c'est le package par defaut pas besoin.
             public Class B {
                    var objA:A; 
                    function B(objA:A){
                          this.objA = objA; 
                    }
             }
    }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut
    C'est exactement la structure que j'utilise depuis le début, mais j'en reviens toujours à mon problème de départ : l'objet fonctionne s'il est de type MovieClip, pas Case.

    Voici ma classe Case :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package anim {
    	import flash.utils.Timer;
    	import flash.events.TimerEvent;
    	import flash.display.MovieClip;
    	import flash.display.LoaderInfo;
     
    	public class Case extends MovieClip {
     
    		private var tempsMulti:Number = 1.0;
     
    		public function Case():void {
    			var param:Object = LoaderInfo(this.loaderInfo).parameters;
    			if (param['tempsMulti'] != null) this.tempsMulti = Number("0"+ param['tempsMulti']);
     
    			trace("init");
     
    			this.stop();
    		}
     
     
    		public function setTempsMulti(temps:Number):void {
    			this.tempsMulti = temps;
    		}
     
    		public function attends(tps:Number):void {
    			var temps:Number = tps * this.tempsMulti;
     
    			var timer:Timer = new Timer(temps, 1);
    			this.stop();
     
    			trace("attends : "+ temps);
     
    			timer.addEventListener(TimerEvent.TIMER, this.suivant);
    			timer.start();
    		}
     
    		private function suivant(event:TimerEvent):void {
    			this.play();
     
    			trace("suivant");
    		}
    	}
    }
    Et dans la classe Planche, les fonctions de chargement et lecture du SWF :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // Lis l'animation de case chargée
    		private function lisAnim():void {
    			this.caseAnim = this.chargeur;
    			this.chargeur = new Loader();
     
    			this.laCase.alpha = 0;
     
    			var nomCase:String = this.laCase.name.toString();
    			this.laCaseNb = nomCase.replace(/p([0-9]*)c([0-9]*)/, "$2");
     
    			var caseSuivanteNb:Number = Number("0"+ this.laCaseNb)+1;
    			if (caseSuivanteNb <= this.nbCases && this.lectureAuto) this.chargeAnim(caseSuivanteNb.toString());
     
    			stage.addChild(this.caseAnim);
     
    			this.clip = this.caseAnim.content as Case;
    			this.clip.play();
    			this.animEnCours = true;
     
    			// On test le clic pour revenir à la planche complète
    			this.caseAnim.addEventListener(MouseEvent.CLICK, this.resetAnimClic);
    			this.caseAnim.addEventListener(Event.ENTER_FRAME, this.testAnimFinie);
    		}
     
    // Chargement de l'animation de case
    		private function chargeAnim(caseNb:String):void {
    			var url:String = this.caseURL.replace(/#planche#/, this.plancheNb);
    			url = url.replace(/#case#/, caseNb);			
    			var urlReq:URLRequest = new URLRequest(url);
     
    			this.chargeur.load(urlReq);
    			this.chargeur.contentLoaderInfo.addEventListener(Event.COMPLETE, this.finChargementAnim);
    		}
    Dans lisAnim(),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.clip = this.caseAnim.content as MovieClip;
    fonctionne parfaitement, les traces de Case sont bien affichées, tandis qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.clip = this.caseAnim.content as Case;
    seule la trace de la fonction de constructeur est affichée...

  10. #10
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    difficile de deviner sans les 2 classes mais le type de content doit être un DisplayObject si tu n'as pas fait une vraie surcouche de la classe Loader ...

    tu as juste a faire un test pour verifier :
    this.caseAnim.content is DisplayObject -> true
    this.caseAnim.content is Case -> false ?!

    regarde dans la DOC a : transtypage



    bizarre ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.caseAnim = this.chargeur;
    this.chargeur = new Loader();
    plutot ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.caseAnim = new Loader();

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2011, 10h32
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  4. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  5. utiliser les attribut d'une classe dans une autre classe
    Par kaissaoui dans le forum Langage
    Réponses: 11
    Dernier message: 18/07/2007, 15h13

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