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 :

problème de communication entre mes classes


Sujet :

ActionScript 3

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut problème de communication entre mes classes
    Hello !
    Bon je pense que c'est super simple et que encore une fois je suis super nulle... mais bon, je débute, je ne suis qu'une humble graphiste à la base...

    J'ai dans ma MainClass utilisé une méthode publique : myGotoAndStop

    De mon clip principal j'ai loadé un clip swf fille, ce clip fille a une classe : ClasseMonChoix

    Dans la ClasseMonChoix, je voudrais réutiliser la méthode myGotoAndStop mais là, j'ai une erreur comme quoi ma méthode ne semble pas avoir été définie...
    Moi, je pensais que les classes discutaient entre elles, qu'on avait pas besoin de les présenter ;-)

    Je suppose que je pourrais réécrire ma méthode dans cette classe ClasseMonChoix, mais je voudrais éviter de réécrire 20 fois le même code alors qu'il doit être possible de le partager..

    Sérieusement, je ne sais pas comment faire....
    Merci de votre aide


    Code (simplifié) de MainClass :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    package Classes{
     
    	import flash.display.*;
    	import flash.events.*;
    	import flash.system.*;
    	import flash.net.*;
    	import flash.ui.*;
     
    	public class MainClass extends MovieClip {
     
    		// variable permettant l’exécution de la fonction de rappel 
    		private var rappel:Function;
     
    		// variable permettant de télécharger les swf filles
    		private var chargeur:Loader;
     
    		// variable permettant de donner le nom du swf fille à charger
    		private var filleClip:URLRequest
     
    		public function MainClass() {
     
    			trace( "initialisation MainClass" );
    			trace( "-----------" );
     
    				// on écoute les boutons du menu principal
    				btnAccueil.addEventListener( MouseEvent.MOUSE_DOWN, versAccueil );
     
    			}		
     
    			function versAccueil( event ):void {
     
    				// déplace la tête de lecture à l'étiquette, lorsque tous les objets sont disponibles 
    				// la fonction actifAccessible est déclenchée 
    				myGotoAndStop( "accueil", actifAccessibleAccueil );
    			}
     
    			function actifAccessibleAccueil():void {
     
    				// on écoute le bouton qui permet de loader la fille
    				btnAccueil.addEventListener( MouseEvent.MOUSE_DOWN, monChoix );
     
    			}
     
     
    		}//fin public function MainClass()
     
     
    		public function monChoix( event:MouseEvent ):void {
     
    		filleClip = new URLRequest("monChoix.swf");
     
     		chargementFille();
     
    		}
     
     
    		// fonction de déplacement de la tête de lecture personnalisée
    		public function myGotoAndStop( pImage:String, pFonction:Function ):void {
     
    			// déplacement de la tête de lecture 
    			gotoAndStop( pImage );
     
    			// retourne un objet permettant 
    			rappel=pFonction;
     
    			// écoute de l'événement Event.RENDER 
    			addEventListener( Event.RENDER, miseAJour );
     
    			// force la diffusion de l'événement Event.RENDER 
    			stage.invalidate();
    		}
     
    		private function miseAJour( pEvt:Event ):void {
    			// nous tentons d'appeler la fonction de rappel 
    			// si cela échoue, nous affichons un message d'erreur  
    			// dans tout les cas, nous supprimons l'écoute de l'événement Event.RENDER
    			try {
    				rappel();
    			} catch (pErreur:Error) {
    				trace( "Erreur : La méthode de rappel n'a pas été définie" );
    			} finally {
    				removeEventListener( Event.RENDER, miseAJour );
    			}
    		}
     
     
    		//permet de loader la fille
    		public function chargementFille():void {
     
    			//on crer un nouveau contenant
    			chargeur = new Loader();
     
     			//on charge le clip à l'interieur
    			chargeur.load ( filleClip ); 
     
    			//le chargeur est ajouter à la liste d'affichage
    			addChild ( chargeur );
     
    			//on ecoute quand le contenu est fini de charger
    			chargeur.contentLoaderInfo.addEventListener ( Event.COMPLETE, termine );
     
    		}
     
    		//quand le clip est fini de charger à l'interieur du contenant
    		private function termine ( pEvt:Event ):void { 
     
    			// référence le scénario de l'animation chargée 
     			var scenario:DisplayObject = pEvt.target.content; 
     
    			 // affiche : [object MainTimeline] 
    			 trace( scenario ); 
    		}
     
    	}// fin de public class MainClass
     
    }// fin du package

    Code (simplifié) de ClasseMonChoix :

    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
    package Classes{
     
    	import flash.display.*;
    	import flash.events.*;
    	import flash.system.*;
    	import flash.net.*;
    	import flash.ui.*;
     
    	public class ClasseMonChoix extends MovieClip {
     
    		public function ClasseMonChoix() {
     
    			//ecouteur pour le bouton continuer
    			btnContinuer.addEventListener( MouseEvent.MOUSE_DOWN, continuer );
     
    			//fonction du bouton continuer
    			function continuer(event:MouseEvent):void {
     
    				trace ("continuer");
     
    				//déplace la tête de lecture à l'étiquette, lorsque tous les objets sont disponibles, 
    				//la fonction actifAccessible est déclenchée 
    				myGotoAndStop( "etiquette2", actifAccessibleEtiquette2);
     
    			}
     
    			function actifAccessibleEtiquette2():void {
     
    				trace("ça marche : etiquette 2");
    				trace( "-----------" );
    			}
     
     
    		}//fin public function ClasseMonChoix()
     
    	}// fin de public class ClasseMonChoix
     
    }// fin du package

  2. #2
    Membre habitué
    Profil pro
    Développeur multimédia
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Points : 176
    Points
    176
    Par défaut
    Ces 2 classes ne se connaissent pas car aucune n'instancie l'autre.

    Tes 2 classes héritent de MovieClip. Créé une classe classeMere, dans laquelle tu écrit la méthode myGotoAndStop.

    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
     
    package  
    {
    	import flash.display.MovieClip;
     
    	public class ClasseMere extends MovieClip
    	{
     
    		public function ClasseMere() 
    		{
    			//init
    		}
     
    		// fonction de déplacement de la tête de lecture personnalisée
    		public function myGotoAndStop( pImage:String, pFonction:Function ):void {
     
    			// déplacement de la tête de lecture 
    			gotoAndStop( pImage );
     
    			// retourne un objet permettant 
    			rappel=pFonction;
     
    			// écoute de l'événement Event.RENDER 
    			addEventListener( Event.RENDER, miseAJour );
     
    			// force la diffusion de l'événement Event.RENDER 
    			stage.invalidate();
    		}
     
    	}
     
    }
    puis tes 2 autres classes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class MainClass extends ClasseMere { //...
    Supprime la méthode myGotoAndStop de cette classe puisqu'elle en hérite désormais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ClasseMonChoix extends ClasseMere { //...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut oui mais
    mes classes MainClass et ClasseMonChoix sont liés à mes clips dans les propriétés sinon ça ne fonctionne pas, donc il ne peuvent pas être extends ClasseMere puisqu'ils doivent être extends MovieClip ...

  4. #4
    Membre habitué
    Profil pro
    Développeur multimédia
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Points : 176
    Points
    176
    Par défaut
    Ca ne pose pas de problème, tu remplace la "classe de Base" avec ta classe ClasseMere et ça reviens au même.

    De plus, ClasseMere extends MovieClip, donc par extension, MainClass et ClasseMonChoix étendront MovieClip, de la même manière que Movieclip étend Sprite, donc étends DisplayObjectContainer, donc étends InteractiveObject, donc étend DisplayObject, donc étend EventDispatcher....

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Je viens de faire l'essai en liant mon .fla qui est mon clip de début avec la ClasseMere extends MovieClip (où il n'y a que ma fonction myGotoAndStop) et du coup mon MainClass est extends ClasseMere...

    Et ben il ne joue plus rien parce que du coup il n'y a plus d'accès à tout mes codes qui étaient sur MainClass je pense...


    Et j'ai essayé aussi de garder la MainClass liée à mon clip de début et de faire ClasseMonChoix extends MainClass mais y'a des bugs...

    Il a besoin de faire des liens entre les .fla et les .as car les éléments sont déjà sur la scène (c'est une contrainte)... d'où d'ailleurs la fonction myGotoAndStop

    Bon sinon ça marche si je remets mon code de myGotoAndStop dans ClasseMonChoix mais j'aurais voulu éviter de le réécrire à chaque fois... j'avais un ami qui m'avait parlé de mettre juste un code dans un as pour le rappeler ensuite un genre de "colle ici juste le bout de code" mais je ne me souviens plus comment...

    Merci en tous cas...

  6. #6
    Membre habitué
    Profil pro
    Développeur multimédia
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Points : 176
    Points
    176
    Par défaut
    L'autre solution serait de faire une method static effeectivement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class ClasseB{
    <div style="margin-left:40px">public function ClasseB{}</div><div style="margin-left:40px">static public function myGotoAndPlay(arg1, arg2){
    //blabla
    }</div>}
    Et tu appelle la méthode dans ton code en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseB.myGotoAndPlay(value1, value2);
    Le souci c'est qu'avec cette méthode, tu ne peux souvent pas faire de new dans cette méthode.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    j'ai fait une classe TeteLecture :

    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
    44
    package Classes{
     
    	import flash.display.*;
    	import flash.events.*;
     
    	public class TeteLecture {
     
    		// variable permettant l’exécution de la fonction de rappel 
    		private var rappel:Function;
     
    		public function TeteLecture() { 
    		}
     
    		static public function myGotoAndStop( pImage:String, pFonction:Function ):void {
     
    			// déplacement de la tête de lecture 
    			gotoAndStop( pImage );
     
    			// retourne un objet permettant 
    			rappel=pFonction;
     
    			// écoute de l'événement Event.RENDER 
    			addEventListener( Event.RENDER, miseAJour );
     
    			// force la diffusion de l'événement Event.RENDER 
    			stage.invalidate();
    		}
     
    		private function miseAJour( pEvt:Event ):void {
    			// nous tentons d'appeler la fonction de rappel 
    			// si cela échoue, nous affichons un message d'erreur  
    			// dans tout les cas, nous supprimons l'écoute de l'événement Event.RENDER
    			try {
    				rappel();
    			} catch (pErreur:Error) {
    				trace( "Erreur : La méthode de rappel n'a pas été définie" );
    			} finally {
    				removeEventListener( Event.RENDER, miseAJour );
    			}
    		}
     
    	}// fin de public class TeteLecture
     
    }// fin du package
    et dans mon code sur la ClasseMonChoix j'ai mis partout TeteLecture.myGotoAndStop(arg1,arg2); où il fallait...

    mais j'ai des drôles de bugs du genre
    1180: Appel à une méthode qui ne semble pas définie, gotoAndStop.
    1120: Accès à la propriété non définie rappel.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    en fait je ne sais pas trop où mettre ma variable rappel et ma fonction miseAJour... encore des extends ?

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Salut,

    Pourquoi vouloir faire deux classes pour ça ? et pourquoi à la ligne 45 de ton code MainClass tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }//fin public function MainClass()
    Cette accolade ferme la classe, ce que tu écris à la suite ne marchera pas !

    Edit : Et pour utiliser une méthode statique, il ne faut pas qu'à l'intérieur il y ait une référence à une instance de la classe. Une méthode statique s'exécute sans connaître aucune instance particulière de la classe à laquelle elle appartient.

    Par exemple dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static public function myGotoAndStop( pImage:String, pFonction:Function ):void {
     
                // déplacement de la tête de lecture
                gotoAndStop( pImage );
     
                // retourne un objet permettant
                rappel=pFonction;
     
                // écoute de l'événement Event.RENDER
                addEventListener( Event.RENDER, miseAJour );
     
                // force la diffusion de l'événement Event.RENDER
                stage.invalidate();
            }
    Tu écris : Mais qui est rappel pour la méthode statique ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Si j'en reviens à ma question de départ...
    J'ai un clip principal avec une classe MainClass liée dans ses propriétés et
    un clip fille avec une Classe ClasseMonChoix liée dans ses propriétés.
    j'ai loadé le clip swf fille dans le clip principal
    Je voudrais pouvoir utiliser une fonction dans les 2 cas, sans avoir besoin de la réécrire (ça marche en la réécrivant)

    cette fonction c'est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function myGotoAndStop( pImage:String, pFonction:Function ):void {
     
                // déplacement de la tête de lecture
                gotoAndStop( pImage );
     
                // retourne un objet permettant
                rappel=pFonction;
     
                // écoute de l'événement Event.RENDER
                addEventListener( Event.RENDER, miseAJour );
     
                // force la diffusion de l'événement Event.RENDER
                stage.invalidate();
            }
    elle nécessite une variable : rappel, et une autre fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function miseAJour( pEvt:Event ):void {
    			// nous tentons d'appeler la fonction de rappel 
    			// si cela échoue, nous affichons un message d'erreur  
    			// dans tout les cas, nous supprimons l'écoute de l'événement Event.RENDER
    			try {
    				rappel();
    			} catch (pErreur:Error) {
    				trace( "Erreur : La méthode de rappel n'a pas été définie" );
    			} finally {
    				removeEventListener( Event.RENDER, miseAJour );
    			}
    		}
    Si j'utilise un extends avec une Class Mere (comme vu plus haut) j'ai des bugs... on avait pensé à une fonction statique mais à priori, je n'ai pas très bien compris...

  11. #11
    Membre habitué
    Profil pro
    Développeur multimédia
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Points : 176
    Points
    176
    Par défaut
    La fonction static fonctionne si tu envois l'objet à stopper (le movieClip) et le numéro de frame auquel tu souhaites stopper l'animation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class StaticTest 
    {
     
    	public function StaticTest() 
    	{
     
    	}
     
    	static public function myGotoAndStop(mc:MovieClip, nb:int):MovieClip {
    		mc.gotoAndStop(nb);
    		return mc;
    	}
    }
    Que tu appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tonClip = StaticTest.myGotoAndStop(tonClip, 10);
    et tu exécutes ta fonction de rappel ensuite.
    Mais je n'ai pas bien compris le principe de cette fonction de rappel.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    non je ne crois pas que ça va aller... j'ai vraiment besoin de cette fonction telle quelle est, là tu la change...

    Pour plus d'info sur cette fonction, va voir le chap 11 de T.Imbert dans Cours AS3

    Merci en tout cas de chercher avec moi :-)

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Bon ben ça marche !
    j'ai d'un côté :
    ma classe MainClass extends MovieClip avec mes variables publiques et ma fonction publique myGotoAndStop (elle n'est liée à aucun clip dans les propriétés).

    d'un autre :
    ma classe MenuMere extends MainClass avec tout ce qui a trait à mon clip Mere (ils sont liés dans les propriétés).

    et enfin :
    ma classe Fille extends MainClass avec tout ce qui a trait à mon clip Fille (ils sont liés dans les propriétés).

    ainsi mes 2 clips Mere et Fille ont bien accès dans la classe MainClass à ma fonction myGotoAndStop

    Je ne sais pas pourquoi ça ne marchait pas quand j'ai essayé la première fois... comme quoi, faut persévérer et recommencer parfois du début pour bien comprendre


    MERCI !!!!!

  14. #14
    Membre habitué
    Profil pro
    Développeur multimédia
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Points : 176
    Points
    176
    Par défaut
    Ok, c'est la base de l'héritage. Ca m'étonnais que ça ne fonctionne pas, ou alors j'avais mal compris ton problème.
    Tout est bien qui finit bien :o)

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

Discussions similaires

  1. Problème de communication entre 2 class
    Par sancho.poncho dans le forum Général Python
    Réponses: 6
    Dernier message: 15/05/2013, 21h10
  2. Problème de communication entre classe
    Par FabaCoeur dans le forum Général Java
    Réponses: 4
    Dernier message: 22/01/2008, 13h50
  3. [c#] probléme de communication entre classe
    Par OpenGG dans le forum C#
    Réponses: 1
    Dernier message: 24/09/2006, 21h54
  4. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18
  5. Réponses: 3
    Dernier message: 22/11/2005, 11h12

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