2011-03-25 60 views
1

前段时间,我在一个教程后面做了一个粒子类。基本上它使用某种虚拟列表,替换数组方法,这使得它非常快速的解决方案。所以一切工作都很好,除非我真的不明白究竟发生了什么。这很混乱,所以我试图找到这个东西的逻辑,不幸的是没有成功。如果有人能真正解释这一点,我会很高兴,所以我可以把它变成有用的东西。AS3虚拟粒子阵列

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import Part; 
    import FPSCounter; 

    public class Pixels extends Sprite 
    { 
     private var num:int = 500000; 
     private var sw:Number = stage.stageWidth; 
     private var sh:Number = stage.stageHeight; 
     private var bdata:BitmapData=new BitmapData(sw,sh,false,0x111111); 
     private var bmp:Bitmap = new Bitmap(bdata); 
     private var firstParticle:Part; 
     private var radius:Number; 
     private var range:Number; 
     private var color:uint = 0xffffff; 

     public function Pixels() 
     { 
      addChild(bmp); 
      addChild(new FPSCounter()); 
      createParticles(); 
      addEventListener(Event.ENTER_FRAME,anim); 
     } 

     private function createParticles():void 
     { 
      var lastParticle:Part; 

      for (var i:int = 0; i < num; i++) 
      { 
       radius = Math.random() * (2 * Math.PI); 
       range = Math.random() * (2 * Math.PI); 
       var thisP:Part = new Part; 
       thisP.x = sw/2; 
       thisP.y = sh/2; 
       thisP.xvel=Math.sin(range) * radius; 
       thisP.yvel = Math.cos(range) * radius; 

       if (i == 0) 
       { 
        firstParticle = thisP;      } 

       else 
       { 
        lastParticle.next = thisP; // ???? 
       } 

       lastParticle = thisP; 
      } 
     } 

     private function anim(event:Event):void 
     { 
      var p:Part = firstParticle; 
      bdata.lock(); 
      p = firstParticle; 
      bdata.fillRect(bdata.rect, 0x111111); 

      do 
      { 
       p.y += p.xvel; 
       p.x += p.yvel; 

       bdata.setPixel(p.x, p.y, color); 
       p = p.next; 
      } 
      while (p != null) 

      bdata.unlock(); 
     } 
    } 

回答

2

这被称为链表。见here

这个应用程序的更好的结构可能是Vector。这是AS3中的阵列数据类型,针对顺序访问进行了优化,就像您在做的那样。由于您拥有固定数量的粒子,因此您不必担心调整Vector大小的成本。如果您需要添加或删除不在列表末尾的元素,或者需要高度可变数量的元素时,链接列表非常有用。

使用的载体是这样的:

// This is a member variable 
private var particles : Vector.<Part> = new Vector.<Part>(num); 

// This fills the particle list 
for(var ii : int = 0; ii < num; ++ii) { 
    var part : Part = new Part(); 
    // Initialize the particle here 
    particles.push_back(part); 
} 

// This iterates through the particles 
for each(var part : Part in particles) { 
    // Draw part 
} 
+0

感谢您的回答。 我不认为矢量是一个很好的选择,因为我在这个例子中有50万个粒子。它将花费大量的时间循环所有这些。 – 5et 2011-03-25 02:53:14

+0

在任何情况下都需要很长时间,Vector非常适合索引访问。但是一般来说,如果粒子被生成并销毁,人们就会为它编码列表,因为ActionScript缺少默认的列表。 – alxx 2011-03-25 07:44:07

+0

如果您不需要访问特定索引p [xxx]上的粒子,则链接列表比矢量更快 – Patrick 2011-03-25 09:49:07