AS3 发表于 2013-2-7 01:32:48

[转]粒子效果浅析

http://bbs.9ria.com/viewthread.php?tid=77135&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

package {      import flash.display.Bitmap;      import flash.display.BitmapData;      import flash.display.Loader;      import flash.display.Sprite;      import flash.events.Event;      import flash.geom.ColorTransform;      import flash.geom.Rectangle;      import flash.net.URLRequest;                /**         * @author FLASH023         * @date 2011-3-27 14:07      **/      public class ParticleExmaple extends Sprite          {                private var bmd:BitmapData;                private var bitmap:Bitmap;                private var particleArray:Array;                private var moveIndex:int;                public function ParticleExmaple():void {                                        bmd = new BitmapData (pic.width , pic.height , true, 0x00);                        bmd.draw (pic );//得到图片数据                        bitmap=new Bitmap(bmd);                        addChild (bitmap);                        particleInit();                }                private function particleInit():void {                        moveIndex = 0;                        particleArray = [];                                        var _h:int = bmd.height;                        var _cx:int = int(_h * .5);                        var _cy:int = int(bmd.height * .5);                        while (_h--) {                              var _w:int = bmd.width;                              while (_w--) {                                        particleArray.unshift(new Particle(_w, _h, bmd.getPixel32(_w, _h)));//把每个像素的值让一个粒子对象记录下来                                        //粒子是不加入到显示列表中的,但它有x ycolor 三个属性(显示列表中的对象发生属性改变,就会导致系统开销增加).                              }                        }                        addEventListener (Event.ENTER_FRAME, moveParticle );                }                private function moveParticle(e:Event ):void {                        bmd.lock ();//给BitmapData对象加锁,加锁的目的就是让bmd对象中的像素发生改变时,不刷新显示(因为刷新显示也要占用系统开销)                        bmd.fillRect (bmd.rect, 0x00);                        var _l:int = particleArray.length;                        while(_l--){                              var _p:Particle = particleArray;                              if(_l<moveIndex){                                        _p.move();                                        if (_p.x < 0 || _p.x > bmd.width || _p.y < 0 || _p.y > bmd.height ) {                                                //particleArray.splice (particleArray.indexOf(_p), 1);                                                continue;                                        }                              }                              bmd.setPixel32(_p.x, _p.y, _p.c);//改变bmd中的像素,这里是循环内部,每个粒子都会让它执行一次。前面之所以要加锁就是因为粒子太多,如果不锁,每个粒子都会刷新一次显示,占用的开销就大了。                        }                              bmd.unlock ();//这里解锁,让显示刷新。                         //以上整个过程,就是让成千上万个粒子的改变,只刷新显示一次。 那么刷新显示(也是消耗系统开销的主要因素之一)占用的开销就不受粒子的多少影响了。                        moveIndex += bmd.width;                }      }      }
页: [1]
查看完整版本: [转]粒子效果浅析