2010-07-16 13 views
5

En AS3 se pueden incrustar un gráfico en una variable de clase:muchos gráficos usando una matriz

 [Embed(source="MenuAssets.swf", symbol="topSquare")] 
     public var TopMenuItem:Class; 

Tengo cientos de activos en este proyecto un sitio web que estoy haciendo, así que quiero integrar en activos una matriz para un acceso rápido.

¿Puedo hacer algo como esto? No está compilando así que me pregunto si es posible.

 public var MenuAssets:Array = [ 
      [Embed(source="MenuAssets.swf", symbol="topSquare")], 
      [Embed(source="MenuAssets.swf", symbol="botSquare")], 
      [Embed(source="MenuAssets.swf", symbol="leftSquare")], 
      [Embed(source="MenuAssets.swf", symbol="rightSquare")], 
     ] 

Respuesta

4

También puede incrustar los activos en un único FLA. En la biblioteca de la FLA, dele a cada uno un nombre de clase como "graphics.menu.RightSquare" y expórtelo como SWC. Configure su proyecto de Flash Builder para cargar el SWC como una biblioteca externa. A continuación, puede hacer algo como:

import graphics.menu.*; 

new RightSquare(); 
+0

¡Solución fantástica! Gracias a un millón, realmente me salvaste de un montón de trabajo manual [Incrustar]. –

+0

¡Dulce, me alegro de que funcionó! – Casey

4

En general, las etiquetas de metadatos en Flex se aplican a una variable de nivel de clase.

You must use the [Embed] metadata tag before a variable definition, where the variable is of type Class.

Sin embargo, puede hacer:

[Embed(source="MenuAssets.swf", symbol="topSquare")] 
public var TopMenuItem:Class; 

[Embed(source="MenuAssets.swf", symbol="leftSquare")] 
public var LeftMenuItem:Class; 

[Embed(source="MenuAssets.swf", symbol="rightSquare")] 
public var RightMenuItem:Class; 

[Embed(source="MenuAssets.swf", symbol="botSquare")] 
public var BottomMenuItem:Class; 

public var menuAssets:Array = [TopMenuItem, LeftMenuItem, 
           RightMenuItem, BottomMenuItem]; 
+1

+1. Pero puedes generar la matriz automáticamente, como se muestra en mi respuesta. ;) – back2dos

5

me temo que no se puede. Lo que podría hacer es lo siguiente:

public class Assets { 
    [Embed(source="MenuAssets.swf", symbol="topSquare")] 
    public static const TOP_SQUARE:Class; 
    //... more assets ... 
    public static function getAssets():Array { 
     var ret:Array = []; 
     for each (var s:String in describeType(Assets)[email protected]) ret.push(Assets[s]); 
     return ret; 
    } 
} 
+2

+1 ¡Eso es genial! Tal vez pueda prefijar todos los nombres de los activos con una cadena única y filtrarlos de la constante. @ Nombre, solo en caso de que haya otras constantes declaradas en la misma clase. – Amarghosh

+0

@Amarghosh: buena idea. OTOH, creo que tendría sentido separar activos y constantes reales en clases separadas. – back2dos

+0

Por supuesto ... :) – Amarghosh

Cuestiones relacionadas