tag Embed et librairie partagée avec AS3

  • 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

C'est une discussion sur un thread du site développez.net qui m'a donné envie de faire ce test...

Le tag Embed en ActionScript3 permet d' "embarquer" des fichiers de ressources (généralement des images ou des sons) afin de les avoir à disposition dans une animation Flash / application Flex.

Durant mon travail pour cineact (Flex / LCDS) j'avais eu le loisir de travailler avec des développeurs et des designers, et quelqu'un avait créé un fichier IconRessource.as dans le projet. Ce fichier déclarait une classe toute simple, qui faisait simplement d'embarquer toute une série d'icônes dans l'application. Exemple de notation :

[Bindable]
[Embed(source="assets/icons/world_link.png")]
public static var world_link:Class;

Au final, dans les fichiers mxml, on utilisait un appel statique pour récupérer directement l'icône :

<mx:Image source="{IconeRessource.world_link}" />

Bref. Très intéressant comme concept. Puis dans la discussion de développez.net, le sujet portait sur cette fameuse balise Embed et sur l'intégration d'images... Quelqu'un a soulevé le fait que si il y a bcp d'images à afficher, utiliser Embed va alourdir le swf final, puisque toutes les images vont être embarquées. J'ai esquissé une première idée, celle d'utiliser une librairie partagée. Puis après réflexion, j'ai même proposé de lier le concept de fichier de ressources avec la librairie partagée. Mon interlocuteur ayant testé sans succès le concept, j'ai fini par vouloir le tester moi-même, afin de savoir si réellement il était fonctionnel...

Et bien oui, il est pleinement fonctionnel, que ça soit pour des projets purement ActionScript3 ou des projets Flex...

L'idée est la suivante :

  1. Je veux d'abord avoir un fichier qui va me permettre d'intégrer mes ressources dans un swf qui fera office de librairie partagée.
  2. J'aimerai ensuite pouvoir charger cette librairie, et accéder à ma classe de ressources afin de l'utiliser dans mon projet principal

Le problème qui vient à l'esprit, c'est que si je veux récupérer la classe dans mon projet principal, je serai sensé l'importer dans ce dernier pour faire un casting correct de l'instance. Si je l'importe et je la caste, ça va impliquer que mon swf principal va connaitre son contenu, et donc lui aussi embarquer toutes les images, et c'est justement ce que je veux éviter...

Il n'y a pas longtemps, j'ai redécouvert pas mal de principes sur les interfaces, entre autre d'apporter un couplage faible entre plusieurs classes / swf / projets. L'utilisation d'une interface dans ce cas est réellement intéressante, du fait que ma classe ne sera pas castée en tant qu'elle même, mais en tant qu'interface. Cette petite astuce me permettant d'accéder aux méthodes définies par l'interface elle-même, et donc de profiter au maximum de ma classe de ressources.

Plutôt que des mots, je vous laisse le soin de découvrir les 2 fichiers attachés qui contiennent des sources pour 2 projets : un projet actionScript3 pur, et un projet Flex qui va reprendre la librairie partagée du projet AS3 et l'interface commune.

Une fois les 2 projets compilés, copiez la librairie partagée (testEmbed.swf) du projet AS3 vers le projet Flex. Vous pourrez ensuite tester les 2 projets et constater que les swf d'application n'embarquent pas les images, mais les affichent sans problème, même via le dataBinding Flex.




Well done !

Pour avoir suivi et un peu participé au sujet sur développez.net, je dois t'avouer que j'ai été emballé.

Beau boulot et félicitations, je m'en vais parcourir le reste de ton blog !

Arnaud.