制造一个水波的效果主要可以使用sin()或cos()产生的波形用公式转化,用惯了director的copyPixels再用as3是有点不习惯的,总结几点
1、要使用alphaBitmapData实现maskImage,blendLevel 比如:
var alphaimg:BitmapData = new BitmapData(400, 300, true, 0xff000000);
buffer.copyPixels(bmp,rects,pts,alphaimg,null,true);
2、使用matrix实现rectangle or quad to rectangle;
3、as3里面可以使用generateFilterRect更容易达到更多的视觉效果;
例子如下:
代码如下:
package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.net.URLRequest;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Rectangle;
public class water extends Sprite {
var bmp:BitmapData = new BitmapData(400, 300, false, 0x000000);
var buffer:BitmapData = new BitmapData(400, 300, false, 0x000000);
var stagepic:Bitmap;
var simg:Bitmap;
var maxrects:int;
var r_h:Number;
var rect_h:Number;
var rect_y:Number;
var step:Number;
public function water() {
var sloader:Loader = new Loader();
sloader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
sloader.load(new URLRequest("http://blog.5d.cn/images/zq02.jpg"));
}
function completeHandler(event:Event):void {
simg = event.currentTarget.content as Bitmap;
stagepic =new Bitmap(bmp);
addChild(stagepic);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(event:Event):void {
maxrects=Math.random()*300;
r_h=300/maxrects;
step=Math.random();
bmp.draw(simg);
rect_y=0;
for (var i:int=1; i < maxrects+1; i++) {
if (i%2==0){
rect_h=r_h*((1+Math.sin(step))/1)
}else{
rect_h=r_h*((1+Math.sin(Math.PI/2+step))/1)
}
var rects:Rectangle = new Rectangle(0, rect_y,400, rect_h);
var pts:Point = new Point(0, rect_y);
buffer.copyPixels(bmp,rects,pts);
rect_y=rect_y+rect_h;
}
bmp.draw(buffer);
}
}
}