Flash AS3 - Événements personnalisés

De EduTech Wiki
Aller à la navigation Aller à la recherche

Cet article est une ébauche à compléter. Une ébauche est une entrée ayant un contenu (très) maigre et qui a donc besoin d'un auteur.

Réalisation simplissime

La façon la plus simple de procéder est d'utiliser une chaîne de caractères coder directement dans les fichiers

import flash.events.Event;

//event listener, à attacher à un objet, mais cet objet peut être "stage" ou "MovieClip(root)"
addEventListener("OK", eventHandler);

function eventHandler(e:Event):void {
  trace(e.type);
}
  
// Il suffit d'ajouter ce code là où on veut déclencher un événement :
dispatchEvent(new Event("OK", true, true));

On peut compliquer (un peu)les choses en définissant le type de l'événement (ici "OK") dans une constante (pour ne pas avoir a se souvenir à chaque fois quelle chaîne de caractère on avait utilisée.

import flash.events.Event;

const MY_EVENT = "OK";

addEventListener(MY_EVENT, eventHandler);

function eventHandler(e:Event):void {
  trace(e.type);
}
  
// Il suffit d'ajouter ce code là où on veut déclencher un événement :
dispatchEvent(new Event(MY_EVENT, true, true));

Dans les deux cas, il renvoi OK.

Réalisation un peu plus complexe

On se basera sur la connaissance de la création de classes présenté dans Flash AS3 - Programmer avec une classe.

Il s'agit ici de définir une classe "MyEvent" au dessus de la classe d'événement de base :

package {
  import flash.events.Event;
	
  public class MyEvent extends Event {
    public static const FALSE_EV:String ="événement false in MyEvent class";
    public static const CORRECT_EV:String = "événement correct in MyEvent class";

    // class constructor
    public function MyEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false){
      super(type, bubbles, cancelable);
    }

    // Créer une méthode clone() pour le cas où on voudrait redispatcher l'événement,
    // ca fonctionne sans, mais il semble que cela soit important 
    // pour le "bubbling" de l'événement.
    
    public override function clone():Event{
      return new MyEvent(type, bubbles, cancelable);
    }
  }
}

Ensuite, il vous suffit d'importer la classe MyEvent et de modifier un peu le code précédant

import MyEvent;
import flash.events.Event;

addEventListener(MyEvent.CORRECT_EV, eventHandler);
addEventListener(MyEvent.FALSE_EV, eventHandler);

function eventHandler(e:Event):void {
  trace(e.type);
}

dispatchEvent(new Event(MyEvent.CORRECT_EV, true, true));
dispatchEvent(new Event(MyEvent.FALSE_EV, true, true));

Exemples

Pour cet exemple, le but est que quand on clique sur un des quatre cercles, le score augmente de 1 et le rectangle se déplace.

Pour faire cela sans événement il nous faudrait, soit mettre tout le code dans la Timeline principale (ce qui impose de copier le code sur chaque frame où on veut utiliser ce mécanisme), soit insérer dans le symbole cercle du code qui concerne le rectangle et le score (ce qui va compliquer si on veut d'un coup changer le rectangle en losange par exemple).

Avec des événements, chaque symbole se comporte un peu comme une boîte noire :

  • quand on clique sur le cercle, il nous renvoie un événement "Click sur le cercle" ;
  • pour ajouter 1 au score, on lui envoie l'événement "Score modifié" ;
  • quand le rectangle reçoit l'information "Score modifié", il change de place.

Tout ça se passe tout seul, sans intervention extérieur, la seule chose qu'il faut faire, c'est coordonner les événements par la Timeline principale.


Version simple avec code dans la Timeline

Code du symbole Circ :

/* ce symbole envoie un événement
* CIRC_CLICK quand on clique dessus
*/

const CIRC_CLICK = "Click sur le cercle";
addEventListener(MouseEvent.CLICK, startBubble);

function startBubble(e:Event){	
	var bubbles = true;
	var cancelable = false;
	dispatchEvent(new Event(CIRC_CLICK, bubbles, cancelable));
}

Code du symbole Score :

/* ce symbole réagit à l'événement
* MOD_SCORE quand le score est modifié
*/

var score:int = new int();
const MOD_SCORE = "Score modifié";
addEventListener(MOD_SCORE, addScore)

function addScore(e:Event){				
	score = score+1;
	score_txt.text = "Clicks : "+String(score);
}

Code du symbole Rect :

/* ce symbole réagit à l'événement
* MOD_SCORE qui bubble depuis le
* symbole score
*/

var oriPos:Number = x;
addEventListener(score.MOD_SCORE, changePos);

function changePos(e:Event) {	
	if(x == oriPos) {
	  x = x-50;
	} else {
	  x = oriPos;
	}
}

Code de la Timeline principale (qui coordonne les événements de Circ et Score) :

import flash.events.Event;

addEventListener(circ1.CIRC_CLICK, addScore);
addEventListener(rect.score.MOD_SCORE, appendConsole);
		
function addScore(e:Event){	
	var bubbles = true;
	var cancelable = false;
	rect.score.dispatchEvent(new Event(rect.score.MOD_SCORE, bubbles, cancelable));
}

Version avec des classes

Pour plus d'informations sur les classes, voir la page Flash AS3 - Programmer avec une classe.

Références