views:

32

answers:

3

In AS3 you can embed a graphic into a Class variable:

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

I have hundreds of assets in this one website project I'm doing, so I want to embed assets into an array for quick access.

Can I do something like this? Its not compiling so I'm wondering whether its possible.

        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")],
        ]
+2  A: 

In general, the metadata tags in Flex apply to a class level variable.

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

You can however do:

[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];
Amarghosh
+1. But you can generate the array automatically, as shown in my answer. ;)
back2dos
+4  A: 

I'm afraid you can't. What you could do is the following:

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).constant.@name) ret.push(Assets[s]);
        return ret;
    }
}
back2dos
+1 That's cool! Maybe you can prefix all asset names with a unique string and filter them out from the constant.@name - just in case there are other constants declared in the same class.
Amarghosh
@Amarghosh: good idea. OTOH, I think it would make sense to separate assets and actual constants into seperate classes.
back2dos
Of course... :)
Amarghosh
+2  A: 

You could also embed the assets in a single FLA. In the FLA's library, give each one a class name like "graphics.menu.RightSquare" then export it as a SWC. Configure your Flash Builder project to load the SWC as an external library. Then you can do something like:

import graphics.menu.*;

new RightSquare();
Casey
Fantastic solution! Thanks a million, you've really saved me from a lot of manual [Embed] work.
Jenko
Sweet, glad it worked!
Casey