AS3 水波效果

原文:http://bbs.9ria.com/thread-12480-1-3.html

2008年的贴子,感觉是非常不错的。

代码:

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.filters.ConvolutionFilter;
	import flash.filters.DisplacementMapFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	[SWF(frameRate='24',backgroundColor="0xffffff",width="226",height="168")]
	public class WaterWave extends Sprite
	{
//		private var url:String = "waterwave.jpg";
		private var url:String = "res/test.jpg";
		private var mouseDown:Boolean = false;
		//
		private var damper:BitmapData;
		private var result:BitmapData;
		private var result2:BitmapData;
		private var source:BitmapData;
		private var buffer:BitmapData;
		private var output:BitmapData;
		private var surface:BitmapData;
		private var bounds:Rectangle;
		private var origin:Point;
		private var matrix:Matrix;
		private var matrix2:Matrix;
		private var wave:ConvolutionFilter;
		private var damp:ColorTransform;
		private var water:DisplacementMapFilter;
		//
		private var imgW:Number = 226;
		private var imgH:Number = 168;
		public function WaterWave(){
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			super();
			damper = new BitmapData(imgW, imgH, false, 128);
			result = new BitmapData(imgW, imgH, false, 128);
			result2 = new BitmapData(imgW*2, imgH*2, false, 128);
			source = new BitmapData(imgW, imgH, false, 128);
			buffer = new BitmapData(imgW, imgH, false, 128);
			output = new BitmapData(imgW*2, imgH*2, true, 128);
			bounds = new Rectangle(0, 0, imgW, imgH);
			origin = new Point();
			matrix = new Matrix();
			matrix2 = new Matrix();
			matrix2.a = matrix2.d=2;
			wave = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9, 0);
			damp = new ColorTransform(0, 0, 9.960937E-001, 1, 0, 0, 2, 0);
			water = new DisplacementMapFilter(result2, origin, 4, 4, 48, 48, "ignore");
			var _bg:Sprite = new Sprite();
			this.addChild(_bg);
			_bg.graphics.beginFill(0xFFFFFF,0);
			_bg.graphics.drawRect(0,0,imgW,imgH);
			_bg.graphics.endFill();
			this.addChild(new Bitmap(output));
			this.buildImg();
		}
		private function mouseDownHandle(_e:MouseEvent):void{
			mouseDown = true;
		}
		private function mouseUpHandle(_e:MouseEvent):void{
			mouseDown = false;
		}
		private function frameHandle(_e:Event):void{
			if (mouseDown) {
				var _x:Number = this.mouseX/2;
				var _y:Number = this.mouseY/2;
				source.setPixel(_x+1, _y, 16777215);
				source.setPixel(_x-1, _y, 16777215);
				source.setPixel(_x, _y+1, 16777215);
				source.setPixel(_x, _y-1, 16777215);
				source.setPixel(_x, _y, 16777215);
			}
			// end if           
			result.applyFilter(source, bounds, origin, wave);
			result.draw(result, matrix, null, BlendMode.ADD);
			result.draw(buffer, matrix, null, BlendMode.DIFFERENCE);
			result.draw(result, matrix, damp);
			result2.draw(result, matrix2, null, null, null, true);
			output.applyFilter(surface, new Rectangle(0, 0, imgW*2, imgH*2), origin, water);
			buffer = source;
			source = result.clone();
		}
		private function buildImg():void {
			var loader:Loader = new Loader();
			loader.contentLoaderInfo        .addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
			var request:URLRequest = new URLRequest(url);
			loader.load(request);
		}
		private function loadHandler(event:Event):void {
			var child:DisplayObject = DisplayObject(event.target.loader);
			surface = new BitmapData(imgW,imgH,true);
			surface.draw(child,null,null,null,null,true);
			this.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandle);
			this.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandle);
			this.addEventListener(Event.ENTER_FRAME,frameHandle);
		}
		private function ioErrorHandler(event:IOErrorEvent):void {
			trace("Unable to load image: " + url);
		}
	}
}


运行效果:


原图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值