打印

[编程] 逼真的水波纹效果

水波纹效果
打开后用在画面上单击鼠标,或按住鼠标左键不放在画面上划过就会出现圈圈涟漪和波纹,非常美丽,跟真的水面一样,非常漂亮。
一、设置舞台大小(256×256)。
二、导入图片到库。不要导入到舞台。
三、打开库设置图片链接。标识符为:surface。将“为运行时导入”勾去掉,勾上“为actionscript 导出”和“在第一帧导出”
四、在第一帧插入动作代码。
var damper = new flash.display.BitmapData(128, 128, false, 128);
var result = new flash.display.BitmapData(128, 128, false, 128);
var result2 = new flash.display.BitmapData(256, 256, false, 128);
var source = new flash.display.BitmapData(128, 128, false, 128);
var buffer = new flash.display.BitmapData(128, 128, false, 128);
var output = new flash.display.BitmapData(256, 256, true, 128);
var surface = flash.display.BitmapData.loadBitmap("surface");
var bounds = new flash.geom.Rectangle(0, 0, 128, 128);
var origin = new flash.geom.Point();
var matrix = new flash.geom.Matrix();
var matrix2 = new flash.geom.Matrix();
matrix2.a = matrix2.d = 2;
var wave = new flash.filters.ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9, 0);
var damp = new flash.geom.ColorTransform(0, 0, 9.960937E-001, 1, 0, 0, 2, 0);
var water = new flash.filters.DisplacementMapFilter(result2, origin, 4, 4, 48, 48, "ignore");
attachBitmap(output, 0);
var ms = getTimer();
var frame = 0;
var mouseDown = false;
onMouseDown = function ()
{
    mouseDown = true;
};
onMouseUp = function ()
{
    onEnterFrame();
    mouseDown = false;
};
onEnterFrame = function ()
{
    if (mouseDown)
    {
        var _loc2 = _xmouse / 2;
        var _loc1 = _ymouse / 2;
        source.setPixel(_loc2 + 1, _loc1, 16777215);
        source.setPixel(_loc2 - 1, _loc1, 16777215);
        source.setPixel(_loc2, _loc1 + 1, 16777215);
        source.setPixel(_loc2, _loc1 - 1, 16777215);
        source.setPixel(_loc2, _loc1, 16777215);
    } // end if
    result.applyFilter(source, bounds, origin, wave);
    result.draw(result, matrix, null, "add");
    result.draw(buffer, matrix, null, "difference");
    result.draw(result, matrix, damp);
    result2.draw(result, matrix2, null, null, null, true);
    output.applyFilter(surface, new flash.geom.Rectangle(0, 0, 256, 256), origin, water);
    buffer = source;
    source = result.clone();
};
五、测试看看。点击flash,会一出现圈圈涟漪,效果非常真实。
漂亮! 谢谢lz分享。我机器上cpu占用率最高也就50%左右。看代码的时候还猜想会不会100%。。。完全多心了
很漂亮~!谢谢楼主~!
新手,请多指教。
漂亮,挺唬人的。
> If they can put poisonous things into baby food and make them die (I think they know it would), suppose how much "damn" they will give while doing anything ...

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
相当不错!顶楼主!

TOP

很像很像,~要了,谢谢搂主~

TOP

....这不是从那个原文件直接用闪客精灵提取出来的吗  一个字都没差
发的话也要有点专业精神 把闪客精灵到导出的注释去掉 把FLASH8里的新类import一下吧

TOP

呵呵,我也贡献一个类似的。大家娱乐。   

[ 本帖最后由 markmaoji 于 2006-12-26 14:48 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
> If they can put poisonous things into baby food and make them die (I think they know it would), suppose how much "damn" they will give while doing anything ...

TOP

这个只适合小图,大图的话会卡的

TOP

效果很逼真,问一下如果要想在元件上使用这个效果而不是位图上应该怎么写?
如果仅仅是为了结局,那我们可以从出生直接走到死亡www.5656666.com

TOP

这个是Andre Michelle写的。
我这有一个完整的版本:
复制内容到剪贴板
代码:
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.utils.getTimer;
    import flash.text.TextFormat;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.filters.DisplacementMapFilter;
    public class Water extends Sprite
    {
        private const double: Matrix = new Matrix( 2, 0, 0, 2, 0, 0 );
        private const origin: Point = new Point();
        //-- wavemap size
        private var xMax: int;
        private var yMax: int;
        //-- 2 wavemaps over time
        private var wave0: BitmapData;
        private var wave1: BitmapData;
        private var result: BitmapData;
        private var displace: BitmapData;
        private var output: BitmapData;
        private var mouseDown: Boolean;
        private var source: BitmapData;
        private var water: DisplacementMapFilter;
        //-- fps
        private var fpsText: TextField;
        private var fr: int;
        private var ms: int;
        public function Water()
        {
            stage.scaleMode = 'noScale';
                                                trace("8 >> 1 ="+(8 >> 1))
            xMax = stage.stageWidth >> 1;
            yMax = stage.stageHeight >> 1;
            wave0 = new BitmapData( xMax, yMax, false, 0x808080 );
            wave1 = new BitmapData( xMax, yMax, false, 0x808080 );
            wave0.lock();
            wave1.lock();
            //-- waveresult
            result = new BitmapData( xMax, yMax, false, 0x80 );
            result.lock();
            output = new BitmapData( xMax << 1, yMax << 1, false, 0x80 );
            //-- displacementmap result*2
            displace = new BitmapData( xMax << 1, yMax << 1, false, 0x80 );
            addChild( new Bitmap( output ) );
            //-- source
            var so:Source=new Source();
            source = new BitmapData(so.width,so.height,false,0x80);
            source.draw(so);
            water = new DisplacementMapFilter( displace, origin, 4, 4, 48, 48 );
            mouseDown = false;
            //-- init fps
            ms = getTimer();
            fr = 0;
            var ft: TextFormat = new TextFormat();
            ft.size = 10;
            ft.bold = true;
            ft.font = 'Verdana';
            fpsText = new TextField();
            fpsText.autoSize = 'left';
            fpsText.textColor = 0x00000;
            fpsText.defaultTextFormat = ft;
            addChild( fpsText );
            //-- inject events
            stage.addEventListener( 'enterFrame', updateWave );
            stage.addEventListener( 'mouseDown', onMouseDown );
            stage.addEventListener( 'mouseUp', onMouseUp );
        }
        private function onMouseDown( event: MouseEvent ): void
        {
            mouseDown = true;
        }
        private function onMouseUp( event: MouseEvent ): void
        {
            mouseDown = false;
        }
        private function updateWave( event: Event ): void
        {
            if( mouseDown )
            {
                // trigger wave
                wave0.setPixel( mouseX >> 1, mouseY >> 1, 0xffffff );
            }
            var x: int;
            var y: int = yMax - 1;
            var n: int;
            var c: int;
            while( --y )
            {
                x = xMax - 1;
                while( --x )
                {
                    //-- wave kernel
                    n = (
                        wave0.getPixel( x - 1, y ) +
                        wave0.getPixel( x + 1, y ) +
                        wave0.getPixel( x, y + 1 ) +
                        wave0.getPixel( x, y - 1 ) >> 1 ) - wave1.getPixel( x, y );
                    //-- damp the wave
                    n += ( 0x808080 - n ) >> 7;
                    if( n < 0 ) n = 0;
                    wave1.setPixel( x, y, n );
                    //-- draw result
                    result.setPixel( x, y, n >> 16 );
                }
            }
            displace.draw( result, double, null, null, null, true );
            output.applyFilter( source, source.rect, origin, water );
            //-- flip
            var wt: BitmapData = wave0;
            wave0 = wave1;
            wave1 = wt;
            //-- fps
            fr++;
            if( ms + 1000 < getTimer() )
            {
                fpsText.text = fr.toString();
                fr = 0;
                ms = getTimer();
            }
        }
    }
}
[ 本帖最后由 haxe 于 2006-12-27 12:01 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!

TOP

markmaoji 和 haxe  发的两个cpu占用都达到100%   谢谢分享。
有时间再研究一下怎么把资源占用降下来。

TOP

谢谢支持,希望给大家真的带来帮助

TOP

谢谢!很不错,收了
//对你所追求的事物一定要执著
www.lukee.cn
中国.北京

TOP

你知道怎么改变画布大小不?

你知道怎么改变画布大小,就是说那个图片随着画布的增大而增大。

TOP

你说的是swf文件,动画随着屏幕大小改变而改变吗?
如果是这样的话,应该用fscommand就可以控制了吧
fscommand("allowscale",true)

TOP

楼主这个效果不错

但是HAXE那个 会报错 我是用FLASH8的

报:
**错误** 符号=sou, 图层=Layer 1, 帧=1:第 1 行: 无法加载类或接口'Source'
ActionScript 错误总数:1         报错:1

初学AS 还要跟各位前辈多多学习!

TOP

效果挺好,收藏了......
人一天一天的老,心一天一天的碎!
继续学习,直到。。。。。

TOP

帅啊,收藏了,多谢!

TOP

呵呵,自己顶一下

TOP

谁能分析一下这种动画的原理啊?

TOP

很帅`

可是米看明白..

想不明白 `

TOP

哈哈哈哈

TOP


为什么点不到动作那个选项

TOP

我这个是用FLASH8做的,可能是版本的问题吧

TOP

TOP

回复 #26 yukineco 的帖子

那是英文呀,看不懂,唉,看来得去学习一下英语再来看了

TOP

回复 #8 markmaoji 的帖子

兄弟:你这个也不错啊

TOP

真棒,我试着做了一个。

http://mdjjck.h194.98dns.com/1.swf

[ 本帖最后由 mdjjck 于 2007-1-10 09:35 编辑 ]

TOP

回复 #29 mdjjck 的帖子

不错啊,呵呵

TOP