[as2v8]水面波浪
效果复制内容到剪贴板
代码:
/*
import com_zszen.bitmap.wave;
new wave(mc, brush);
*/
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.filters.BlurFilter;
import flash.filters.ColorMatrixFilter;
import flash.filters.DisplacementMapFilter;
import com_zszen.base.Delegate;
class com_zszen.bitmap.wave {
function wave(mc:MovieClip, brush:MovieClip, pots:Object, offset:Number) {
if (mc != null && brush != null) {
var hx = pots.x;
var hy = pots.y;
var maxOffset:Number = offset == null || offset<=0 ? 50 : offset;
var mapWidth:Number = mc._width+maxOffset;
var mapHeight:Number = mc._height+maxOffset;
var bd:BitmapData = new BitmapData(mapWidth, mapHeight, true, 0);
var m:Matrix = new Matrix(1, 0, 0, 1, maxOffset/2, maxOffset/2);
bd.draw(mc, m);
//填充色块
var neutralMap:BitmapData = bd.clone();
//4.286612E+009 暗黄色
neutralMap.fillRect(neutralMap.rectangle, 4286612000);
//建立效果的区域
var canvas_holder:MovieClip = mc._parent.createEmptyMovieClip(mc+"canvas_holder", 0);
var canvas:BitmapData = bd.clone();
canvas_holder.attachBitmap(canvas, 0);
canvas_holder._x = hx-maxOffset/2;
canvas_holder._y = hy-maxOffset/2;
//绘制效果区域
var brushbd1:BitmapData = bd.clone();
//4.294967E+009 淡黄色
brushbd1.fillRect(brushbd1.rectangle, 4294967000);
//置换位移
var pot:Point = new Point(0, 0);
var displaceMap:BitmapData = bd.clone();
var displace:DisplacementMapFilter = new DisplacementMapFilter(displaceMap, pot, 1, 2, maxOffset, maxOffset, "color", 0, 0);
//其他
var offsets:Array = new Array();
var steps:Array = new Array();
var octaves:Number = 3;
var i:Number = 0;
while (i<octaves) {
offsets.push(new Point(100*Math.random(), 100*Math.random()));
steps.push(new Point(8*Math.random()-4, 8*Math.random()-4));
++i;
}
var brushbd2:BitmapData = bd.clone();
var ox:Number = _xmouse;
var oy:Number = _ymouse;
var speed:Number = 0;
canvas_holder.onEnterFrame = Delegate.create(this, waveEnterFrame, {bd:bd, brushbd1:brushbd1, brushbd2:brushbd2, neutralMap:neutralMap, canvas:canvas, displaceMap:displaceMap, m:m, displace:displace, pot:pot, canvas_holder:canvas_holder, brush:brush, offsets:offsets, steps:steps, octaves:octaves, brushbd2:brushbd2, ox:ox, oy:oy, speed:speed});
}
}
function waveEnterFrame(obj) {
var dx = obj.ox-_xmouse;
var dy = obj.oy-_ymouse;
obj.speed = (Math.sqrt(dx*dx+dy*dy)/20+obj.speed)/2;
obj.ox = _xmouse;
obj.oy = _ymouse;
obj.m = new Matrix(obj.speed, 0, 0, obj.speed, _xmouse-obj.canvas_holder._x, _ymouse-obj.canvas_holder._y);
obj.brushbd1.draw(obj.brush, obj.m, null, "multiply");
obj.brushbd1.applyFilter(obj.brushbd1, obj.brushbd1.rectangle, obj.pot, new BlurFilter(8, 8, 1));
obj.brushbd1.applyFilter(obj.brushbd1, obj.brushbd1.rectangle, obj.pot, new ColorMatrixFilter([1, 0, 0, 0, 3, 0, 1, 0, 0, 3, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0]));
obj.brushbd2.copyChannel(obj.brushbd1, obj.brushbd1.rectangle, obj.pot, 1, 8);
obj.displaceMap.perlinNoise(48, 48, obj.octaves, 12345, false, true, 3, false, obj.offsets);
obj.displaceMap.copyPixels(obj.neutralMap, obj.neutralMap.rectangle, obj.pot, obj.brushbd2, obj.pot, true);
obj.canvas.applyFilter(obj.bd, obj.bd.rectangle, obj.pot, obj.displace);
for (var i = 0; i<obj.octaves; ++i) {
obj.offsets[i] = obj.offsets[i].add(obj.steps[i]);
}
}
}