是否可以在循环中创建公共静态变量?就像是:
for(var i:uint=0;i<22;i++)
{
public static var ("Name"+String(i+1)) = Texture(....);
}
是否可以在循环中创建公共静态变量?就像是:
for(var i:uint=0;i<22;i++)
{
public static var ("Name"+String(i+1)) = Texture(....);
}
不。我还没有看到或听说过。循环需要在方法定义中运行,并且您不能public static var
在方法中声明。变量名也不能是动态的,编译器应该在编译时检查语法错误,它如何知道你是否在运行时命名变量?不允许局部变量的动态名称。
出于您的目的,您可以使用Array、Dictionary或Object通过循环存储多个值。但是,您不能public static
在循环内使用。
var myVarMap:Object = {};
for(var i:uint=0;i<22;i++)
{
myVarMap['Name' +i] = Texture(....);
}
通常情况下,不会像 The New Idiot 指出的那样,但有一些方法可以提供帮助。
实际上,您可以使用执行 ABC(actionscript 字节码)操作的库(如as3swf、as3-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 包等。
如前所述,上述脚本(遍历资产目录并替换字符串以生成动作脚本类文件)可以用您熟悉的语言编写。
虽然,我认为 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