Aller au contenu
Télécharger Firefox 2

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


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

Ouip, ce sont deux solutions parmis d'autres. Une autre consisterait a passer i comme parametre

[#2] Commentaire rédigé le Lundi 21 Mars 2005 à 13:46 par solo

Oui Aggelos, j'ai volontairement réduit l'exemple à l'affichage d'une variable. Mais dans la pratique, c'est un ensemble de propriétés que j'avais à gérer (puis également d'actions en chaines).

Si tu as d'autres solutions à me proposer je suis preneur :)

[#3] Commentaire rédigé le Lundi 21 Mars 2005 à 15:58 par LAlex

La meilleure solution reste d'utiliser la seconde écriture de setInterval pour l'appel de méthodes, assez peu connue d'ailleurs :
setInterval(this, "affiche_i", 1000);

++ ^^

[#4] Commentaire rédigé le Lundi 21 Mars 2005 à 15:58 par liguorien

encore plus simple :

class Test {

public var i:Number;

function Test() {
this.i = 0;
var j:Number = setInterval(this, "affiche_i", 1000);
}

public function affiche_i() {
trace(i++);
}
}

^^

[#5] Commentaire rédigé le Lundi 21 Mars 2005 à 16:08 par solo

Merci messieurs :)

(Zêtes bien en phase vous deux ^^)

[#6] Commentaire rédigé le Lundi 21 Mars 2005 à 18:16 par Rooxy

Bonjour Solo

Je t'ai ajouté à la liste des Blogueurs Lyonnais, si tu peux faire un link vers la liste ce serait un plus pour tous.

Cordialement

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.


A propos du billet

Avatar de Thanh

Raccourcis

Rechercher un billet

Sous Rubriques

Photo Pif

Photopif