AS3 виртуальный массив частиц - PullRequest
1 голос
/ 25 марта 2011

Я создал класс частиц после урока некоторое время назад.В основном он использует своего рода виртуальный список, заменяя метод массива, что делает его действительно быстрым решением.Так что все работает отлично, за исключением того факта, что я действительно не могу понять, что на самом деле происходит.Это довольно запутанно, поэтому я пытаюсь найти логику в этом, к сожалению, безуспешно.Я буду рад, если кто-то действительно сможет объяснить это, поэтому я смогу донести это до чего-нибудь полезного.

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 Ответ

2 голосов
/ 25 марта 2011

Это называется связанным списком. Смотрите здесь .

Лучшей структурой для этого приложения может быть вектор. Это тип данных массива в AS3, оптимизированный для последовательного доступа, как вы делаете. Поскольку у вас есть фиксированное количество частиц, вам не нужно беспокоиться о стоимости изменения размера вектора. Связанные списки полезны в тех случаях, когда вам нужно добавить или удалить элементы, которые не находятся в конце списка, или когда вам нужно очень переменное количество элементов.

Используйте такой вектор:

// 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
}
...