在flash中动态创建公共静态var

时间:2013-05-26 08:31:34

标签: actionscript-3 variables

是否可以在循环中创建公共静态变量? 类似的东西:

for(var i:uint=0;i<22;i++)
{
public static var ("Name"+String(i+1)) = Texture(....);
}

3 个答案:

答案 0 :(得分:1)

没有。我还没有看到或听说过。循环需要在方法定义中运行,你不能在方法中声明public static var。变量名也不能是动态的,编译器应该在编译时检查语法错误,以及如何在运行时命名变量?不允许使用局部变量的动态名称。

出于您的目的,您可以使用ArrayDictionaryObject通过循环来存储多个值。但是,你不能在循环中使用public static

var myVarMap:Object = {};
for(var i:uint=0;i<22;i++)
{
   myVarMap['Name' +i]  = Texture(....);
}

答案 1 :(得分:0)

虽然,我认为The New Idiot使用静态数组的答案应该符合您的目的,这将使逻辑更具可读性。但是,要回答您的问题,如果我们可以动态地在类上创建公共静态属性:是的,您可以使用原型对象。请参阅下面的代码。

package
{
    import flash.display.Sprite;

    public class dingAS3 extends Sprite
    {
        public function dingAS3()
        {
            DynClass.init();

            var a:DynClass = new DynClass;
            for(var i:String in a)
            {
                trace(i + '-->' + a[i]);
            }

            var b:DynClass = new DynClass;

            DynClass.prototype["prop0"] = "Hello";

            trace('b: ' + b["prop0"]);
        }
    }
}


class DynClass
{
    public static function init():void
    {
        for(var i:uint=0; i<5; i++)
        {
            DynClass.prototype["prop"+i] = i;
        }
    }
}

上述代码的输出类似于:

prop1-->1
prop3-->3
prop2-->2
prop0-->0
prop4-->4
b: Hello

答案 2 :(得分:0)

通常情况下,没有The New Idiot指出, 但有方法可以帮助。

您实际上可以使用执行ABC(动作脚本字节码)操作的库(如as3swfas3-commons-bytecode)生成一些代码,但这会使您的场景变得复杂。天主教徒的解决方案要简单得多,但在使用动态类时要小心也是个好主意。

我假设您有一个包含资产的文件夹,并且您希望基于此生成资产类。它应该只是使用你喜欢的任何类型的语言来扫描你的文件系统:cmd / bash / c / c ++ / python / java甚至javascript虽然在IDE IDE中的JSFL或actionscript 3作为最小的AIR用于为您生成此资产类的工具。

以下是使用Python的简单示例:

import sys,os,re

classTemplate = "package{\n\n\tpublic class %s{\n%s\n\t}\n}" #template for empty class with variables placeholder
varTemplate   = "\t\tpublic static var %s = new Texture('%s');\n" #variable template with 2 placeholders: variable name and file path
vars = "" #all vars to be placed in the class variables place holder

clean = lambda varStr: re.sub('\W|^(?=\d)','_', varStr) #cleanup the filename so it's a valid actionscript variable name

if(len(sys.argv) == 4): #if we have all the arguments
    f = sys.argv[1]
    if(os.path.exists(f) == False): #check if the path exists
        print f+' does not exist'
        pass

    if(f != None and os.path.isdir(f)): # also if it's a directory
        files = []
        for (dirpath, dirname, filenames) in os.walk(f): #travers the path and remember files
            files.extend(filenames)
            break
        for tf in files: # for each file
            var = clean(tf) # create a variable
            vars += varTemplate % (var,dirpath+os.sep+tf) # replace the variable placeholders/tokens and append to all class vars
        asClass = open(sys.argv[3],'w') #finally open the output file
        asClass.write(classTemplate % (sys.argv[2],vars)) # replace and write the class
        asClass.close() # and close the file
    else:
        print f +' is not a directory'

例如,如果将其保存为assetgen.py,则可以像下面那样运行它:

python /path/to/assetgen.py /path/to/your/assets_dir AS3ClassName /path/to/write/AS3ClassName.as

因此,我的机器上的简短测试看起来像:

python ~/Desktop/assetgen.py ~/Documents/assets/240x240_240x230_pxl/240x240/1-1 Assets1_1 ~/Desktop/Assets1_1.as

哪个产生了:

package{

    public class Assets1_1{
        public static var _01_bmp = new Texture('/Users/hm/Downloads/240x240_240x230_pxl/240x240/1-1/01.bmp');
        public static var _02_bmp = new Texture('/Users/hm/Downloads/240x240_240x230_pxl/240x240/1-1/02.bmp');
        public static var _03_bmp = new Texture('/Users/hm/Downloads/240x240_240x230_pxl/240x240/1-1/03.bmp');
        public static var _04_bmp = new Texture('/Users/hm/Downloads/240x240_240x230_pxl/240x240/1-1/04.bmp');
        public static var _05_bmp = new Texture('/Users/hm/Downloads/240x240_240x230_pxl/240x240/1-1/05.bmp');

    }
}

如果您正在使用Ant(例如可以像eclipse / FlashBuilder / FDT一样集成到IDE),则可以轻松生成任务,以便在项目中更改/更新资产时重新生成类。

随意生成变量名称,添加额外的命令行参数以指定actionscript包等。

如上所述,上面的脚本(遍历资产目录并替换字符串以生成actionscript类文件)可以用您熟悉的语言编写。