0

是否可以在循环中创建公共静态变量?就像是:

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

3 回答 3

1

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

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

var myVarMap:Object = {};
for(var i:uint=0;i<22;i++)
{
   myVarMap['Name' +i]  = Texture(....);
}
于 2013-05-26T08:54:00.340 回答
0

通常情况下,不会像 The New Idiot 指出的那样,但有一些方法可以提供帮助。

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

我假设您有一个包含资产的文件夹,并且您想基于它生成一个资产类。只需使用您熟悉的任何可以扫描文件系统的语言即可:cmd/bash/c/c++/python/java 甚至 javascript,尽管 Flash 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 包等。

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

于 2013-05-26T10:33:43.533 回答
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
于 2013-05-26T09:51:46.747 回答