Forums Développement Multimédia

Aller au contenu

Bouton imbriqué dans mc avec class

poo as3 bouton imbriqué

9 réponses à ce sujet

#1 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 09 November 2015 - 14:06 PM

Bonjour,

Je m'initie à la POO en AS3 et rencontre un problème dont je trouve pas la solution sur internet malgré des heures de recherche !


Lorsque mon jeu est fini/gagné, j'envoie un mc Class:Bravo, lequel contient un bouton (j'ai aussi essayé de remplacer le bouton par un mc) qui au click est censé relancer/faire un reset du jeu.


bravo_mc.replay.addEventListener(MouseEvent.CLICK, newGame);
 
       
          function newGame(e:MouseEvent):void
         {
               trace('replay clicked');
         }
 

Mais ça ne fonctionne pas.
Si j'essaie de mettre cette portion de code dans la Class Bravo, avec un "dispatchEvent(new Event('replayClicked'));, j'obtiens le même résultat.......

Et mes nombreuses recherches ne portent pas leurs fruits... pourtant j'en ai parcouru des pages...

Merci d'avance :)

#2 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 09 November 2015 - 15:35 PM

Bon, j'ai contourné mon problème en sortant mon bouton de son MC container > j'ai du créer un timer + addChild(monBoutonPourReplay) dans mon code principal. Mais c'est beaucoup de lignes de code pour pas grand chose. J'ai du mal à comprendre l'intérêt de la POO, que je trouve bien plus longue et complexe à écrire que du procédural...

Si vous savez répondre à ma question dans mon premier post, je prends !!! car j'ai passé des heures à chercher (dans plusieurs langues) sans trouver... Merci ;)
à bientôt :D

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 09 November 2015 - 16:08 PM

Bonjour Contemp

Difficile à dire, quand même. Nous n'avons pas assez d'éléments.

Le code, tel que tu nous le montre fonctionne dans le contexte que tu décris.
Visiblement quand même, quelque chose t'empêche de cliquer sur le bouton quand il est dans le bravo_mc, alors au hasard :
- le mc replay du mc bravo_mc est en mode mouseEnabled = false ?

- le mc bravo_mc est en mode mouseChildren = false ?
- le mc bravo_mc est sous un autre mc invisible qui capte le clic souris ?

Pour le côté POO ou procédral, ce sont plus des façons de penser différentes. Je n'ai jamais codé en procédural (enfin, je ne crois pas) mais j'imagine qu'il ne faut ni plus ni moins de code. La quantité de code, elle se réduit avec l'expérience, quand on adopte une façon de structurer son programme adaptée POO (ou procédural). Là, tu n'es sans doute pas encore à l'aise. Mais si tu persévères, ça ne peut que s'améliorer.

#4 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 09 November 2015 - 17:00 PM

Bonjour dldler,

Merci pour ton message.
Je réponds NON à tes 3 questions, - lol ou alors pas que je sache, et ils le seraient donc par défaut?


mc_bravo capte directement le click, testé et approuvé. Mais mon bouton Replay qui se trouve dans mc_bravo.ne capte rien et me renvoie erreur à l'affichage de mc_bravo.. Tandis que si je l'enlève de mc_bravo : no error. J'ai fait plein plein plein de tests et ...
Bon ... pour l'instant ce n'est pas grave puisque j'ai trouvé une alternative, et qu'il me reste à coder le game Replay...en POO... > jamais fait encore, mais je suppose que ça devrait aller...

Ce que je vais faire, c'est regarder encore plein de tutos, car je suis loin de tout savoir - lol let la poo ça ne fait que 2 ou 3 jours que j'ai commencé- donc il me reste beaucoup à apprendre!

Je te remercie pour tes suggestions dont je prends note,
Je repasserai expliquer pourquoi ça ne fonctionnait pas, si enfin je trouve après avoir appris la correct technique quelque part dans les tutos que j'ai à visionner... et si je ne trouve pas, je re-passerai quand même dans la semaine ou la suivante vous donner plus de fil à retordre :D

Merci encore pour ta réponse,
A bientôt

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 09 November 2015 - 17:25 PM

Hop hop hop ! Nom d'un p'tit bonhomme…

Citation

Mais mon bouton Replay qui se trouve dans mc_bravo.ne capte rien et me renvoie erreur à l'affichage
Enlève 'ne capte rien' et explique nous ce que tu entends par 'me renvoie erreur à l'affichage' ?
Si une erreur est déclenchée à la compilation, ou pendant l'exécution, c'est normal ensuite que rien ne se passe. C'est très différent d'un 'rien n'est déclenché quand je clic'.
Ce qu'il nous faut, c'est plus d'infos sur cette erreur, avec le plus de précision possible et surtout le message d'erreur proprement dit s'il apparait dans la console.

#6 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 09 November 2015 - 18:18 PM

Ok :


function checkIfGameFinished():void
  {
   if ( matched == 1)
          { myTimer.stop();
                myTimer.removeEventListener(TimerEvent.TIMER, CheckIt);
       
                var bravo_mc:bravo = new bravo();
                addChild(bravo_mc);
       
       
         bravo_mc.x= stage.stageWidth*.5;
         bravo_mc.y= stage.stageHeight*.5;
       
        bravo_mc.replayBtn.addEventListener(MouseEvent.CLICK, clickONReplay);      // replayBtn sans class, ou avec c'est pareil
         function clickONReplay(e:MouseEvent):void
         {
                  trace('replay clicked');
         }
       
                         
          }
       
  }
 


TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at MethodInfo-45()
at cardClass/CheckIt()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.utils::Timer/tick()


J'ai fait plein de tests différents, sans succès. Peut-être que l'erreur grossière te saute aux yeux ? :) Cool!

Sinon le code ci-dessous does the job :


  // ( Ce nouveau Timer sert à faire apparatre mon bouton Replay au bout de 5secondes.)
        var timerForButton:Timer=new Timer(1000,5);  
         timerForButton.addEventListener(TimerEvent.TIMER_COMPLETE, placeReplayButton);
         timerForButton.start();
       
         
         function placeReplayButton(e:TimerEvent):void
         {
           addChild(replay_mc);
           replay_mc.x=stage.stageWidth*.5;
           replay_mc.y= 1100;
           replay_mc.buttonMode=true;
                         replay_mc.addEventListener(MouseEvent.CLICK, newGame);
         }
 


#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 10 November 2015 - 09:37 AM

Hello.

Un peu surpris par ce code par rapport au message. Les noms de fonction ne correspondent pas… ?
En tous cas, erreur 1009, la plus part du temps c'est que tu tentes d'atteindre une propriété d'une variable qui n'existe pas, et ça, c'est toujours le compilateur qui a raison.
Je m'explique un peu :
Si tu as une variable toto, non définie, et que tu tentes d'utilisée la variable toto, tu auras un message dont je ne me rappelles pas le numéro mais qui dira en gros 'variable non définie'.
Par contre, si tu tentes d'atteindre une propriété de la variable toto, par exemple toto.truc, alors que toto n'est pas définie, tu auras une erreur 1009. Subtile différence.
Normalement, l'erreur devrait te dire dans quelle fonction ça se passe, mais là, tu as 2 trucs bizarres qui ne permettent pas de faire le lien entre le message d'erreur et le code :
- le nom de la fonction dans le code est : checkIfGameFinished, dans le message d'erreur : checkIt… ?
- et MethodInfo-45() qui ressemble à une méthode anonyme (généralement, une fonction que l'on crée à la volée, dans une autre fonction, une assez mauvaise pratique…

Si tu es sûr que c'est bien ce code qui plante, voilà une méthode de débuggage laborieuse mais qui devrait te permettre de cibler l'erreur plus précisément. Rajoute une ligne : trace('Jusqu'ici tout va bien !') au début de la fonction. Lance l'appli, vérifie que tu as le trace avant l'erreur.
Ensuite, descend peu à peu la ligne du trace et lance ton aplli, jusqu'à ce que tu ne vois plus le trace. Tu viens de trouver la ligne qui bug, elle est juste avant le trace. Dans cette ligne, regarde les variables utilisées et tentes de les tracer, même si tu es sûr de toi. Tu finiras par trouver quelle variable n'est pas renseignée et là, tu pourras commencer à réfléchir au pourquoi.


Mais…
… j'ai quand même un avis.
La fonction anonyme, pourrait bien être la fonction clickONReplay, puis qu'elle est écrite à l'intérieur de la fonction checkIfGameFinished, tu devrais la sortir de la fonction

Et enfin, sans doute que tu l'as mise là parce que sinon tu n'arrivais pas à atteindre la variable bravo_mc… (?) et là, c'est la même raison : comme tu déclares cette variable à l'intérieur de la fonction, elle n'a une portée que dans le code de la fonction. Même solution : sort la déclaration de la variable de la fonction.

En gros :
var bravo_mc:bravo;

function checkIfGameFinished() : {
  // bla bla
  bravo_mc = new bravo();
  // bla bla
}

function clickONReplay(e:Event):void {
  trace('Et là, ça fait quoi ?');
}

Si des fois j'avais vu juste, prends le temps de comprendre ce que fais ce code et renseigne toi sur la portée des variables et des fonctions.

#8 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 10 November 2015 - 17:53 PM

Hi !!

Merci beaucoup pour avoir pris le temps de me répondre. Ca fait très plaisir :)
J'ai retesté avec une var globale:Bravo. J'ai bien compris la différence en var locale et var globale. Et effectivement j'ai fait différents tests avec ma func sortie, mais.....

Tout fonctionne correctement sauf lorsque j'appelle un enfant de bravo. C'est là que ça foire. I mean, j'ai effectué des centaines de tests encore aujourd'hui, sur 2 jeux différents, donc en plusieurs temps = sur plusieurs heures et à chaque fois, c'est foireux.

Comme je te l'ai dit, mc_bravo (= l'écran de bravo, t'as gagné !) répond sans erreur à son écouteur de click.



mc_bravo.addEventListener(MouseEvent.CLICK, clickONReplay);
function
clickONReplay(e:MouseEvent):void {
trace('Et là, ça fait quoi ?'); /// ok !
}

mc_bravo.resetBtn.addEventListener(MouseEvent.CLICK, wtf);
function
wtf (e:MouseEvent):void {
trace('Et là, ça fait quoi ?'); /// trace nada, trace error ci-dessous, déjà mentionnée
}



at cardClass/CheckIt()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.utils::Timer/tick()
pourtant j'arrête le timer, mais peu importe puisque mc_bravo ne renvoie aucune erreur ou avertissement lorsqu'il est cliqué.

Dans mon 2* jeu, dans lequel j'avais implementé un mc_bravo contenant un bouton, pareil, ça ne fonctionne pas alors qu'il n'y a pas de timer. En revanche il me retourne
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul. dès que je click sur mc_bravo,. Or si je supprime le bouton contenu dans mc_bravo, no error.......

J'ai bien tout sorti, ai vérifié que mc_bravo est déclaré en global -je saisis la différence-, mais ...... ça me casse la tête !!!

------------
mc_bravo contient un stop(); en fin de clip.
son fils, resetBtn n'a pas de class.
--------
Dans mon 2e jeu,

mc_bravo est sur 3 niveaux : mc_bravo, avec comme enfant "components", et comme petit-fils "resetBtn"...
------



Peut-être que je devrais laisser ça de côté pour le moment, car en fait je n'étais pas experte en AS3 procédural non plus, hein lol, peut-être que j'ai laissé entendre le contraire, mais ce n'est pas le cas, même si je commençais à "bien gérer". Et peut-être devrais-je approfondir mes connaissances avec de new tutos qui m'éclaireraient sûrement pour la suite et aussi au sujet du cas présent.

En tous cas je te remercie pour ton support, qui est apprécié.
Je vais faire une pause, parce que là...
Thank u anyway


#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7010 messages

Posté 12 November 2015 - 11:41 AM

Salut,

La meilleure option pour t'aider serait que tu nous crée rapidement un petit exemple (isolé de tes jeux) et que tu nous donne le code complet (as) et la structure si besoin (fla).

Je penche pour un problème de construction, surtout lorsque je lis :

Citation

mc_bravo contient un stop(); en fin de clip.

Si ton clip "mc_bravo" a une timeline, il est fort probable que ce soit là la source de ton erreur.

#10 Contemp

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 15 November 2015 - 16:56 PM

Salut Monsieur Spi,
23? :D

Merci de t'intéresser à mon cas.
Je vais regarder ça, dès que j'irai mieux, car je suis malade depuis plusieurs jours, avec huge soucis de concentration, j'ai vraiment du mal à bosser/dessiner, faire des trucs de base, impressionnant !.donc coder ou réfléchir, lol, no way, impossible ! Demain, chez le docteur !

Ah mais malgré mon état, en te lisant je viens de ticker sur le fait que ma timeline principale has no keyframe, alors que mon mc contenant le bouton a une durée de 1000 ou qqch comme ça. Ah c'est ça qui fait planter le programme? Hum, bon quoiqu'il en soit, faut que je fasse +++ de tutos, et que je me soigne.

A + quand j'irai mieux, très vite j'espère..



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP