- Fil d'ariane : Accueil du devBlog
- / Détail du billet (Lien direct)
Classe, setInterval et fonction de callback
En développant une classe en AS2, je suis tombé sur un os lorsque j'ai voulu utiliser la fonction setInterval avec comme fonction de callback une méthode de cette classe. En cherchant un peu, voici comment j'ai solutionné le problème.
Comme ça, ça ne marche pas
Voici une classe simplifiée afin d'illustrer la fonctionnalité recherchée. Dans cet exemple, nous désirons faire afficher toute les secondes un trace de la valeur de i.
class Test {
public var i:Number;
function Test() {
this.i = 0;
var j:Number = setInterval(this.affiche_i, 1000);
}
public function affiche_i() {
trace(this.i++);
}
}
Instanciation de l'objet:
var toto:Test = new Test();
Le résultat n'est pas celui escompté puisque toutes les secondes le débuggeur vas nous afficher "undefined"
. Nous allons donc procéder autrement pour atteindre notre objectif.
Solution 1: Le passage par référence
La première solution consiste à utiliser la possibilité de passer un argument à la fonction de callback. Dans notre cas, cela va être la référence à l'objet courant.
class Test {
public var i:Number;
function Test() {
this.i = 0;
var j:Number = setInterval(this.affiche_i, 1000, this);
}
public function affiche_i(reference:Test) {
trace(reference.i++);
}
}
Il existe une autre solution qui consiste à faire de i une propriété de classe.
Solution 2: La propriété de classe
Nous allons donc utiliser le mot clé static afin de re-qualifier la propriété.
class Test {
static public var i:Number;
function Test() {
Test.i = 0;
var j:Number = setInterval(this.affiche_i, 1000);
}
public function affiche_i() {
trace(Test.i++);
}
}
Pour rappel, une propriété de classe est accessible en utilisant comme préfixe le nom de la classe et un point, suivi du nom de la propriété.
Quelle solution choisir?
La solution que vous choisirez dépend du contexte d'utilisation et de la manière dont vous allez coder votre application.
Dans le cadre d'un jeu de tir par exemple(shoot'em up). Vous pouvez être amené à gérer les vaisseaux ennemis via une classe spécifique. Ces vaisseaux ont un comportement qui leur est propre et vous les faites tirer toutes les n secondes. Une gestion de tir cadencé doit donc être commandé via un setInterval et dans cette situation c'est la première solution qui serait alors envisagée.
Par contre, si vous faire un diaporama, il peut être judiscieux d'adopter la seconde solution si vous implémantez un défilement automatique. Vous pourriez ainsi utiliser le compteur ainsi que le tableau contenant les images comme des propriétés de classes
Commentaires
[#3] Commentaire rédigé le Lundi 21 Mars 2005 à 15:58 par LAlex
setInterval(this, "affiche_i", 1000);
++
L'ajout de commentaire a été désactivé pour ce billet.
Trackbacks
Pisteurs vers ce billet (trackbacks entrant)
Il n'y a pas encore de pisteurs pour ce billet.
Pistés par ce billet (trackbacks sortant)
Il n'y a pas encore de pisteurs effectué par ce billet.


[#1] Commentaire rédigé le Lundi 21 Mars 2005 à 13:42 par Aggelos