actionscript 3 - que - AS3 incrusta o importa todas las clases en un swf externo sin hacer referencia a cada clase por separado
swf download (5)
Tengo un archivo ArtLibrary.swf que tiene cientos de MovieClips exportados con nombres de clase. Quiero poder usar estas películas en varios archivos flash diferentes en los que estoy trabajando, pero no sé cómo hacer una referencia adecuada después de usar e incrustar el comando.
Los siguientes trabajos:
[Embed(source="ArtLibrary.swf", symbol="BirdBodyColor_mc")]
var BirdBodyColor_mc:Class;
myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC);
En este ejemplo, no estoy seguro de cómo hacer referencia a las clases individuales dentro de la "clase maestra".
[Embed(source="ArtLibrary.swf")]
var MasterClass:Class;
myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC.BirdBodyColor_mc);
En lugar de usar un SWF, es mejor usar un SWC. Para crear un SWC, vaya a la configuración de publicación de Flash Pro y vaya a la pestaña Flash y seleccione "Exportar SWC". El SWC contiene tanto el SWF como un manifiesto especial con toda la información que Flash necesita saber sobre las clases en el SWF.
Luego, para usar el SWC en otro proyecto, vaya a la configuración de AS3 (también en la pestaña Flash de la configuración de publicación), diríjase a la pestaña Ruta de la Biblioteca y agregue su SWC (las rutas absolutas y relativas funcionan bien).
Tenga en cuenta que esto solo funcionará en CS4 o Flex (con Flex estoy bastante seguro de que puede simplemente arrastrar el SWC a su proyecto, pero lo verificaré).
Ahora, si quería cargar el SWF y usar sus activos en tiempo de ejecución, esa es una bola de cera completamente diferente. Para que funcione correctamente, tendrás que jugar con la clase Loader y ApplicationDomain para que las clases se pongan en el dominio adecuado. Aquí hay alguna buena información sobre el tema:
http://www.kirupa.com/forum/showpost.php?p=2123134&postcount=366
Este es un caso en el que CS4 es demasiado inteligente por su propio bien. Como no siempre se está refiriendo explícitamente a las clases en cuestión de una manera que el compilador puede determinar en tiempo de compilación, no incluye esas clases en su SWF, de ahí el error.
En Flex puede evitar esto con un argumento de línea de comando, pero ese no es el caso con CS4. En su lugar, tiene la referencia explícita de las clases que desea usar al menos una vez de una manera que el compilador pueda entender. Por ejemplo, hice un SWC simple que contenía un símbolo con su clase establecida en "TestCircle". En el código que utilizaba el SWC tenía el siguiente código y funcionó bien:
import flash.utils.getDefinitionByName;
TestCircle;
var test:MovieClip = new (getDefinitionByName("TestCircle") as Class)();
addChild(test);
Si te apetece hacerte el lujo, puedes escribir un pequeño script que rompa un SWC (es solo un archivo zip), lee el manifiesto XML que está dentro y crea una clase especial "includer" automáticamente. Pero como dicen, lo dejaré como un ejercicio para el lector. ;-)
¡Espero que ayude!
Así que todavía estoy atascado escribiendo con un script largo y creado manualmente que hace referencia a cada clase importada. De acuerdo, las líneas son mucho más cortas que el método de inserción, incluso un término.
Al final, hice mi ArtLibrary.fla y luego simplemente copié y pegué todas las carpetas de la biblioteca de ese fla en cada una de mis otras 5 fla. No me molesté en compilar el archivo swf. Para mis necesidades, fue el más eficiente.
Muchas gracias por toda la ayuda. Sus respuestas fueron directas y muy detalladas.
Si te apetece hacerte el lujo, puedes escribir un pequeño script que rompa un SWC (es solo un archivo zip), lee el manifiesto XML que está dentro y crea una clase especial "includer" automáticamente. Pero como dicen, lo dejaré como un ejercicio para el lector. ;-)
No hay necesidad de hacer algo tan complejo (¡afortunadamente!). El argumento del compilador include-libraries incluirá automáticamente todas las clases desde su SWC, lo que permite que el método getDefinitionByName
funcione como se espera.
En su archivo App-config.xml (o alternativamente pasado directamente como un argumento para el compilador):
<include-libraries>
<library>path/to/your.swc</library>
</include-libraries>
Entonces puede usar getDefinitionByName
forma normal.
HTH.
Usar FlashDevelop es bastante fácil de arreglar.
Haga clic derecho en su swc incluido de la lista de proyectos. Elija opciones y luego "incluir biblioteca (biblioteca completa)".
.. ahora puede usar getDefinitionByName para obtener una clase sin referencia de su archivo swc.