Iteratif

Si ce que tu as à dire n'est pas plus beau que le silence, alors tais-toi !

28 août 2004

Enfin GLIC

Une annonce tant attendue
Ca se passe ici

Posté par Iteratif à 13:04 - Commentaires [3] - Rétroliens [0] - Permalien [#]


27 août 2004

Voila c'est fait.

Comme je vous l'avais indiqué précédemment sur les MultiDelegate je viens de mettre en place un algorithme linéaire pour le stockage efficace des delegates.
Voici le fichier delegate.as mis à jour :

 // Auteur : Iteratif
 // Date de création: 15/07/2004
 // Date de maj: 26/08/2004
 // version:0.6a
 class it.system.Delegate {
      private var _prev:Delegate;
 
      private var target;
      private var method:Function;
 
      function get Previous():Delegate {
           return _prev;
      }
     
      static function create(obj:Object, func:Function):Function {
           var f = function() {
                var target = arguments.callee.target;
                var func = arguments.callee.func;
                return func.apply(target, arguments);
           };
 
           f.target = obj;
           f.func = func;
           return f;
      }
 
      static function combine(d1:Delegate, d2:Delegate):Delegate {
           if(d1 == null) return d2;
           if(d2 == null) return d1;
           return d1.combineImpl(d2);
      }
 
      static function remove(d1:Delegate, d2:Delegate):Delegate {
          var delegate1:Delegate = d1;
          while(delegate1 != null) {
               if(delegate1 == d2) {
                    delegate1 = null;
                    return d1;
               }
               delegate1 = delegate1._prev;
           }
      }
 
      function Delegate(f:Function) {
           target = t;
           method = f;
      }
 
      function combineImpl(d:Delegate):Delegate {
           var d1:Delegate = this;
           while(d1._prev != null) {
                d1 = d1._prev;
           }
           d1._prev = d;
           return d1;
      }
 
      private function invokeImpl(obj:Object,e:Object) {
           var d1:Delegate = this;
           while(d1 != null) {
                d1.method(obj,e);
                d1 = d1._prev;
           }
      }
 
      function invoke(obj:Object,e:Object) {
           invokeImpl(obj,e);
      }
 }

Posté par Iteratif à 19:12 - Commentaires [2] - Rétroliens [0] - Permalien [#]

23 août 2004

Ces petits moments ou...

on se sent bien, un bout ?

Posté par Iteratif à 21:11 - Commentaires [0] - Rétroliens [0] - Permalien [#]

MultiDelegate

Voici ma version de la classe Delegate, celle avec laquelle vous pouvez faire du mulitdelegate.
Avec un exemple qui permet de comprendre son utilisation:

 // Auteur : Iteratif
 // Date de création: 15/07/2004
 // Date de maj: 13/08/2004
 // version:0.5a
 class it.system.Delegate {
      var list:Array;
     
      static function create(obj:Object, func:Function):Function {
           var f = function() {
                var target = arguments.callee.target;
                var func = arguments.callee.func;
                return func.apply(target, arguments);
           };
 
           f.target = obj;
           f.func = func;
           return f;
      }
 
      static function combine(d1:Delegate, d2:Delegate):Delegate {
           if(d1 == null) return d2;
           if(d2 == null) return d1;
           return d1.combineImpl(d2);
      }
 
      static function remove(d1:Delegate, d2:Delegate):Delegate {
           var lst = d1.list;
           for(var i = 0; i < lst.length; i++) {
                if(lst[i] == d2.list[0])
                     delete lst[i];
           }
           return d1;
      }
 
      function Delegate(f:Function) {
           list = new Array();
           list.push(f);
      }
 
      function combineImpl(d:Delegate):Delegate {
           list.push(d.list[0]);
           return this;
      }
 
      private function invokeImpl(obj:Object,e:Object) {
           for(var i in list)
                list[i](obj,e);
      }
 
      function invoke(obj:Object,e:Object) {
           invokeImpl(obj,e);
      }
 }

ca se passe ici pour l'exemple.
Ceci dit, je suis en passe de mettre en place un algorithme linéaire de stockage de délégués à la place d'un tableau de fonctions.

Posté par Iteratif à 15:44 - Commentaires [4] - Rétroliens [0] - Permalien [#]

Petite correction...

Lors de la précédente publication, je vous ai parlé de la gestion des évènements et des délégés dans it.system mais j'ai oublié de vous préciser que dans le code suivant, la partie mis en vert :

      function onClick() {
           var handler = events.getEntry(Carre.EventClick);
           if(handler != null)
                handler.invoke(this,"click");
      }

est du type Object. Ce qui vous permet de passer n'importe quelle structure de type Object à votre gestionnaire d'évènement.

Posté par Iteratif à 11:24 - Commentaires [1] - Rétroliens [0] - Permalien [#]

21 août 2004

Les évènements et les délégués dans it.system

Dans it.system, tous les composants utilisent une classe qui fournit une liste simple de délégués.
La classe de base it.system.FControl fournit une structure de données efficace (à l'aide de la propriété Events) pour le stockage et l'extraction de délégués d'événements.La propriété Events est structure de données du type it.system.EventList qui est conçue pour un stockage et une extraction efficaces des délégués d'événements.

La classe suivante (qui d'ailleurs reprend la classe d'exemple de Colin Mook : la classe Box) montre cette structure,
le code implémenté par cette structure est mis en surbrillance et en gras.

 class Box {
      private static var EventClick:String = "EventClick";
      private static var EventRollOver:String = "EventRollOver";
      private static var EventRollOut:String = "EventRollOut";
 
      private var events:EventList;

      private var width:Number ;
      private var height:Number ;
      private var container_mc:MovieClip
      
      function Box (x:Number, y:Number,w:Number, h:Number, target:MovieClip, depth:Number ) {
           container_mc = target.createEmptyMovieClip("boxcontainer" + depth, depth);
           container_mc.onPress = Delegate.create(this ,onClick);
           container_mc.onRollOver = Delegate.create(this ,onRollOver);
           container_mc.onRollOut = Delegate.create(this ,onRollOut);
           container_mc.useHandCursor = false ;
 
           setWidth(w);
           setHeight(h);
 
           setX(x);
           setY(y);
      }
 
      function getWidth ():Number {
           return width;
      }
 
      function setWidth (w:Number ) {
             width = w;
             draw();
      }
 
      function getHeight ():Number { return height; }
 
      function setHeight (h:Number ) {
           height = h;
          draw();
      }
 
      function getX ():Number { return container_mc._x ; } 
 
      function setX (x:Number) { container_mc._x = x; } 
 
      function getY ():Number { return container_mc._y ; } 
 
      function setY (y:Number) { container_mc._y = y; }
 
      function get Events():EventList {
           if(events == null )
                events = new EventList();
           return events;
      }
 
      function addClick(value:Delegate) {
           Events.addHandler(Carre.EventClick,value);
      }
 
      function addRollOver(value:Delegate) {
           Events.addHandler(Carre.EventRollOver,value);
      }
 
      function addRollOut(value:Delegate) {
           Events.addHandler(Carre.EventRollOut,value);
      }
 
      function onRollOver() {
           var handler = events.getEntry(Carre.EventRollOver);
           if(handler != null )
                handler.invoke(this,"rollOver");
      }
 
      function onRollOut() {
           var handler = events.getEntry(Carre.EventRollOut);
           if(handler != null )
                handler.invoke(this,"rollOut");
      }
 
      function onClick() {
           var handler = events.getEntry(Carre.EventClick);
           if(handler != null )
                handler.invoke(this,"click");
      } 
 
      function draw () {
           container_mc.clear ();
           container_mc.lineStyle (1, 0x000000);
           container_mc.moveTo (0, 0);
           container_mc.beginFill (0xFFCC33, 100);
           container_mc.lineTo (width, 0);
           container_mc.lineTo (width, height);
           container_mc.lineTo (0, height);
           container_mc.lineTo (0, 0);
           container_mc.endFill ();
      }
 }

Des explications s'imposent :
...
private static var EventClick:String = "EventClick";
...

Variable statique qui définit la clé pour le stockage de(s) délégé(s).
...
     function addClick(value:Delegate) {
           Events.addHandler(Box.EventClick,value);
      }
      function onClick() {
           var handler = events.getEntry(Box.EventClick);
           if(handler != null)
                handler.invoke(this,"click");
      }
...

La première fonction permet l'enregistrement du délégué à la liste des délégués pour l'évènement Click.
La seconde permet l'appel au délégué enregistré avec l'évènement Click

Maintenant que les explications sont faites. Voici un exemple concret:

 function doIt() {
      result2.text = "coucou";
 }
 function doOtherIt() {
      result3.text = "un autre coucou";
 }
 
 function doOtherOtherIt() {
      result1.text = "hehe !!!";
 }

 function clear() {
      result1.text = "";
      result2.text = "";
      result3.text = "";
 }

 var myBox = new Box(10,10,100,100,_root,0);
 myBox.addClick(new Delegate(doOtherIt));
 myBox.addClick(new Delegate(doIt));
 myBox.addRollOver(new Delegate(doOtherOtherIt));
 myBox.addRollOut(new Delegate(clear));

On définit des gestionnaires d'événements.
On instancie la classe Box.
On connecte le gestionnaire d'événements à Box, en créant un délégué qui contient une référence à doIt dans son argument et ajouter cette instance déléguée à l'événement Click.

Un apercu (en live) : survolez le carre et cliquez dessus

Posté par Iteratif à 21:32 - Commentaires [0] - Rétroliens [0] - Permalien [#]

18 août 2004

3D

Un peu de 3D cela ne fait pas de mal.
Quand j'ai le temps, je m'amuse à faire des moteurs 3D en flash et en voici un qui est léger et rapide mais assez complexe je l'avoue.
Je pense que des explications s'imposent...mais pas pour le moment, dans un prochain ticket peut-être :)

Pour faire tourner le cube utiliser les fleches de votre clavier et pour faire avancer et reculer le cube les touches haut et bas de page.


Poids du swf environ 3Ko.

fichier source, ca se passe ici.

Posté par Iteratif à 22:50 - Commentaires [4] - Rétroliens [0] - Permalien [#]

Dictionary

Voici une petite classe qui permet de stocker une collection de paires valeur-clé.
Ces paires sont organisées comme membre de la classe.

 class Dictionary {
      function Dictionary() {}

      function addEntry(key:String,data:Object) {
           this[key] = data; 
      }

      function remove(key:String) {
          delete this[key];
      }

      function clear() {
           for(var i in this)
               delete this[i];
      }

      function contains(value:Object):Boolean {
           for(var i in this) {
                if(this[i] == value)
                     return true;
           }
          return false;
      }

      function getEntry(key:String):Object {
           if(contains(this[key]))
                return this[key];
           return null;
      }
 }

Posté par Iteratif à 20:32 - Commentaires [0] - Rétroliens [0] - Permalien [#]

14 août 2004

MXI

Voici un outil indispensable MXI File Creator. Cet outil vous permet tel que son nom l'indique de créer des fichiers MXI

ca se passe ici

Posté par Iteratif à 17:24 - Commentaires [0] - Rétroliens [0] - Permalien [#]

13 août 2004

Logo it.system

Je travaille actuellement sur le logo du framework it.system, en voici un aperçu. Je serais ravi de connaitre vos opinions .

Posté par Iteratif à 21:09 - Commentaires [0] - Rétroliens [0] - Permalien [#]
« Accueil  1