Comme je le précisais dans mon précédent post, je suis en train de m'attaquer au redéveloppement de certaines classes fournies par Macromedia. Cela commence par la fameuse OnEnterFrameBeacon, fournissant un point d'accés central à l'évenement onEnterFrame de MovieClip. La seule différence entre ma version et celle de MM est son nom, (devenue pour l'occasion FrameBeacon, c'est bien suffisant :P), l'utilisation de EventDispatcher, et la création d'un constructeur privé, histoire d'être bien sûr qu'on ne puisse pas l'instancier. ;)

Viennent ensuite les classe de type ITimeInterval que sont MSInterval et FrameInterval.

Ces deux classes servent à gérer des intervalles de temps, soit en millisecondes, soit en nombre de frames. Elle diffuse régulièrement un évenement onTime à ses écouteurs. Le but est ici d'uniformiser l'execution d'instructions à intervalles réguliers, comme cela peut exister avec un setInterval. L'utilité de ces classes réside dans plusieurs points :

  • Une interface commune, permettant de modifier facilement à l'execution le type d'intervalle.
  • La possibilité d'executer un évenement toutes les n frames, comme c'est le cas en millisecondes avec setInterval.
  • La possiblité de définir un nombre maximum d'itérations de l'intervalle
  • La possiblité d'arrêter un intervalle en cours de route, et de le reprendre où il en était
  • La possibilité de synchroniser plusieurs instructions en leur attribuant la même instance d'un intervalle

Voici un exemple d'utilisation :import com.lalex.transitions.*;
class Diaporama {
   private var _itv:ITimeInterval;
   // Constructeur et méthodes ...
   // Si un intervalle existait déjà, on l'arrete et on le désabonne
   public function setInterval(itv:ITimeInterval) {
      if (_itv != null) {
         _itv.stop();
         _itv.removeListenerEvent("onTime", this);
      }
      _itv = itv;
      _itv.addListenerEvent("onTime", this);
   }
   public function onTime() {
      nextImage();
   }
   public function start() {
      _itv.start();
   }
}

/** Utilisation */
var diapo:Diaporama = new Diaporama();
diapo.addImage("image1.jpg");
diapo.addImage("image2.jpg");
// On crée un intervalle de 500 ms.
var ms:ITimeInterval = new MSInterval(500);
// La même instruciton pour changer d'image toutes les 20 frames
// var ms:ITimeInterval = new FrameInterval(20);
diapo.setInterval(ms);
diapo.start();

A noter que pour obtenir l'équivalent d'un onEnterFrame, il suffit de créer un FrameInterval sans paramètre (ou avec 1 en premier paramètre).

Le seul probleme important vient du fait que les destructeurs ne sont pas gérés, et qu'un delete d'une instance non stopée peut laisser tourner un processus orphelin ... :\

La classe Tween utilisant les intervalles de temps viendra prochainement ... ;)

::Télécharger TimeInterval.zip::