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

+0

어떤 경우에도 많은 시간이 소요되며 Vector는 인덱스 액세스에 적합합니다. 그러나 일반적으로 파티클이 생성되고 파기되면 사람들은 ActionScript를 기본값으로 사용하지 않기 때문에 목록을 코딩합니다. – alxx

+0

특정 인덱스 p [xxx]에서 파티클에 액세스 할 필요가없는 경우 연결된 목록이 벡터 – Patrick