发新话题
打印

[编程] [as2v8]水面波浪效果

[as2v8]水面波浪效果

[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]);
  }
}
}

附件

wave.swf (2.71 KB)

2007-7-2 09:34, 下载次数: 636

wave.zip (11.07 KB)

2007-7-2 09:34, 下载次数: 362

SpxImage1.jpg (11.08 KB)

2007-7-2 09:34

SpxImage1.jpg

54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

效果很不错啊
只是太耗资源,我的电脑资源占用率为80%,要是能改“轻”些就好。
一个在创业中flash programmer,支持的来顶一下:
http://www.topven.com

TOP

好的视觉效果就是100%吃资源!
不知什么时候,开始和你在梦里头接触……

TOP

拿了。.喜欢这效果...

TOP

借看,谢谢``

TOP

在我这,10m内存,18%CPU...
看这个代码的原理跟上次在flash技术讨论版块发过的一个水波效果看来是一样的

当时还参照代码用as3做了个头像

[ 本帖最后由 neutra 于 2007-9-14 00:07 编辑 ]

附件

Face.swf (8.16 KB)

2007-9-5 21:51, 下载次数: 154

Face.swf (1.74 KB)

2007-9-14 00:06, 下载次数: 103

TOP

收下了.谢谢LZ了

TOP

如果把它用在页面上那多好啊, 美`~~~~~

TOP

这个占内存的大小要看 bitmap的范围的, 因为flash里面最占内存的就是bitmap了~

TOP

这个代码应该怎么用呢?

我是个新手,请问这个代码应该怎么用呢?放在flash的什么地方?请指教谢谢

TOP

效果是不错的。我喜欢

TOP

这个水波做得好.

TOP

回复 #1 zszen 的帖子

强.收下,看来高手还是高手.请问楼主这些都自已平时钻研出来的啊.
想闪就闪

TOP

TOP

两个字
PF

TOP

学习中....

TOP

发新话题