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