Если набор объектов в сцене описывается в XML-формате, а затем динамически генерируется в приложении — в общем случае описание сцены будет выглядеть, как нечто подобное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<SectorMain> <Object1 id="1" desc="Объект №1"> <id>1</id> <sub_id>0</sub_id> <center_x>48</center_x> <center_y>48</center_y> <name>17</name> <img_path>graphic</img_path> <img_name>img1</img_name> <img_ext>png</img_ext> </Object1> <...> <...>...</...> </...> </SectorMain> |
XML-файл загружается в сцену через URLLoader и парсится стандартным обходом всего дерева:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var Loader:URLLoader = new URLLoader(); var Request:URLRequest = new URLRequest(); Request.method = URLRequestMethod.POST; Loader.dataFormat = URLLoaderDataFormat.TEXT; Request.url = "файл XML"; Loader.addEventListener(Event.COMPLETE,OnComplete); Loader.load(Request); protected function OnComplete(e:Event):void { InfoLoader.removeEventListener(Event.COMPLETE,OnComplete); var SectorData:XML = new XML(e.target.data); CreateFromXML(SectorData); } protected function CreateFromXML(Data:XML):void { for each (var Node:XML in Data.*) { if(Node.nodeKind()=="element") { // Обработка каждого узла XML-дерева } } } |
Загрузив описание сцены и пропарсив XML-документ, встает вопрос: как при обработке узлов дерева по текстовому названию Object1 создать экземпляр класса Object1 и заполнить его нужными свойствами? На помощь приходит функция getDefinitionByName(ClassName:String) которая и решает эту задачу. Однако в ее работе присутствует следующая особенность: имя класса нужно указывать полностью, вместе с именем package которому данный класс принадлежит, даже если класс включен в package в котором вызывается getDefinitionByName.
Создание класса по имени будет выглядеть следующим образом:
1 2 |
var ClassReference:Class = getDefinitionByName("PackageName."+Node.name()) as Class; var Instance:Object = new ClassReference(); |
В итоге Instance и будет экземпляром класса Object1