2011-05-01 52 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