最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 网络设计学院 > Flash教程

Flash中水的形成思路和方法

日期:09-26    来源:中国设计秀    作者:cnwebshow.com

很多朋友对水的效果情有独钟,水的形成其实是因为光在波面上形成折射,使看上去水波的地方产生了偏移。FgY中国设计秀

用flash实现水的效果,方法很多,我这里提供一个比较简单的方法和思路,因为本人比较懒,图文兼备就免了,代码+注释,大家仔细看看,不懂的地方再一起讨论,我也是新接触flash8,还有不对的地方,高手多多指出,OK.GoFgY中国设计秀

import flash.display.BitmapData; FgY中国设计秀
import flash.geom.Point; FgY中国设计秀
import flash.geom.Rectangle; FgY中国设计秀
import flash.filters.DisplacementMapFilter; FgY中国设计秀
// FgY中国设计秀
// 加载位图元素 FgY中国设计秀
var image:BitmapData = BitmapData.loadBitmap("image"); FgY中国设计秀
// 取得位图元素的宽和高 FgY中国设计秀
var W:Number = image.width; FgY中国设计秀
var H:Number = image.height; FgY中国设计秀
// 设置原点为(0,0) FgY中国设计秀
var origin:Point = new Point(); FgY中国设计秀
// 设置范围是一个从(0,0)开始到(W,H)的一个范围 FgY中国设计秀
var bound:Rectangle = new Rectangle(0,0,W,H); FgY中国设计秀
// 以上这些参数是等下用在滤镜等一些效果操作的参数内的 FgY中国设计秀
// 目的是要固定好这些效果的影响范围 FgY中国设计秀
// ------------------------------------------------ FgY中国设计秀
// 创建一个空位图元素,用来模拟’水’ FgY中国设计秀
var water:BitmapData = new BitmapData(W,H); FgY中国设计秀
// 创建一个空的mc,用来加载位图元素显示于屏幕上 FgY中国设计秀
var output:MovieClip = _root.createEmptyMovieClip("output",0); FgY中国设计秀
// 设置一下mc的偏移,为什么?等下介绍 FgY中国设计秀
output._x = output._y=-50; FgY中国设计秀
// 加载位图元素image FgY中国设计秀
output.attachBitmap(image, 0); FgY中国设计秀
// 以上是创建一些必要的位图元素和显示位图的mc FgY中国设计秀
// ------------------------------------------------------ FgY中国设计秀
// 这个是测试用的,感兴趣的可以把画面放大就可以 FgY中国设计秀
// 看到’水’的样子 FgY中国设计秀
var display:MovieClip = _root.createEmptyMovieClip("display",1); FgY中国设计秀
display.attachBitmap(water,0); FgY中国设计秀
display._x = W; FgY中国设计秀
// -------------------------------------------- FgY中国设计秀
// 创建一个DisplacementMapFilter FgY中国设计秀
// 关于这个滤镜,其实就是可以通过一个固定公式 FgY中国设计秀
// 让一张位图上的象素产生偏移,这个公式帮助里面有,大家尽量多看帮助 FgY中国设计秀
var dmf:DisplacementMapFilter = new DisplacementMapFilter(); FgY中国设计秀
// 以下就是设置,影响的位图是上面定义的water FgY中国设计秀
// 起点是之前定义的原点origin FgY中国设计秀
// 还有一些公式里面用到的参数 (多看帮助,多看帮助) FgY中国设计秀
dmf.mapBitmap = water; FgY中国设计秀
dmf.mapPoint = origin; FgY中国设计秀
dmf.componentX = 1; FgY中国设计秀
dmf.componentY = 1; FgY中国设计秀
dmf.scaleX = 45; FgY中国设计秀
dmf.scaleY = 45; FgY中国设计秀
dmf.mode = "color"; FgY中国设计秀
// 这个就是保存一个路径到数组,等下供mc使用 FgY中国设计秀
var myFilters:Array = [ dmf ]; FgY中国设计秀
// 以上等一的一些滤镜,作用是用来把water位图元素中的数据过滤到 FgY中国设计秀
// image位图元素中,从而使image产生water一样的感觉,大家也看出来了 FgY中国设计秀
// water的好坏,直接影响最后image出来的水的效果 FgY中国设计秀
// ---------------------------------------------------- FgY中国设计秀
// 下面一些参数等下会用到 FgY中国设计秀
var rndSeed:Number = new Date().getTime(); FgY中国设计秀
var offsets:Point = new Point(0,0); FgY中国设计秀
var speed:Number = 1; FgY中国设计秀
var inc:Number = 5; FgY中国设计秀
// ---------------------------------------------------- FgY中国设计秀
onEnterFrame = function() FgY中国设计秀
{ FgY中国设计秀
// 以下一些是产生加速度移动的效果,可以忽律,直接使用 FgY中国设计秀
// 匀速移动就行了 FgY中国设计秀
inc += speed; FgY中国设计秀
if( inc > 12 ) FgY中国设计秀
{ FgY中国设计秀
inc = 12; FgY中国设计秀
speed = -speed; FgY中国设计秀
} FgY中国设计秀
else if ( inc < 5 ) FgY中国设计秀
{ FgY中国设计秀
inc = 5; FgY中国设计秀
speed = -speed; FgY中国设计秀
} FgY中国设计秀
// 上面的速度就是影响,x,y的偏移,到底xy是哪里的呢,往下看 FgY中国设计秀
offsets.x += inc; FgY中国设计秀
offsets.y += inc; FgY中国设计秀
// 这里就是形成water的关键,也就是BitmapData里面的perlinNoise方法 FgY中国设计秀
// 这个方法,其实实现的是一个类似Photoshop里面"云雾"的滤镜(不知道是不是叫这名字-_-) FgY中国设计秀
// 里面的一些参数,大家看帮助,说的很仔细.. FgY中国设计秀
// 上面的offsets就是让这个"云雾"移动起来! FgY中国设计秀
water.perlinNoise(300,300,1, rndSeed, false, false, 1, true, offsets); FgY中国设计秀
// 最后把output的滤镜一下就完成了 FgY中国设计秀
output.filters = myFilters; FgY中国设计秀
// 到此,我还没有介绍output为什么有个偏移量 FgY中国设计秀
// 其实这是displacementMapFilter造成的 FgY中国设计秀
// 原因是使用了这个滤镜后,整个被过滤的位图元素会发生偏移 FgY中国设计秀
// 偏移多少,由他里面的参数决定,所以大致要弥补一下这个偏移 FgY中国设计秀
// 所以随便设置个数字啦,呵呵 FgY中国设计秀
}FgY中国设计秀

  下面是效果和源文件,可能看上去不太像水波~_~!...我也这么觉得,更像旗子飘啊飘的.但其实大致思路还是讲清了.FgY中国设计秀

  主要就是DisplacementMapFilter类和perlinNosie方法FgY中国设计秀

  前者可以让一个位图元素发生偏移,这样就可以模拟光在波面的折射FgY中国设计秀

  后者是在一张空白的位图上,产生"云雾"的纹路来模拟水的纹路.FgY中国设计秀

  但是要完全逼真,还是看头上的教程,然后用flash8里面提供的滤镜来模拟数学建模,这一点还是比较复杂的FgY中国设计秀

(需要在flash8 player下才能看到效果)FgY中国设计秀
 FgY中国设计秀

FgY中国设计秀