[转]粒子 瀑布
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.filters.ConvolutionFilter; import flash.geom.Point; import flash.geom.Rectangle; import flash.utils.Timer; import flash.display.BitmapDataChannel; import flash.system.System; /** * ... * @author chens */ public class Main extends Sprite { private var bitmap:Bitmap; private var bmpData:BitmapData; private var filter:ConvolutionFilter = new ConvolutionFilter(3, 3, , 38); private var arrPoint:Array=new Array;//点的数量 private var arrVx:Array = new Array;//点在X方向的速度 private var arrVy:Array = new Array;//点在Y方向的速度 private var arrColor:Array = new Array;//每个点的颜色 public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point initImg(); initFunction(); } private function initImg():void { bmpData = new BitmapData(550, 400, false, 0x178445); bitmap = new Bitmap(bmpData); addChild(bitmap); } private function initFunction():void { var timer:Timer = new Timer(20); timer.addEventListener(TimerEvent.TIMER, addPoint); timer.start(); this.addEventListener(Event.ENTER_FRAME, onFrame); } private function addPoint(evt:TimerEvent):void { var point:Point = new Point; var Vx:Number; var Vy:Number; var color:uint; if (int(Math.random()*2)==0) { color = 0xffffff; }else { color = 0x00aaaa; } point.x = Math.random() * 100 + 100; point.y = 100; var speed:Number = Math.random() * 0.9 +0.1; var angle:Number = Math.PI / 6; arrPoint.push(point); Vx = Math.cos(angle) * speed; Vy = Math.sin(angle) * speed; arrVx.push(Vx); arrVy.push(Vy); arrColor.push(color); } private function onFrame(evt:Event):void { for (var i:int = 0; i < arrPoint.length;i++) { if (arrPoint.y >= 300) { var f:Number = Math.random() / 50; var speed:Number = Math.random() * 0.9 +0.1; var angle:Number = Math.PI / 6; var Vx:Number = Math.cos(angle) * speed; var Vy:Number = -Math.sin(angle) * speed; Vx += f; arrPoint.x += Vx; arrPoint.y += Vy; if (arrPoint.x > 350) { arrPoint.splice(i, 1); arrColor.splice(i, 1); arrVx.splice(i, 1); arrVy.splice(i,1); } }else { arrPoint.x += arrVx; var g:Number = Math.random() / 50; arrVy += g; arrPoint.y += arrVy; setColor(arrPoint.x, arrPoint.y, arrColor); } } bmpData.applyFilter(bmpData, new Rectangle(0, 0, 550, 400), new Point(0, 0), filter); } private function setColor(x:Number,y:Number,c:uint):void { bmpData.setPixel32(x,y,c); } } }
页:
[1]