2011-03-25 49 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