2013-02-17 72 views
1

我有xml-structure,其中载入了我的程序的大部分数据。在这种情况下,我想实例化一个在xml中指定的类。我想我可以在xml中编写类名,然后实例化它并将参数传递给它。原来并不那么容易!在As3中创建具有类'name'字符串的实例

我想这样的代码:

  //special objects 
     for each (o in xml.Objects[0].special) 
     { 
      p.x = [email protected]; 
      p.y = [email protected]; 
      s.x = [email protected]; 
      s.y = [email protected]; 
      trace([email protected]); 
      //var type:Class = [email protected] as Class; 
      var type:Class = getDefinitionByName(String([email protected])) as Class; 

      trace(type); 
      objectArray.push(new type(p, s)); 
      trace("special"); 
     } 

正如你可以看到我有我在XML文件类名属性类的名称。我设法与getDefinitionByName定义(至少一个跟踪显示正确的类名),但是当我尝试实例化,并将其推入阵列我得到它开始

错误#2136错误的堆:SWF文件file:///Users/tuomas/Dropbox/Flash/ScorpionBox/bin-debug/ScorpionBox.swf包含无效数据。

任何想法,我应该如何与此?

+0

可能重复[我可以从AS3创建一个类的实例,只知道他的名字?](http://stackoverflow.com/questions/7597343/can-i-create-an-instance-of-a -s3-just-known-his-name) – bobobobo 2014-09-30 15:00:10

回答

4

假定您的XML类型定义由getQualifiedClassName()获得的限定名称组成,请实例化该类型并根据需要应用属性。显示对象的

实施例的实例化由XML定义:

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.utils.getDefinitionByName; 

    public class XmlParser extends Sprite 
    { 
     public var xml:XML = <objects> 
           <object type="flash.display::Sprite" x="0" y="0" width="100" height="100" /> 
           <object type="flash.display::MovieClip" x="0" y="0" width="100" height="100" /> 
          </objects>; 

     public function XmlParser() 
     { 
      for each (var object:XML in xml.children()) 
      { 
       var type:Class = getDefinitionByName([email protected]) as Class; 
       var instance:DisplayObject = new type(); 
       instance.x = [email protected]; 
       instance.y = [email protected]; 
       instance.width = [email protected]; 
       instance.height = [email protected]; 

       addChild(instance); 
      } 
     } 
    } 
} 

你可以还的describeType对象时序列化到XML,然后通过遍历XML的属性,诸如应用性能回对象实例:

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.utils.getDefinitionByName; 

    public class XmlParser extends Sprite 
    { 
     public var xml:XML = <objects> 
           <object type="flash.display::Sprite" x="0" y="0" width="100" height="100" /> 
           <object type="flash.display::MovieClip" x="0" y="0" width="100" height="100" /> 
          </objects>; 

     public function XmlParser() 
     { 
      for each (var object:XML in xml.children()) 
      { 
       var type:Class = getDefinitionByName([email protected]) as Class; 
       var instance:DisplayObject = new type(); 
       addChild(instance); 

       for each (var attribute:XML in [email protected]*) 
       { 
        if(attribute.name() == "type") { continue; } 

        trace("setting: " + attribute.name() + " = " + attribute.toXMLString()); 
        instance[attribute.name().toString()] = attribute.toXMLString(); 
       } 
      } 
     } 
    } 
} 
+0

非常感谢!我的问题是我没有在字符串中加入“::”,直到这篇文章才发现它。它现在就像一种魅力:) – Tumetsu 2013-02-17 21:56:13

相关问题