Le Blog de SamsamTS

ChainManager

Pas sur que cette classe soit indispensable mais elle peut toujours être utile.
Le but est de pouvoir enchainer différente fonctions dont le temps d'exécution est variable (onEnterFrame, Tween, etc...)
Le principe est simple, il s'agit d'une pile FIFO (first in - first out) que l'on remplit avec addChain().
Pour que la chaine s'effectue correctement il faut que les fonctions, lorsqu'elles ont terminées, notifient au ChainManager qu'il faut qu'il passe à l'élément suivant avec next().

Voici donc cette classe :

Code :

import mx.transitions.BroadcasterMX;
class ChainManager {
   private var chain:Array;
   private var started:Boolean;
   //--Broadcasting--
   public static var __initBroadcaster = mx.transitions.BroadcasterMX.initialize(ChainManager.prototype);
   public var addListener:Function;
   public var removeListener:Function;
   public var broadcastMessage:Function;
   private var _listeners:Array;
   //--Constructeur--
   public function ChainManager() {
      chain = [];
      _listeners = [];
      started = false;
   }
   public function addChain(target, f:Function) {
      arguments.shift();
      arguments.shift();
      chain.push([target, f, arguments]);
      start();
   }
   public function start() {
      if (!started) {
         var f = chain.shift();
         f[1].apply(f[0], f[2]);
         started = true;
         broadcastMessage("onStart");
      }
   }
   public function next() {
      if (chain.length>0) {
         var f = chain.shift();
         f[1].apply(f[0], f[2]);
         broadcastMessage("onNext");
      } else {
         started = false;
         broadcastMessage("onFinished");
      }
   }
   public function clear() {
      chain = [];
   }
}

Un exemple d'utilisation :

Code :

chainManager = new ChainManager();
chainManager.addChain(this, hide);
chainManager.addChain(this, build);
chainManager.addChain(this, show);
function hide() {
   this.onEnterFrame = function() {
      this._alpha -= 10;
      if (this._alpha<=0) {
         this._visible = false;
         delete this.onEnterFrame;
         chainManager.next();
      }
   };
}   
function build() {
   this.attachMovie("mc","mc",0);
   chainManager.next();
}
function show() {
   this._visible = true;
   this._alpha = 0;
   this.onEnterFrame = function() {
      this._alpha += 10;
      if (this._alpha>=100) {
         this._alpha = 100;
         delete this.onEnterFrame;
         chainManager.next();
      }
   };
}

Vos commentaires

Le mardi 28 septembre 2004 à 00:17 , commentaire par SamsamTS :: #

 

He bien, ca a l'air de vous intéresser :roll:

Tanpis je le garde pour moi alors :mrgreen:

 

Le mercredi 20 octobre 2004 à 17:25 , commentaire par grand-mister :: #

 

Salut samsam,

je découvre ton blog aujourd'hui -> :bravo:

Je découvre donc en meme temps cette classe. Ca tombe bien, ces jours-ci, je me disais qu'il serait interessant de develloper un systeme pour créer une anim a partir d'une suite d'action.
Mais j'avais pas eu le temps d'approfondir la question. ;)

a+

 

Le mercredi 20 octobre 2004 à 18:33 , commentaire par SamsamTS :: #

 

D'ailleur je pense que je vais apporter plusieurs modifications :

- Utiliser eventDispatcher (BroadcasterMX ca craint)
- Pouvoir lancer plusieurs actions en même temps et lancer la suite lorsque toutes les actions sont finies (j'aimerai me rapprocher d'un mode de fonctionnment de type grafcet)
- Peut être une vérification du temps d'exécution, du genre si X actions ont pris plus de 80% du temps d'exécution d'une frame, on attends la frame suivante pour exécuter les prochaines actions.

Vu le peu d'intéret manifesté j'ai un peu zappé cette classe, mais j'espère m'y remettre rapidement.

PS : mais qui est grand-mister ? Ca reste un grand mystère :mrgreen:

 

Le jeudi 28 octobre 2004 à 16:38 , commentaire par grand-mister :: #

 

lol... et oui, l'éternel jeu de mot sur mon pseudo. :lol:
Pour la petite histoire, quand je chatais sur caramail, une de mes premières rencontres fut une fille dont le pseudo était la-petite-misse. Ca m'a donné l'idée de créer le-grand-mister.

Depuis j'utilise grand-mister (un peu plus court :mrgreen: ) comme pseudo sur tout les sites ou il en faut un.

Pour revenir à ta classe, effectivement, y aurait pleins d'évolutions possibles. Perso, j'aurais fait autrement. Je prefererais indiquer un evenement, propre à l'objet en cours d'éxecution, qui doit déclencher la méthode next();

Et pour effectuer plusieurs actions en même temps, je ferais une autre classe qui déclenche toutes ces actions, et qui renvoi un evenement quand elles sont toutes terminées.

Voilà pour mes petites réflexionx ;)

++

 

Le jeudi 28 octobre 2004 à 17:39 , commentaire par neo-lao :: email :: #

 

tiens c'est marrant, j'ai créé la même chose (même idée), mais j'ai appellé ca Action, utilisé par un ActionsManager

sinon, pour le commentaire du grand-mistère (lol) sur les animations à partir d'une suite d'actions, j'ai créé une class spécial qui s'appelle VirtualTimeline ! lol
différent du ActionsManager, je trouve que c'est pas pareil
Mon VirtualTimeline, on ajoute une action à une frame (animation, sound ou script) avec gestion des layers pour les animations)

oui je sais, c'est bien beau de dire tout ca mais elle est où cette class ... Ben j'espère qu'un jour je finirai mon projet de mettre mes class en ligne comme il faut avec les doc et d'avoir un backoffice

 

Le jeudi 28 octobre 2004 à 18:34 , commentaire par grand-mister :: #

 

Finalement, ne sont-ce pas différentes approches, solutions ou design répondant plus ou moins au même besoin ? :? : 8O

 

Le jeudi 28 octobre 2004 à 19:57 , commentaire par neo-lao :: #

 

bien sùr qu'il y a plusieurs solutions au même besoin
mais conceptuellement, ce n'est pas pareil
je crée des class parce que j'en ai besoin, mais avant de les écrire, je me met en transe (lol) et essaye de généraliser et d'abstraire

la solution besoin n'est pas une finalité

 

Le vendredi 29 octobre 2004 à 08:52 , commentaire par ekameleon :: #

 

neo :) Disons qu'en prenant le choix de l'appeler Action .. tu devras si un jour tu as besoin de cette classe pour autre chose la réutiliser mais en perdant au niveau de ton package un peu de clareté dans les notations. Mais bon :) Pas bien grave :)

 

Le vendredi 29 octobre 2004 à 08:56 , commentaire par ekameleon :: #

 

Au passage samsamts tu utilises 2 shift dans ta méthode addChain .pour ma part j'écrirai plutôt :

Code :


public function addChain(target, f:Function) {
   arguments.splice(0,2) ;
    chain.push( [target, f, arguments]);
    start();
}

bye :)

 

Le vendredi 29 octobre 2004 à 09:20 , commentaire par neo-lao :: email :: #

 

mon plus gros soucis, c'est pour nommer les choses, que ce soit les class ou les propriétés et variables
j'me prend vraiment la tête dessus lol

mais je vois pas pourquoi je perdrais de la clarté, une action est une action, si c'est autre chose, ce n'est pas une action, je pige pas ce que tu as voulu dire
surtout que cette class Action est abstraite, j'ai bien pensé que je pouvais utiliser ce fonctionnement à la chaine pour des "actions" différentes
donc là, obligation d'hériter d'Action pour une sucession ... d'actions

 

Le vendredi 29 octobre 2004 à 10:38 , commentaire par grand-mister :: #

 

Je crois qu'eka a voulu dire que Action, c'est un terme extremement vague. Il pourrait être compris de bien des façons en prog ACTIONscript :mrgreen:

 

Le vendredi 29 octobre 2004 à 11:40 , commentaire par neo-lao :: email :: #

 

C'est vrai, j'me suis dit ca aussi
mais de toute facon, à force de se faire des class et de ranger à sa facon, si quelqu'un veut réutiliser ce qu'on a fait, on passe presque tous les dossiers
on reste dans la logique de celui qui l'a fait
c'est comme essayer d'extraire un petit bout de as2lib, autant copier tous les dossiers et utiliser toute la lib

 

Le vendredi 29 octobre 2004 à 13:09 , commentaire par SamsamTS :: #

 

Woua c'est quoi cette déferlante de commentaires d'un coup ? :mrgreen:

En tout cas ya plein de bonnes idée là, faudra que je m'y remette  8)

 

Le vendredi 29 octobre 2004 à 13:31 , commentaire par ekameleon :: #

 

En fait en regardant ta classe je me dis que le Design pattern command serait mieux je pense (en gros c'est la même chose que ce que tu fais) mais avec un execute() au lieu d'un start()
Sinon pourquoi tu fais pas aussi une classe qui hérite directement de Array au lieu de mettre une propriété chain pour accéder à la pile ? :)

 

Le jeudi 3 avril 2008 à 17:33 , commentaire par grand-mister :: #

 

Toujours d'actualité

 

Le jeudi 3 avril 2008 à 21:17 , commentaire par SamsamTS :: #

 

Quoi il y a encore du monde qui visite mon blog ? Woaw :mrgreen:

Je ne pense pas refaire de flash d'ici un bout de temps libre à vous de reprendre mes classes et de les améliorer ainsi que de les porter en AS3 tant qu'à faire.

 

Ajouter un commentaire