Le Blog de SamsamTS

Le monstre !

Comment pourrais-je appeler cette classe autrement qu'un monstre ?

En effet, à l'aide d'un simple fichier xml elle peut construire une animation entière pour peu que les composants, éléments graphiques et les classes soient inclues.
Après un grand cassage de tête :cogne: j'arrive à ca  :D :

Code :

class CompoManager {
   //--Constructeur--
   public function CompoManager(target:MovieClip) {
      mc = target;
   }
   //--Public--
   public function load(url:String) {
      xml = new XML();
      xml.ignoreWhite = true;
      xml._parent = this;
      xml.onLoad = function() {
         this._parent.generate();
         this._parent.onLoad();
      };
      xml.load(url);
   }
   public function useString(str:String) {
      xml = new XML(str);
      xml.ignoreWhite = true;
      generate();
   }
   public var onLoad:Function;
   //--Private--
   private var xml;
   private var mc:MovieClip;
   private function generate() {
      var nodes = xml.firstChild.childNodes;
      for (var i = 0; i<nodes.length; i++) {
         build(nodes[i], mc);
      }
   }
   private function build(node:XMLNode, parent) {
      var name = node.attributes.name;
      if (node.nodeName == "prop" || node.nodeName == "this") {
         // Si c'est une propriété ou une référence
         var value = getValue(node.firstChild, parent);
         setRef(name, parent, value);
      } else if (node.nodeName == "method") {
         // Si c'est une méthode
         var args = [];
         for (var i = 0; i<node.childNodes.length; i++) {
            args.push(getValue(node.childNodes[i], parent));
         }
         parent[name].apply(parent, args);
      } else if (node.nodeName == "func") {
         // Si c'est une fonction
         parent.node = node;
         setRef(name, parent, function () {
            var compoMng = new CompoManager(this);
            compoMng.useString(this.node.toString());
         });
      } else if (node.nodeName == "compo") {
         // Si c'est un composant
         parent = parent.attachMovie(node.attributes.id, name, parent.getNextHighestDepth());
         for (var i = 0; i<node.childNodes.length; i++) {
            build(node.childNodes[i], parent);
         }
      } else if (node.nodeName == "class") {
         //Si c'est une classe
         var args = [];
         for (var i = 0; i<node.childNodes.length; i++) {
            if (node.childNodes[i].nodeName == "param") {
               args.push(getValue(node.childNodes[i].firstChild, parent));
            }
         }
         //--new MaClasse--{
         var MaClasse = getRef(node.attributes.id, _global);
         parent[name] = new Object();
         parent[name].__proto__ = MaClasse.prototype;
         parent[name].__constructor__ = MaClasse;
         MaClasse.apply(parent[name], args);
         //--}
         for (var i = 0; i<node.childNodes.length; i++) {
            build(node.childNodes[i], parent[name]);
         }
      }
   }
   private function getValue(node:XMLNode, parent) {
      var type = node.nodeName;
      var value = node.firstChild.nodeValue;
      if (type == "this") {
         //Si c'est une référence
         value = getRef(node.attributes.name, parent);
      } else if (type == "root") {
         value = getRef(node.attributes.name, mc);
      } else if (type != "param") {
         //Sinon c'est un cast
         value = _global[type](value);
      }
      return value;
   }
   private function getRef(str:String, parent) {
      //cherche et renvoie la référence
      var arr = str.split(".");
      var ref = parent;
      for (var i = 0; i<arr.length; i++) {
         ref = ref[arr[i]];
      }
      return ref;
   }
   private function setRef(str:String, parent, value) {
      //Affecte la référence
      var arr = str.split(".");
      var ref = parent;
      for (var i = 0; i<arr.length-1; i++) {
         if (ref[arr[i]] == undefined) {
            ref[arr[i]] = new Object();
         }
         ref = ref[arr[i]];
      }
      ref[arr[arr.length-1]] = value;
   }
}

Je n'ai pas fait d'exemple pour le moment et je n'ai pas encore testé toutes les fonctionnalités mais ca ne saurait tarder :) .

Vos commentaires

Le dimanche 5 septembre 2004 à 23:26 , commentaire par thecaptain :: email :: #

 

Salut,

Nice taf :bravo: tu aurais le xml qui va avec ???? :)

@++

 

Le lundi 6 septembre 2004 à 23:27 , commentaire par SamsamTS :: #

 

Ya plein de bug :? et tout ne marche pas comme je voudrais, il va falloir que je corrige tout ca.

J'ai surtout un problème pour créer une nouvelle instance d'une classe. Difficile de faire un apply sur un new, donc difficile de passer des arguments au constructeur :cogne: .

La methode de Lalex pour simuler l'opérateur new n'as pas l'air de marcher pour toutes les class intrinsic :( (ex : XML) :

Code :

//--new MaClasse--{
var MaClasse = getRef(node.attributes.id, _global);
parent[name] = new Object();
parent[name].__proto__ = MaClasse.prototype;
parent[name].__constructor__ = MaClasse;
MaClasse.apply(parent[name], args);
//--}

:hum?: Si vous avez une piste...

 

Le mardi 7 septembre 2004 à 09:07 , commentaire par thecaptain :: email :: #

 

Salut,

mmh Bon je veux pas dire n'importe kwa :mrgreen: mais si tu fait un truc du genre :

var classe:MaClasse = new MaClasse();

trace(classe.constructor) //[type function] normalement

classe.constructor.apply(parent[name] args);

Bon j'ai pas testé et ca m'étonnerait que ca marche mais y l'idée d'utiliser la propriété ND constructor... :?

bon heu sinon on dois mettre quoi comme balise pour le code ??? :mrgreen:

@++

 

Le vendredi 10 septembre 2004 à 01:47 , commentaire par fred :: #

 

et ça sert à ?
A noter que le flash, surtout à ton niveau, doit surtout te sevir à traiter l'interaction graphique et le visuel, et non absolument tout. Sinon, tu alourdis le client... hum...

Mais rhaaaa.... je ne m'y ferais jamais au private/protected... J'ai failli penser ne vraiment pas comprendre cette classe :P

 

Le vendredi 10 septembre 2004 à 13:14 , commentaire par SamsamTS :: #

 

C'est vrai que j'en demande peut être trop à cette classe.

Le but principal est de pouvoir gérer la disposition de composants et leur propriétés dans une application via xml sans avoir forcément à recoder la partie "xmlToCompo".

Je pensais que ca pouvait être intéressant surtout si d'un autre coté on développe une appli visuelle (en flash ou autre) permettant de générer ces xml à la volée.

 

Le samedi 11 septembre 2004 à 23:00 , commentaire par liguorien :: email :: #

 

la seule solution que je vois pour ton problème est de coder en dure le new pour les classes qui posent un problème... :roll:

Code :

class Class{
   public static function newInstance(name:String,args:Array){
   
      var clazz:Function = eval("_global." + name);
      
      switch(clazz){
         
         case XML : return new XML(args[0]);
                     
         //mettre les autre types qui causent problèmes...
         
         default :
            var obj = {__constructor__:clazz, __proto__:clazz.prototype};
            clazz.apply(obj,args);
            return obj;
      }         
   }
}


@++

 

Le lundi 13 septembre 2004 à 10:20 , commentaire par SamsamTS :: #

 

Oui effectivement mais je cherchait une solution "générale" mais ce n'est pas possible on dirait donc je croit que je vais un peut "brider" cette classe à l'essentiel (enfin dès que j'ai le temps).

PS : la balise c'est as et pas code ;)

 

Ajouter un commentaire