AS3虚拟粒子阵列

时间:2011-03-25 01:29:50

标签: actionscript-3 actionscript particles

我刚刚在教程之后制作了一个粒子类。基本上它使用某种虚拟列表,取代了数组方法,这使它成为真正快速的解决方案。所以一切都很好,除了我真的无法理解究竟发生了什么。这很令人困惑所以我试图找到这些东西的逻辑,遗憾的是没有成功。如果有人能真正解释这一点我会很高兴,所以我可以把它变成有用的东西。

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();
        }
    }

1 个答案:

答案 0 :(得分: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
}