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:
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 lexé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:
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 |
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:
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:
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...