2013-11-27 62 views
1

对于我的Flash应用程序,我需要计算过程中的所有对象,无论是计时器,墙壁,坦克还是导弹!我在寻找,但我发现了一些函数来计算相同类型的对象的数量。有没有一个功能,类或任何能够做我需要的东西?计算as3中的所有对象

+1

如果它们是DisplayObject实例(Sprite/MovieClip等),则可以使用容器的numChildren,然后根据需要迭代/过滤 –

回答

0

我也许有一个解决方案给你,但它不是很美丽:p 你可以使用一个为你实例化一切的类,并保持实例的数量。

看看这个类为例:

package 
{ 
    import flash.utils.Dictionary; 
    import flash.utils.getQualifiedClassName; 

    public class ClassInstaciator 
    { 
     /** keep the count of the instance by class names **/ 
     private static var _counts:Dictionary; 

     public function ClassInstaciator() 
     { 

     } 

     /** instanciate a class **/ 
     public static function instanciate(classe:Class, ...arg):* 
     { 
      // create dictionary if not exists 
      if(!_counts) _counts = new Dictionary(); 

      // get class name 
      var className:String = getQualifiedClassName(classe); 
      // if the class isn't int he dictionaray then add it, else increment count 
      if(!_counts[className]) _counts[className] = 1; 
      else      _counts[className] += 1; 

      // return the instance depending on args length 
      switch (arg.length) { 
       case 0:  return new classe(); 
       case 1:  return new classe(arg[0]); 
       case 2:  return new classe(arg[0], arg[1]); 
       case 3:  return new classe(arg[0], arg[1], arg[2]); 
       case 4:  return new classe(arg[0], arg[1], arg[2], arg[3]); 
       case 5:  return new classe(arg[0], arg[1], arg[2], arg[3], arg[4]); 
       case 6:  return new classe(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); 
       case 7:  return new classe(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6]); 
       case 8:  return new classe(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7]); 
       case 9:  return new classe(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8]); 
       case 10: return new classe(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8], arg[9]); 
      } 

      // return null mean you have more than 10 args ... add cases to the switch ... 
      return null; 
     } 

     /** return the number of instance created for a Class **/ 
     public static function countFor(classe:Class):int 
     { 
      // get class name 
      var className:String = getQualifiedClassName(classe); 
      // no instances for this class 
      if(!_counts || !_counts[className]) return 0; 
      // return the instance count 
      return _counts[className]; 
     } 

     /** return a string representing the count of the classes instance by name **/ 
     public static function toString():String 
     { 
      var s:String = ''; 
      for(var name:String in _counts) 
      { 
       s += name+'::'+_counts[name]+'\r'; 
      } 
      return s; 
     } 
    } 
} 

,看看如何使用它:

var mc  :MovieClip = ClassInstaciator.instanciate(MovieClip) as MovieClip; 
var time :Timer  = ClassInstaciator.instanciate(Timer, 200, 2) as Timer; 
var time2 :Timer  = ClassInstaciator.instanciate(Timer, 200, 2) as Timer; 
var bd  :BitmapData = ClassInstaciator.instanciate(BitmapData, 200, 200) as BitmapData; 

trace(ClassInstaciator.countFor(Timer));  
//result -> 2 
trace(ClassInstaciator.toString()); 
// result -> 
//flash.utils::Timer::2 
//flash.display::MovieClip::1 
//flash.display::BitmapData::1 

正如我说这之前不是很美丽,但它的工作原理;)
也许它可以帮助你。

+0

如果要对实例进行计数的所有类都是您的,则可以为每个类添加一个静态var计数并在每个构造函数上增加它。这更好,更简单。如果它们不是你的,你可以扩展它们来添加count属性。 –