MTASC : Charger des classes via des swf (à la manière des DLL)

Voici comment utiliser la technique des swf "dll" pour charger des classes dynamiquement. Une autre technique que celle d'Aral Balkan.

Sur osflash, Aral Balkan nous explique comment utiliser des swf à la manière des DLL : http://osflash.org/using_a_swf_as_a_dll

Il y a aussi ce tutoriel en français sur media-box :

http://wiki.media-box.net/tutoriaux/flash/bibliotheques_de_fonctions

Inconvénient : il nous est imposé de connaître le package des classes que l'on souhaite utiliser par la suite, puisqu'il nous faut importer la classe avec la directive :

import com.package.myclass;

De plus cette technique est assez contraignante puisqu'il faut utiliser un fichier exclude ou alors utiliser des classes intrinseques pour utiliser cette technique. Encore une fois si on ne connait pas les classes à l'avance, cela s'avère fastidieux, sinon impossible.

Si le typage n'est pas primordial pour vous, alors vous pouvez procéder de la manère suivante, avec MTASC :

Créez une classe pour la "dll" (je n'aime pas trop ce terme, car il ne s'agit vraiment pas d'une dll... mais c'est le terme utilisé)

class mydll

{

// constructor

public function mydll()

{

trace("hello world !");

}

}

Compilez la classe avec les paramètres suivants :

"pathmydll.as" -swf "pathmydll.swf" -cp "pathConfigurationClasses" -header 800:600:35

Comme vous le voyez, on n'a pas utilisé le point d'entrée Main statique, mais on a simplement compilé la classe dans un swf.

Ensuite, il faut appeler la dll depuis notre fichier principal :

import fr.jide.utils.Relegate;

import com.qlod.LoaderQueue;

class Main

{

public var loader : LoaderQueue;

public var dllListener: Object;

public var dllInstance: Object; // on n'a pas le typage !

public var containerMC : MovieClip;

static function main()

{

loadDll("mydll");

}

public function loadDll(param:String)

{

loader = LoaderQueue.getInstance(); // initialisation du loader

loader.setMinSteps(5);

dllListener = new Object();

dllListener.onLoadComplete = Relegate.create(this,this.dllComplete,param); // quand la dll est chargée

loader.load ( containerMC, param+".swf", dllListener); // on charge la dll

}

public function dllComplete(param:String)

{

dllInstance = new (eval(param))(); // et hop ! on crée notre instance dynamiquement !

trace("dll loaded !");

}

}

Cette fois, on compile avec les parametres habituels.

Bon, je ne vous garantie pas que l'exemple marche tel quel (notamment le movieclip container qui n'existe pas ici) puisque je l'ai reconstruit pour l'exemple, mais l'idée est là.

On remarque que le trace de la dll est affiché lors de la compilation du swf principal, sympa :)

Cette technique est un peu différente de celle d'Aral puisqu'on ne se soucie pas du typage. Mais ca marche nickel !

Avantages de cette technique :

  • pas de directive import
  • pas de fichier exclude
  • pas de classe intrinsèque
  • le trace de la dll s'affiche lors de la compilation du swf principal
  • création de l'instance avec un eval, donc on peut virtuellement utiliser n'importe quelle classe

La classe, nan ? ;)