2011-05-01 53 views
1

我有一个引擎,我创建了一个基于XML数据将对象加载到容器中的对象。该XML的一个非常简单的例子是这样的:在AS3中通过字符串访问属性

<level> 
    <object cname="enemies.Robot"> 
     <pos x="200" y="400" layer="mobiles" /> 
    </object> 
    <object cname="Player"> 
     <pos x="12" y="89" layer="mobiles" /> 
    </object> 
</level> 

我有一个类环境,有一个方法loadLevel(数据:XML)我通过解析XML,那么函数通过运行XML查找所有对象节点并使用getDefinitionByName来确定基于对象要创建哪个对象。@ cname

从这里,我必须像这样手动定义基于XML的每个属性;

obj.x = [email protected]; 
obj.y = [email protected]; 

我想知道是否有设置基于字符串的属性的内置方法。我的意思是像这样:

var mc:MovieClip = new MovieClip(); 
mc.someInbuiltFunctionThatSetsAProperty("alpha", 0.5); 

这样我可以改变我的XML更喜欢这样:

<object cname="Player"> 
    <props> 
     <x>200</x> 
     <y>221</y> 
     <alpha>7834</alpha> 

     <health>Something</health> 
     <power>3</power> 
    </props> 
</object> 

并通过对道具设置所有的所有的孩子重复我的在飞行中的属性。

我知道,如果我在其中创建一个对象和设置属性,像这样:

var obj:Object = 
{ 
    var1: "hello", 
    var2: "there", 
    name: "marty" 
}; 

,你可以通过名称/值使用for(String in Object)环这样便重复:

var i:String; 
for(i in obj) 
{ 
    trace(i + ": " + obj[i]); 
} 

/** 
* Output: 
* var1: hello 
* var2: there 
* name: marty 
*/ 

有没有类似的东西?

肯定有办法,因为这里是一个使用字符串标识属性的示例:

var ar:Array = [new MovieClip(), new MovieClip()]; 
ar.sortOn("alpha", Array.ASCENDING); 

所以只是为了让我的问题更多了点:我希望能够获取和设置属性,我可以识别使用字符串。

+0

疯了。我构建了类似的东西,除了我的节点名称是类名称和属性值(例如'解析为DisplayObjectContainers的XML节点允许孩子要处理和添加的节点,并且任何节点都可以有特殊的子节点'道具'和'构造函数'。 – Triynko 2014-01-22 08:43:45

+0

道具节点需要一组命名属性,以便将子节点构建为类型化对象并将其分配给这些属性,如下所示:'',这样就可以实例化和分配“props”的子节点,以便在props节点的“names”属性中指定的“名称”列表支持类型名称别名例如,我可以用“rect”代替“flash.display.Rectangle”。 – Triynko 2014-01-22 08:47:14

+0

它还支持构造子节点'<构造函数0 =“”3 =“”>',它构建一个数组对象,该对象将通过getDefinitionByName + Class对象传递给构造函数,以及一个辅助函数,该函数硬编码20个不同的路径用1到20个构造函数参数构造类(因为你不能只在Class对象上调用“apply”)。所有属性也被智能处理,它检查hasOwnProperty,自动解释数字并自动解析为已知属性的强类型。 – Triynko 2014-01-22 08:50:20

回答

10

为什么不使用["string property"]符号:

var mc:MovieClip=new MovieClip() 
mc["alpha"] = 0.5   // setter 
var alpha:Number=mc["alpha"] // getter 
+3

*历史上最大的facepalm *。纯粹的天才。 – Marty 2011-05-01 23:21:06

1

我不是它是什么你要找的正是很清楚,但我有你在说什么的一般意义上,有一个几点建议给你。首先,查看AS3语言参考中Object类的文档。请特别注意propertyIsEnumerable()setPropertyIsEnumerable()方法。我想这就是你问的问题。

如果不是,您可能需要查看动态类的行为,这些动态类可以让您随时将变量添加到对象中。

+0

关于动态类的注意事项,但目的是改变已经内置的属性,如x,y,alpha。此外,我对使用动态类特别感到仇恨:虽然对于propertyIsEnumerable参考P +1,这肯定会派上用场。 – Marty 2011-05-02 00:33:14