Forums Développement Multimédia

Aller au contenu

comment simplifier

CODE

19 réponses à ce sujet

#1 slidespleen

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 30 November 2014 - 22:45 PM

bonjour et merci de me lire.
je revient vers vous afin de vous exposer mon probleme qui je pense n'en est pas un gros!
je vous explique j'ai 30 boutons sur mon flash chaque boutons a une action similaire mais avec une variable diferentes! j'ai donc commencer mon script as3 sans soucis mais je commence maintenant les ecouteurs d'evenement avec un mouse_over et un click pour chaque boutons!! le probleme c'est que je le fais en manuel et c'est bien trop long je pense qu'il y a une astuce mais je ne la trouve pas j'ai essayer un peu tout!! voici en gros comment je procede:

btn_01.addEventListener(MouseEvent.MOUSE_OVER, tagover);
btn_01.addEventListener(MouseEvent.CLICK, tagclik);
btn_02.addEventListener(MouseEvent.MOUSE_OVER, sprayover);
btn_02.addEventListener(MouseEvent.CLICK, sprayclick);
etc...

function tagover (event:Event):void
{
trace("tagover");
}
function tagclik (event:Event):void
{
trace("tagclik");
}
etc.........

voila enfaite une fonction mouse over et une fonction click devrait me suffire au lieu de 30 si je pouvais connaitre quel bouton a etait cliquer!!j'ai voulu les mettre dans un array mais sans succes!!
merci de m'avoir lu!
cordialement

#2 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 01 December 2014 - 03:00 AM

Bonjour,

Tu peux cibler la même fonction over et click avec tout tes boutons. Au sein de ta fonction tu recupere l'Event
Cet event te permet d'acceder a une propriété : event.target , le target en l'occurence, c'est le bouton qui a dispatché l'event.
Tu peux donc savoir quel bouton a été cliqué, et faire une action differente selon le bouton comme ceci :


function tagover (event:MouseEvent):void
{
        switch (event.target)
        {
                case btn_01:
                // faire quelquechose
                break;
                case btn_02:
                //faire autre chose
                break;
        }
}
 

Tu pourrais même cibler la meme fonction pour le click et le mouse over, en faisant le même systeme de switch mais cette fois ci sur l'event.type, qui te dira quel a été le type de MouseEvent qui a été dispatché.

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 01 December 2014 - 09:10 AM

Je dirais même que tu ne devrais avoir qu'un écouteur.
Pour cela, tu peux utiliser un sprite, afficher tous tes boutons dans ce sprite, et poser une seule fois les écouteurs MOUSE_OVER et CLICK sur le sprite.

#4 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 237 messages

Posté 01 December 2014 - 11:38 AM

Yo !

je participe mais je suis un mauvais. Hi hi hi...
C'est juste pour essayer.

var nom_Fonction: Array = new Array();

nom_Fonction = [0, "tagover", "tagclik", "sprayover", "sprayclick"];

for (var i: int = 1; i < 3; i++) {

this["btn_" + i].addEventListener(MouseEvent.MOUSE_OVER, this[nom_Fonction[i]])
this["btn_" + i].addEventListener(MouseEvent.CLICK, this[nom_Fonction[i + 1]])

}

Ca ça marche. Mais.... Peut-on déclarer un fonction par un nom à la volée ?
genre :

function[nom_Fonction[i]](event: Event): void {
trace(this[nom_Fonction[i]]);
}

Parceque ça. Bah ça marche pas !

PS. Question subsidiaire : comment fait-on pour afficher du code dans le forum ? Merci !

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 01 December 2014 - 12:07 PM

On peut, oui. Mais ça n'a pas vraiment d'intérêt :
- numéroter des noms de boutons et de fonctions, c'est lent, c'est risque d'en oublier, ça donne du code illisible et très long, en vrai.
- la logique de telles pratiques reste accroché à l'objet lui-même et empêche de penser de façon conceptuelle et structurée, beaucoup plus efficace.

Un exemple avec ce code et le fichier en pièce jointe :
boutons.addEventListener(MouseEvent.CLICK,clic_bouton);
function clic_bouton(event:MouseEvent):void {
  trace("Vous avez cliqué sur le bouton "+ event.target.couleur());
}
Ce code pose un seul écouteur sur le sprite qui contient les boutons. La fonction associée à l'écouteur lance la fonction couleur() écrite dans chacun des boutons (ça pourrait se faire avec une simple variable dans ce cas, mais si j'ai bien compris les actions devraient être différentes pour chaque bouton, donc plutôt une fonction.)


PS : pour placer du code avec la coloration automatique dans un message, il faut utiliser le bouton en forme de < >

Fichier(s) joint(s)



#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 01 December 2014 - 12:20 PM

NB @ archiroc :
quand je parle de ne pas s'accrocher aux noms des objets, je parle par exemple de cette ligne dans ton code :
nom_Fonction = [0, "tagover", "tagclik", "sprayover", "sprayclick"];

Pourquoi donc veut tu stocker les noms de tes fonctions ?
Stocke directement les fonctions, ce sera moins couteux en mémoire et beaucoup plus rapide…
les_fonctions = [tagover,tagclik,sprayover,sprayclick];


Et puis tu devrais faire l'effort d'apprendre à compter à partir de zéro, plutôt que de commencer tes tableaux à l'indice 1. Ça parait perturbant, je sais, mais ça devient vite transparent quand on fait l'effort.

Peut-être qu'une première approche, si l'abstraction te semble trop "abstraite", ça serait de mieux gérer le stockage de tes données.
Par exemple, tu veux associer une fonction au clic et une fonction au survol à chacun des boutons. Alors, stocke-les ensemble, dans un tableau de tableaux.

quelque chose comme :

var datas:Array = {
  {btn_tag,tag_over,tag_click},
  {btn_spray,spay_over,spray_click},
  {btn_spray,spay_over,spray_click},
  {btn_wall,wall_over,wall_click},
  {btn_town,town_over,town_click}
}
for each(var data:Array in datas) {
  data[0].addEventListener(MouseEvent.MOUSE_OVER,data[1]);
  data[0].addEventListener(MouseEvent.CLICK,data[2)];
}


#7 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 01 December 2014 - 15:37 PM

Tiens c'est une bonne idee ca de ne mettre l'ecouteur que sur le sprite parent des boutons, je n'y avais jamais pense. Mais cela a une limite il me semble, imaginons que ces boutons soient disposes aux quatres coins de l'ecran, alors il y aura un gros sprite qui empechera toute interaction avec des elements cliquables au centre de l'ecran mais qui ne seraient pas sur le meme parent, non ? (en tout cas si le ce sprite est en dessous de celui des boutons)

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 01 December 2014 - 16:52 PM

Non, non. Le sprite laisse passer les clics dans les zones ou il n'a pas d'enfant ni de dessins sur sa couche graphics. Il n'y a pas de souci de ce point de vu. Par contre, ça peut peut être jouer sur la zone que Flash redessine à chaque frame quand il y a eu une modification dans le fond. Il faudrait vérifier. Mais ce n'est même pas sûr. Le découpage des zones de rafraichissement est assez puissant quand même…

Disons en résumé qu'utiliser un sprite conteneur pour les palettes de boutons (d'effets et de styles aussi) simplifie beaucoup le code. C'est son premier gros avantage.
Le second, c'est également la souplesse et c'est très lié. Si tu souhaites par exemples insensibiliser toute l'interface le temps d'une animation, tu peux passer le sprite à mouseChildren=false; et lui appliquer un alpha à 50%. Pas besoin de connaître tous les boutons affichés ni de les traiter un par un.

#9 slidespleen

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 02 December 2014 - 19:54 PM

bonjour! et merci a vous d'avoir participé a ce post!! j'avoue je nage je suis pas tres bon en as3!!!je bataille tout les jours pour avancer sur mes petits script!! je vais essayer ce soir vos astuces et conseils mais j'ai peur de pas tout avoir assimilé!! si j'ai bien compris je dois creer un sprite an as3 lui mettre des addchild btn_01 etc... avec les coordonnees x et y etc pour chaque boutons!!?? si j'ai bien compris!! mais moi mon souci c'est que c'est une image que j'ai decoupe en plusieurs morceau sur photoshop ou illustrator , et que j'ai importer dans flash! donc ca ma creer uyn dossier comportant tout mes boutons en bitmap si je me trompe pas et tous sont exactement a la bonne place! maintenant ces image bitmap j'en ai fais des boutons un par un!. maintenant dans mon action je ne sais pas comment leur affecter un ecouteur d'evenement a tous en automatique au lieu de tout faire a la main!! donc je ne sais pas si vos solution sont toujours les memes avec ses infos plus detaillees si c'est le cas, je devrais (j espere) m'en sortir dans la soiree!
merci a tous vous etes sympa d'aider les gens.

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 02 December 2014 - 21:55 PM

Bonsoir sliderspleen Ne panique pas... Je parle de sprite, de façon générique mais ça ne te parles peut être pas. Dans flash, il te suffit de sélectionner tous tes boutons, et de faire f8 (transformer en clip ou quelque chose comme ça). Ça va créer un movieclip, qui est une évolution cousine de sprite. Dans la palette propriétés, tu lui donnes un nom, et c'est tout. Tu peux ensuite poser l' écouteur sur ce dernier, comme sur un sprite.

#11 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 237 messages

Posté 03 December 2014 - 11:20 AM

Bonjour dlder , chais pas comment ça se prononce :cry:

2 ptites choses pour m'aider à avancer :

- Le sprite, c'est bien un movie clip avec une seule frame ?

- La fonction assignée aux boutons marche nickel.
Mais, si je souhaite assigner d'autres valeurs et non juste un retour, il va bien falloir que j'utilise " parent. " & Co ?

MERCI !

#12 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 03 December 2014 - 12:26 PM

1)
Dldler == didier

2)
Oui (presque). Le Sprite est un objet d'affichage sans scénario que l'on ne peut utiliser que via le code. Il a l'avantage d'être moins gourmand que le MovieClip mais ils n'en possède pas tous les avantages en contrepartie. Pour le sujet qui nous intéresse ici, il fonctionne exactement pareil.

3)
Je ne comprends pas ta question, sur cette partie : "assigner d'autres valeurs et non juste un retour", tu peux être plus précis ? A ma connaissance, il n'y a pas de structure de code efficace qui ai besoin de faire un appel à .parent, je le déconseille même sur de gros projets pour des raisons de fuite mémoire. Je m'en passe très bien, mais d'autres non… Mais bon, je suis de l'ancienne école, par principe je n'aime pas que mes enfants viennent faire mes poches…

#13 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 237 messages

Posté 08 December 2014 - 16:31 PM

Salut Dldler;

Je commence un rigolo tuto.
Ca tombe bien :

Sur ma première page pleins d’icônes. ( comme les carrés de couleurs )
Mais en cliquant sur le noir je voudrais que mon animation passe en frame 2.
Forcément ça marche pas : la fonction est dans un bouton compris dans un sprite.
donc je change

<
function couleur():int {
return (2);
}

puis :

<>

gotoAndPlay (event.target.couleur());

Mais : si je souhaite aller en frame 2 mais également assigner au bouton d'autres fonction. Genre Page_menu = 3 ; des variables que j'utilise sur la timeline.

Bah alors je fais comment ?

Peut-être me faut-il juste comprendre que sans poo & co, je dois continuer à papillonner, ce qui n'a rien d'honteux mais en effet rend mon code moins lisible...

Non ?

PS. les < et > et compagnie c'est pour voir si ça fait joli du code sur fond gris ! Je vais voir dans l'instant !

#14 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 237 messages

Posté 08 December 2014 - 16:32 PM

PS2 . les < et > et compagnie ça marche pas... Pffff... essai
<
function couleur():int {
return (2);
}
>
Ca marche ! ... Enfin, le truc en couleur...

#15 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 09 December 2014 - 09:19 AM

Je crois qu'il faut juste que tu comprennes à quel endroit ton code doit être placé.
Par exemple, si tu veux naviguer sur le scénario principal, ton code doit se trouver sur le scénario principal. Faut pas chercher plus compliqué.
Si tes boutons déclenchent une action de navigation + modification de parametres (si j'ai bien compris),
tu peux te servir de des paramètres de la fonction de retour pour passer tous ces paramètres.

Par exemple, dans le bouton noir :

function couleur():Array {
  return ["label_noir",3];
}


Et dans ta fonction associée à l'écouteur :

function click(event:MouseEvent):void {
  var bouton:MovieClip = event.target as MovieClip;
  var paramètres:Array=bouton.couleur();
  Page_menu=paramètres[1];
  gotoAndStop(paramètres[0]);
}


Sinon, tu peux agir un peu différemment, pour éviter avoir du code partout dans tes boutons.
Pour cela, il faut que tes boutons soit construits avec des MovieClip, comme ça ils sont dits "dynamiques" et tu peux alors leur ajouter des propriétés à la volée, ce qui est pratique dans ton cas car la fonction couleur ne te sert à rien si tu n'as pas à agir sur le bouton lui même.


Exemple pour la même structure :

// code du scénario principal :
boutons.noir.label="label_noir";
boutons.noir.Page_menu=3;

boutons.bleu.label="label_bleu";
boutons.bleu.Page_menu=2;

boutons.addEventListener(MouseEvent.CLICK,click_boutons);

function click_boutons(event:MouseEvent):void
{
  var bouton:MovieClip = event.target as MovieClip;
  Page_menu=bouton.Page_menu;
  gotoAndStop(bouton.label);
}

(code non testé)

#16 slidespleen

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 14 December 2014 - 22:29 PM

bonjour tout le monde!! desole pour le temps de reaction, j'ai essayer ta soluce didier et je suis retomber sur une seche donc j'ai essaye plein de chose ce qui ma pris un peu de temps!! alors voila j'ai donc groupe tout mes boutons dans un movie clip sans soucis, jai ensuite mi un ecouteur d'evenement sur celui ci ce qui donne:
mc_btn.addEventListener(MouseEvent.CLICK, clique);

ce qui ouvre ma fonction clique soit :

function clique (event:MouseEvent):void
{
var nam = event.currentTarget.name as SimpleButton
trace (nam);
}

j'ai essaye plein d'autre astuces mais celle la se rapproche de ce que je veux! enfaite je souhaite recuperer l'occurence du bouton cliquer et non celui du movie clip!! et je ni arrive pas soit j'ai l'objet soit j'ai "indefini" soit "null"!! comment feriez vous? voila mon petit souci!!
merci de m'avoir lu en esperant que vous ayez compris ce que j'ai ecrit.

#17 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 237 messages

Posté 15 December 2014 - 09:29 AM

Coucou.
Moi aussi je sèche. Tout le temps. Bouh...
Mais là ça marche :


mc_btn.addEventListener(MouseEvent.CLICK, clique);

function clique (event:MouseEvent):void
{
var nam = event.target.name;
trace (nam);
}
 

Enfin je crois...
C'est le truc à Didier...
Je pense qu'il y a confusion entre Target et currentTarget...

Enfin bon... J'suis débutant alors...

#18 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 15 December 2014 - 09:45 AM

Bonjour slidespleen…

… cette ligne est un peu étrange :
var nam = event.currentTarget.name as SimpleButton


1 - tu ne types pas ta variable nam, donc je ne sais pas trop ce qu'elle récupère, vu que :
2 - event.currentTarget.name est un String…
3 - que tu tentes de caster en SimpleButton(?)…

Alors, à part ça, tu devrais tenter :
import fl.controls.Button;

mc_btn.addEventListener (MouseEvent.CLICK, clique);

function clique (event:Event):void
{
var nam:String = event.currentTarget.name;
trace ("La variable nam contient le nom du movieClipConteneur : " + nam);// (1)

var nam_bouton:String = event.target.name;
trace ("La variable nam_bouton contient le nom du boutonCliqué : " + nam_bouton);// (2)

// Mais le plus simple, c'est :
var bout:Button = event.target as Button;
trace ("La variable bout permet de cibler directement le bouton cliqué : "+bout);//(3)
// et maintenant, si tu as besoin du nom du bouton cliqué, tu peut l'obtenir, autant que d'autres infos :
trace ("Le nom du bouton cliqué est : "+bout.name);

}

(1) La propriété currentTarget permet de récupérer l'objet sur lequel est posé l'écouteur. Ce n'est pas celui qui t'intéresse
(2) La propriété target, est bien le bouton qui t'intéresse, mais à mon avis, récupérer seulement son nom n'a pas d'intérêt.
(3) En capturant le bouton cliqué dans une variable du bon type (4), tu captes juste l'info qu'il te faut et tu peux ensuite lui demander toutes les infos dont tu as besoin, le masquer, le déplacer l'insensibiliser… C'est ça la bonne pratique.

(4) Ceci pourrait expliquer que tu es des "null" dans certains cas : es-tu sûr que tes boutons sont de types SimpleButton ?
Ce sont peut être juste des Button (venus de la palette des composants ? Dans ce cas, ce qui te manque c'est peut-être l'import de la classe Button, que tu obtiendras avec
import fl.controls.Button;
Regarde dans l'exemple joint.

Dans tous les cas, il te faut le bon type pour la variable, et le bon type pour le "as".
Dans le doute et temporairement c'est mieux, tu peux essayer de ne rien typer et de tracer ton objet avec un
trace(event.target);
Ça devrait te renseigner sur le type de ton bouton.

Après, si tes boutons sont de type MovieClip, ça peut encore être un autre souci, mais je préfère ne pas te donner trop de pistes d'un coup. Regarde déjà celle là.

Fichier(s) joint(s)

  • Fichier joint  test.fla   916 Ko   3 téléchargement(s)


#19 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 15 December 2014 - 09:50 AM

Voir le messagearchiroc, le 15 December 2014 - 09:29 AM, dit :

Enfin bon... J'suis débutant alors...

;-) Débutant mais sur la bonne voie. Le diagnostic est bon en ce qui concerne target et currentTarget. Après, ce qui a perdu slideSpleen, c'est sans doute que son cast ne lui renvoie que null. Et là, il faut avoir l'expérience, où le bon réflexe. Et le bon réflexe c'est de tracer l'objet pour obtenir l'info sur son type.

#20 slidespleen

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 17 February 2015 - 19:06 PM

merci les gars vous m'avez bien debloque!!!!! mais j'ai une autre question pour vous!!!
j'ai un dessin en forme de chien celui ci est cliquable mais le probleme c'est que la zone de clique et rectangulaire et non le contour de l'image et donc ca deborde sur un autre bouton y'a t il un systeme pour enlever ce rectangle et prendre que le contour!? merci a vous



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