onEnterFrame

Le gestionnaire d'événement OnClipEvent, malgré tous les bienfaits qu'il a apportés aux flasheurs, présente 2 défauts, au moins :

Macromedia a donc introduit avec Flash MX un nouveau modèle événementiel,

Toute la programmation des nouveaux gestionnaires se fait dans une image clé du scénario ou dans un fichier externe (d'extension .as) qui est importé dans une image par l'instruction #include.
dans lequel les gestionnaires d'événements sont des propriétés des objets. Le tableau ci-dessous compare partiellement les deux modèles.

Les deux modèles événementiels
Flash 5 Flash MX
onClipEvent(enterFrame) movieClip.onEnterFrame
onClipEvent(mouseUp) movieClip.onMouseUp
onClipEvent(mouseDown) movieClip.onMouseDown
  Sound.onLoad
  Sound.onSoundComplete
  Liste non exhaustive

Pour utiliser les nouveaux gestionnaires d'événements, il faut leur affecter une fonction de rappel selon la syntaxe ci-dessous :

<nom d'occurrence>.<nom de gestionnaire> = <nom de fonction>

ou bien

<nom d'occurrence>.<nom de gestionnaire> = function() {

instructions ....

}

Toutes les instructions situées dans le corps d'une fonction de rappel s'exécutent par référence à l'occurrence appelante. L'usage de de la référence this est donc presque toujours indispensable.

Pour désactiver un gestionnaire d'événement, on utilise la commande delete

delete <nom du gestionnaire>

 

L'animation ci-dessous fait usage de ces techniques

Joe est programmé pour se rendre vers la souris dès qu'il entend un clic. Le gestionnaire d'événement s'écrit donc

joe_mc.onMouseDown = function () {

xDestination = _xmouse ;
yDestination = _ymouse ;


}

On pourrait programmer le déplacement comme ceci

joe_mc._x = _xDestination ;
joe_mc._y = _yDestination ;

Dans ce cas, le déplacement serait instantané, sans illusion de mouvement. Il existe de nombreuses techniques de déplacement, avec effets de frottement, élasticité, etc. Joe utilise ici une technique simple : il se déplace d'une fraction de la distance qui le sépare de la destination.

this._x -= (this._x - xDestination) * .2 ;
this._y -= (this._y - yDestination) * .2 ;

Ces instructions doivent être placées dans un gestionnaire onEnterFrame qui les exécutera à la cadence de l'animation

 

joe_mc.onMouseDown = function() {
xDestination = _xmouse ;
yDestination = _ymouse ;
this.onEnterFrame = function() {
this._x -= (this._x - xDestination) * .2 ;
this._y -= (this._y - yDestination) * .2 ;
if (Math.abs(this._x - xDestination) < 1){
delete this.onEnterFrame ;

}
}

}

Pour arrêter Joe, il suffit de détruire le gestionnaire onEnterFrame.

delete this.onEnterFrame ;

Joe s'arrête lorsqu'il est à moins de 1 pixel d'écart (sur l'axe des x) de la destination. Il vaut mieux tester l'écart entre les deux positions que leur égalité, car il se

Toute la programmation des nouveaux gestionnaires se fait dans une image clé du scénario ou dans une fichier externe (d'extension .as) qui est importé dans une image par l'instruction #include.
pourrait bien qu'elles ne soient jamais égales. Il faut également tester la valeur absolue (méthode Math.abs()) de la distance, car on ne sait pas si Joe se trouve à droite ou à gauche de la souris.

 

 

 

****