flash actionscript-3 swc

flash - Trabajando con SWC-problema getDefinitionByName



actionscript-3 (2)

El problema es que el compilador excluirá cualquier clase que no esté referenciada directamente en algún lugar de su código. Esta es una optimización que el compilador aplica por diseño .

La forma normal de resolver esto es exactamente como lo ha demostrado en su "ejemplo 3". Pero es importante tener en cuenta que las dos líneas no tienen que estar juntas en el mismo lugar. Mientras

var newMc:GraphicAsset;

está en algún lugar de su SWF al que se hace referencia desde la ruta principal de ejecución, entonces la definición de clase para GraphicAsset se incluirá en el swf final. Entonces puedes llamar ...

var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

desde otro lugar completamente, y funcionará como esperabas.

Incluso es posible (y bastante común) encontrar las dos líneas en Seaprate SWFs . En este caso, un swf cargaría el otro swf en tiempo de ejecución. Típicamente, el swf del cargador sería el que utiliza getDefinitionByName("SomeClass) , y el swf cargado sería el que define la class SomeClass , y usa var a:SomeClass; , para garantizar que la clase se incorpore en el swf.

Por este motivo, a menudo se encuentra una clase llamada "MyLibraryManifest" definida en "library swf", y luego se hace referencia a ella desde el clip de película principal de ese archivo swf. La clase "manifiesta" simplemente se vería así:

class MyLibraryManifest { private var a:GraphicAsset; private var b:SomeClass; private var c:SomeOtherClass; //... and so on... }

[edit] Puede usar las -includes o -include-libraries para el compilador mxmlc , para forzar al enlazador a incluir una o más clases individuales (o un swc completo), sin aplicar la "optimización de poda" que describí anteriormente.

vea el sitio de adobe para la explicación de las opciones de línea de comando de mxmlc.

Las opciones también se pueden especificar en un archivo de configuración , lo que le permite controlar cómo Flex y / o Flash IDE invocarán el compilador detrás de las escenas.

¡buena suerte!

Tengo un montón de activos gráficos en un fla, los MovieClips están vinculados a algunas clases. Exporto el fla como un swc, que agrego a mi biblioteca con la opción "Fusionado en el código".

Todo funciona muy bien, puedo crear instancias de mis MovieClips, simplemente llamando a sus clases de esta manera.

//example 1 var newMc:BaseClass = new GraphicAsset();

Ahora, si quiero hacer lo siguiente, Flash arroja un error, ¡GraphicsAssetClass es nulo!

//example 2 var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

La única forma en que puedo hacer que funcione la línea anterior es hacer esto

//example 3 var newMc:GraphicAsset; var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class; //then I''m able to do this var newMc:BaseClass = new GraphicsAssetClass();

¿Puede pensar en una solución donde simplemente podría obtener la clase llamando a getDefinitionByName () como lo hago en el ejemplo 2, sin tener que recurrir a la solución del ejemplo 3?


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.