Flash中水的形成思路和方法
2008-04-02 11:00:38来源:互联网 阅读 ()
很多朋友对水的效果情有独钟,水的形成其实是因为光在波面上形成折射,使看上去水波的地方产生了偏移。
用flash实现水的效果,方法很多,我这里提供一个比较简单的方法和思路,因为本人比较懒,图文兼备就免了,代码 注释,大家仔细看看,不懂的地方再一起讨论,我也是新接触flash8,更有不对的地方,高手多多指出,OK.Go
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.filters.DisplacementMapFilter;
//
// 加载位图元素
var image:BitmapData = BitmapData.loadBitmap("image");
// 取得位图元素的宽和高
var W:Number = image.width;
var H:Number = image.height;
// 配置原点为(0,0)
var origin:Point = new Point();
// 配置范围是个从(0,0)开始到(W,H)的一个范围
var bound:Rectangle = new Rectangle(0,0,W,H);
// 以上这些参数是等下用在滤镜等一些效果操作的参数内的
// 目的是要固定好这些效果的影响范围
// ------------------------------------------------
// 创建一个空位图元素,用来模拟’水’
var water:BitmapData = new BitmapData(W,H);
// 创建一个空的mc,用来加载位图元素显示于屏幕上
var output:MovieClip = _root.createEmptyMovieClip("output",0);
// 配置一下mc的偏移,为什么?等下介绍
output._x = output._y=-50;
// 加载位图元素image
output.attachBitmap(image, 0);
// 以上是创建一些必要的位图元素和显示位图的mc
// ------------------------------------------------------
// 这个是测试用的,感兴趣的能够把画面放大就能够
// 看到’水’的样子
var display:MovieClip = _root.createEmptyMovieClip("display",1);
display.attachBitmap(water,0);
display._x = W;
// --------------------------------------------
// 创建一个DisplacementMapFilter
// 关于这个滤镜,其实就是能够通过一个固定公式
// 让一张位图上的象素产生偏移,这个公式帮助里面有,大家尽量多看帮助
var dmf:DisplacementMapFilter = new DisplacementMapFilter();
// 以下就是配置,影响的位图是上面定义的water
// 起点是之前定义的原点origin
// 更有一些公式里面用到的参数 (多看帮助,多看帮助)
dmf.mapBitmap = water;
dmf.mapPoint = origin;
dmf.componentX = 1;
dmf.componentY = 1;
dmf.scaleX = 45;
dmf.scaleY = 45;
dmf.mode = "color";
// 这个就是保存一个路径到数组,等下供mc使用
var myFilters:Array = [ dmf ];
// 以上等一的一些滤镜,作用是用来把water位图元素中的数据过滤到
// image位图元素中,从而使image产生water相同的感觉,大家也看出来了
// water的好坏,直接影响最后image出来的水的效果
// ----------------------------------------------------
// 下面一些参数等下会用到
var rndSeed:Number = new Date().getTime();
var offsets:Point = new Point(0,0);
var speed:Number = 1;
var inc:Number = 5;
// ----------------------------------------------------
onEnterFrame = function()
{
// 以下一些是产生加速度移动的效果,能够忽律,直接使用
// 匀速移动就行了
inc = speed;
if( inc > 12 )
{
inc = 12;
speed = -speed;
}
else if ( inc < 5 )
{
inc = 5;
speed = -speed;
}
// 上面的速度就是影响,x,y的偏移,到底xy是哪里的呢,往下看
offsets.x = inc;
offsets.y = inc;
// 这里就是形成water的关键,也就是BitmapData里面的perlinNoise方法
// 这个方法,其实实现的是个类似Photoshop里面"云雾"的滤镜(不知道是不是叫这名字-_-)
// 里面的一些参数,大家看帮助,说的很仔细..
// 上面的offsets就是让这个"云雾"移动起来!
water.perlinNoise(300,300,1, rndSeed, false, false, 1, true, offsets);
// 最后把output的滤镜一下就完成了
output.filters = myFilters;
// 到此,我还没有介绍output为什么有个偏移量
// 其实这是displacementMapFilter造成的
// 原因是使用了这个滤镜后,整个被过滤的位图元素会发生偏移
// 偏移多少,由他里面的参数决定,所以大致要弥补一下这个偏移
// 所以随便配置个数字啦,呵呵
}
下面是效果和源文档,可能看上去不太像水波~_~!...我也这么觉得,更像旗子飘啊飘的.但其实大致思路还是讲清了.
主要就是DisplacementMapFilter类和perlinNosie方法
前者能够让一个位图元素发生偏移,这样就能够模拟光在波面的折射
后者是在一张空白的位图上,产生"云雾"的纹路来模拟水的纹路.
但是要完全逼真,还是看头上的教程,然后用flash8里面提供的滤镜来模拟数学建模,这一点还是比较复杂的
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: Flash版歌词秀
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash