BitmapData简单的粒子效果



package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	[SWF(width="300",height="300")]
	public class Test extends Sprite
	{
		[Embed(source='1.png')]
		private var imgClass:Class;
		
		private var particleArr:Vector.<Particle>
		
		private var displayBMP:BitmapData;
		private var timer:Timer = new Timer(150);
		
		public function Test()
		{
			displayBMP = new BitmapData(300,300,true,0xffffffff);
			var display:Bitmap = new Bitmap(displayBMP);
			
			var img:Bitmap = Bitmap(new imgClass());
			particleArr = new Vector.<Particle>;
			var width:int = img.bitmapData.width;
			var height:int = img.bitmapData.height;
			img.bitmapData.lock();//在 setPixel()setPixel32() 方法进行多次调用之前和之后使用lock() 方法和unlock() 方法可提高性能。
			for(var i:int = 0;i<height;i++)//获取粒子信息
			{
				for(var j:int = 0;j<width;j++)
				{
					var pixel:uint = img.bitmapData.getPixel32(j,i)
					if(pixel >> 24 & 0xFF != 0)//不获取透明像素
					{
						var particle:Particle = new Particle(pixel,j,i,Math.random()*300,Math.random()*300);
						particleArr.push(particle);
					}
					
				}
			}
			img.bitmapData.unlock();
			img.bitmapData.dispose();//不操作后,释放bitmapData
			img = null;
			
			addChild(display);

			this.stage.addEventListener(MouseEvent.CLICK,onMouseClick);
		}
		
		private function updateDisplay():void
		{
			var count:int = 0;
			displayBMP.lock();
			displayBMP.fillRect(displayBMP.rect, 0xffffffff);
			for each(var particleInstance:Particle in particleArr)
			{
				if(particleInstance.currX == particleInstance.posX && particleInstance.currY == particleInstance.posY)
				{
					count ++;
				}else{
					particleInstance.assemble();//粒子聚集到目标位置
				}
				
				displayBMP.setPixel32(particleInstance.currX,particleInstance.currY,particleInstance.pixel);
			}
			displayBMP.unlock();
			if(particleArr.length == count)//全部到目标位置后 移除事件
			{
				this.stage.removeEventListener(MouseEvent.CLICK,onMouseClick);
				removeEventListener(Event.ENTER_FRAME,onEffect);
			}
		}
		
		private function onMouseClick(e:MouseEvent):void
		{
			addEventListener(Event.ENTER_FRAME,onEffect);
		}
		
		private function onEffect(e:Event):void
		{
			updateDisplay();
		}
	}
}

粒子类Particle.as


package
{
	public class Particle
	{
		private var _posX:int;//目标X坐标
		private var _posY:int;//目标Y坐标
		private var _pixel:uint;//颜色
		private var _currX:int;//当前X坐标
		private var _currY:int;//当前Y坐标
		
		public function Particle(color:uint,posX:int,posY:int,currX:int = 0, currY:int = 0)
		{
			_currX = currX;
			_posX = posX;
			_currY = currY;
			_posY = posY;
			_pixel = color;
		}

		//聚集
		public function assemble():void
		{
			var speed:int =  Math.random() * 36;
			_currX += (_posX - _currX) / speed;
			_currY += (_posY - _currY) / speed;
		}
		
		public function get posX():int
		{
			return _posX;
		}

		public function set posX(value:int):void
		{
			_posX = value;
		}

		public function get posY():int
		{
			return _posY;
		}

		public function set posY(value:int):void
		{
			_posY = value;
		}

		public function get pixel():uint
		{
			return _pixel;
		}

		public function set pixel(value:uint):void
		{
			_pixel = value;
		}

		public function get currX():int
		{
			return _currX;
		}

		public function set currX(value:int):void
		{
			_currX = value;
		}

		public function get currY():int
		{
			return _currY;
		}

		public function set currY(value:int):void
		{
			_currY = value;
		}


	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值