Twitter

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 :)

6 Comments to Classe, setInterval et fonction de callback

  1. 21 mars 2005 at 13 h 42 min | Permalink

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

  2. 21 mars 2005 at 13 h 46 min | Permalink

    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. 21 mars 2005 at 15 h 58 min | Permalink

    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. 21 mars 2005 at 15 h 58 min | Permalink

    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. 21 mars 2005 at 16 h 08 min | Permalink

    Merci messieurs :)

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

  6. 21 mars 2005 at 18 h 16 min | Permalink

    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

Saisir un commentaire

Vous pouvez utilisez les balises HTML suivantes, ainsi que les attributs associés : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Photographie

Tranches de vie on Facebook