mtasc et les Form (mx.screens.Form)

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille

Si vous passez souvent par ici, vous devez surement connaître ma petite manie de tout développer, ou presque, en mode Form. J'en parle souvent dans mes tickets ou dans mes questions sur le net. C'est un mode de développement que j'apprécie beaucoup, car on y trouve bien des similitudes avec le développement win32, domaine dont je suis plus ou moins issu.

Le week-end passé, j'ai décidé d'enfin m'essayer à Mtasc, histoire de voir si ça valait la peine que j'oublie l'IDE Flash pour passer à FAME avec Mtasc, Eclipse, ActionScript Development Tool (ASDT) et Flashout.

Pour ceux qui ne connaissent pas, Mtasc est un compilateur AS2 open-source. Il permet donc de générer des swf à partir de rien, ou presque. Une classe suffit à servir de point d'entrée et de "constructeur" pour le reste de l'application. On peut créer un swf à partir de rien, en liant 1 ou plusieurs classes AS2, ou encore créer un swf qui contient déjà des symboles en bibliothèques (Avec Flash ou swfmill, par exemple) pour que ces derniers puissent être utilisés par nos différentes classes.

FAME correspond aux initiales des outils cités ci-dessus : Flashout, Asdt, Mtasc, Eclipse.
Un nouvel acronyme, FAMES, prend également en compte Swfmill, qui permet de générer des swf avec du contenu en bibliothèque (hors sons, malheureusement pour le moment...).
Enfin, un dernier acronyme, FLAMES, est la finalité de l'approche AS2 open-source : on y ajoute encore l'outil Library (en développement par Aral Balkan actuellement) qui est une interface graphique pour swfmill.

Je ne vais pas rentrer dans le détail de l'installation de FAME, car il existe déjà assez de littérature à ce sujet. Sachez d'ailleurs que l'installation du tout se fait en moins de 10 minutes, pour peu que vous ayez téléchargé Eclipse à l'avance (70Mo la bête, tout de même).

Je ne vais pas non plus vous détailler un exemple concret, le site motion-twin s'occupe de ça très bien avec son petit tutorial de base.

Je vais soulever 2-3 astuces (et peut-être plus par la suite) qui m'ont été transmise durant ces 2 ou 3 jours de recherches et tests.

----------
On utilise mtasc en ligne de commande. Pour spécifier un chemin de package externe (par exemple le package mx), on doit utiliser le paramètre -cp suivi du chemin menant jusqu'à la racine des packages. Si vous devez spécifier plusieurs chemins différents (typiquement, j'ai le chemin macromedia dans documents & settings, et un chemin sous E:FlashmyClasses qui contient mes propres packages), il faut spécifier plusieurs commandes -cp à la suite.

----------
La classe mx.utils.Delegate ne fonctionne pas avec mtasc, tout du moins pas correctement. Peejay m'a expliqué que pour la faire fonctionner, il faut mettre le code suivant sur la timeline (dans le fla directement, donc on doit passer par Flash (ou par Ming Smile) : var d = mx.utils.Delegate; A partir de là, la classe Delegate sera opérationnelle.

----------
Enfin, petit détail sur lequel je me suis cassé la tête un bon moment : Au début de mon sujet, je parlais du développement par Form, que je trouve intéressant pour tout ce qui est animations "multi-formulaires" tels que des sites web, des applications de gestion, ... Lors de mes essais, je n'ai pas manqué de voir comment la transition entre l'IDE Flash et Mtasc se passait, et j'ai eu droit à quelques mauvaises surprises...
En général, lors d'un développement par form, on crée une classe qui dérive de mx.screens.Form, et on l'attache à un formulaire en passant par le panneau des propriétés.
Mon fla contient déjà les formulaires, ainsi que les liaisons. Il ne me restais plus qu'à comprendre comment faire en sorte que du coté des classes, le point d'entrée puisse faire fonctionner le reste sans soucis.
Tout d'abord, on doit utiliser la méthode registerClass pour lier l'occurence de formulaire à la classe correspondante.
Le problème, c'est que l'utilisation de registerClass sur une classe non-MovieClip fait que toutes les références aux méthodes natives de MovieClip disparaissent... Dans l'IDE Flash, je pouvais utiliser createEmptyMovieClip, attachMovie ainsi que toutes les méthodes natives de MovieClip à partir de la classe de formulaire. Dans Mtasc, l'accès au méthodes me retourne "undefined".

Après maintes recherches sur le web, j'ai trouvé une première réponse : dans la classe parent (dans mon cas, mes classes héritent d'une classe "TFormTemplate" qui hérite elle-même de la classe GForm de Grant Skinner, héritée de mx.screens.Form), il faut déclarer la méthode :

public var createEmptyMovieClip:Function;

et dans son constructeur, on va lier la référence de la fonction native à MovieClip à notre fonction du formulaire :

createEmptyMovieClip = MovieClip.prototype.createEmptyMovieClip;

pas très élégant, j'en conviens, mais après avoir fait ce processus pour createEmptyMovieClip et attachMovie, mon application s'est compilée sans aucun souci, alors que j'avais une simple page blanche avant ça.

Par la suite, je me suis inscris à la mailing-list mtasc et j'ai directement posé la question si il existait un moyen plus efficace / élégant de palier à mon problème, et un des utilisateurs m'a donné une solution des plus simples : utiliser le paramètre -frame 2 pour exporter les classes dans la frame 2. Et ça fonctionne également Smile

Donc j'ai maintenant le doute sur ma théorie du registerClass, l'essentiel est que ça fonctionne, je suis déjà très content de ça, mais j'aime bien comprendre le pourquoi du comment... Je continuerai à alimenter ce ticket si j'obtiens plus d'informations sur le sujet Wink

Ok. Donc... c'est Igor Sadovskiy qui m'a mis sur la piste du -frame 2, et il a enchainé en m'expliquant que d'après lui, mais sans certitudes aucunes, ça serait du au modèle d'architercture des applications du Formulaire Flash. Il semblerai que Flash génère les application du formulaire Flash automatiquement avec quelques frames, et place tout le code sur la seconde frame. Donc si on tente de mettre du code qui fait appel à des classes sur la première frame (par défaut avec mtasc), il ne va pas trouver les classes recherchées.




fans du mode terminal

salut j'utilise mtasc pur sans autre additif
je mets à disposition mes sources se sont des petits
exemples que j'ai glané à droite à gauche ou adapté
je pense que j'aurais été content de les avoir au tout
debut
experts et graphistes ne vous fatiguez pas c'est surtout pour les débutants et les inconditionnels du mode terminal.
pas de swfmill ni de asdt eclipse etc ...
je mettrais aussi quelques sources .sc compilables avec swfc de www.swftools.org
http://jeanmichel.gens.free.fr/mtasc

je ne supporte pas le chat au dessus de 6 lignes
vive le chat vocal

Avec MTASC je n'arrive pas à céer d'application en mode formulaire sans avoir à creer un fla :

voici mon script :

import mx.screens.Form;
class Tuto {
public var mc:Function
public static function main(app:mx.screens.Form) {

//Object.registerClass("application", mx.screens.Form);
//MovieClip.createEmptyMovieClip("mc",_root.getNextHighestDepth());

var t=new Tuto(app);

}
public function Tuto(mc:MovieClip) {
//mc = Tuto.prototype.mc;
//Object.registerClass("application",mx.screens.Form);
mc = new mx.screens.Form();
_root.createEmptyMovieClip("mc",0);
_root.createClassObject(mx.screens.Form,"app",1,{contentPath:"_root.mc",autoload:true,visible:true});
Object.registerClass("_root.app",mx.screens.Form);
_root.createEmptyMovieClip("mc1",10);
_root.mc1.createTextField("tf", 0, 0, 0, 800, 600);
_root.mc1.tf.text = "Hello world !"+typeof(_root.app);

}
}

peux-tu m'aider ?

Portrait de titouille

Hello Hervé !!

Désolé, mais je ne peux pas vraiment t'aider sur ce coup là... je m'étais penché sur la création "dynamique" de formulaires, mais je n'y suis jamais arrivé correctement.

Par contre, je pense qu'il est normal de devoir passer par l'ide Flash pour créer un fla basique en mode Form (rien qu'avec un élément racine par exemple) et d'attacher dynamiquement d'autres forms dessus (si tu y arrive (et si tu y arrive, ça m'intéresserai de voir un exemple...)), car les swf en mode form ont, semble-t-il, une architecture différente des swf normaux... Je pense que mtasc ne permet pas de reproduire cette architecture en créant le swf.

Perso, je crée mon fla en mode form, je rajoute tous les Forms dont j'ai besoin, je crée les classes (le minimum) qui vont être attachée aux Forms, je fais les liaisons dans l'ide Flash, et à partir de là, j'utilise le swf généré avec mtasc.

Voilà. Bon courage Wink

[MTASC] - la compilation libre.
MTASC == Motion-Twin ActionScript 2 Compiler;