Flash中水的形成思路和方法

  很多朋友对水的效果情有独钟,水的形成其实是因为光在波面上形成折射,使看上去水波的地方产生了偏移,这里有篇不错的教程讲如何实现水波和折射,不过可能比较难,因为牵涉到很多数学,物理和计算机图形的知识.

  而且上面的教程真的要在flash里面实现,也是不可能的,大家都知道flash的执行效率,^^,不过flash8里面支持了滤镜和位图,所以可以抛开数学建模,直接使用滤镜来模拟.

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

import flash.display.BitmapData;
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里面提供的滤镜来模拟数学建模,这一点还是比较复杂的,这里有一个高手就做到了...hoho,强啊

  (需要在flash8 player下才能看到效果)

时间: 2024-10-11 00:23:48

Flash中水的形成思路和方法的相关文章

Flash中加载外部文件的方法_Flash As

Flash可以通过帧.按扭.影片剪辑来调用外部文件.调用的外部文件包括:外部文本文件.外部程序文件.外部*.swf文件.外部图片文件.外部音乐文件.外部脚本文件 .现总结如下: [loadMovieNum()函数] [用法]:loadMovieNum("url",level [, variables])  [功能]: 函数:在播放原来加载的 SWF 文件的同时将 SWF 文件或 JPEG 文件加载到 Flash Player 中的某个级别.  [参数]:首先我们可以看到该函数有3个参数

Flash中关于圆的设计的探讨

设计 原创教程,转载请注明出处:网页教学网 在这里我给大家介绍一下FLASH中关于圆的设计的方法,在这里我给大家介绍两种制作 特殊效果的圆的方法. 我们在做圆的时候通常是使用FLASH提供的圆的工具来设计,如图: 我们通过上面的设置就可以轻松的绘制出一个圆形了. 但是如果要设计如下图所示的圆呢?Flash就没有了现成的工具了. 当然用其它的作图软件可以绘制出如图所示的圆而且方法很多,现在我们来讨论在 Flash中制作出如图示的圆的效果的方法,如果大家有什么其他好的方法可以和我共同讨论学 习. 下

在FLASH动画中打开任何格式文件的方法

flash动画 在FLASH中,大家可以调用以下语句来打开文件.该方法简单,但存在一个很大的缺陷.就是只能打开可执行文件: flcommand("exec",""); 既然可以打开可执行文件,那是不是可以通过打开一个可执行文件A,然后再用A来打开我们想打开的文件呢?下面,我们就可以使用bat文件来做这个可执行文件A吧. 1.在FLASH中的ACTIONSCRIPT中写入以下语句: on(release){fscommand("exec",&quo

Flash中MP3导入及同步歌词的方法

了解音乐的几种常见格式: 1.mp3(mpeg-1 audio layer 3): 能够以高音质.低采样率对数字音频文件进行压缩.换句话说,音频文件(主要是大型文件,比如WAV文件)能够在音质丢失很小的情况下(人耳根本无法察觉这种音质损失)把文件压缩到更小的程度. 2. wma(windows media audio):是微软在互联网音频.视频领域的力作.常常用于在线收听和广播的首选,wma格式是以减少数据流量但保持音质的方法来达到更高的压缩率目的,其压缩率一般可以达到1:18. 3. wav

FLASH中的移动方法教程和实例集锦

教程 欢迎转载,敬请注明来源--闪吧和作者---sxl001---QQ:285510591在此只探讨用AS语句去控制移动的方法.FLASH中能够移动的物体一般是舞台上的电影实例(为节省篇幅以下简称为MC,并且其实例名为my_mc).FLASH中物体的移动是在X轴(即水平)方向或Y轴(垂直)方向的运动.因此,通过控制mc属性中的_x与_y的值就可以达到使其运动的目的.一.匀速运动1.水平方向上的向右匀速运动 方法一:主场景第1帧:var mx=5;//设定初始速度为5主场景第2帧:my_mc._x

Flash中实现物体运动的三种方法

现在用Flash开发的游戏是越来越多了.很多朋友也很想学习用Flash制作游戏的方法.大家知道,不管在什么游戏中,实现物体的运动是游戏的前提,而不同的游戏里物体移动的方式又不尽相同.所以,想学习制作Flash游戏的朋友今天就先随我一起学学在Flash中实现物体运动的几种方法吧.几种方法如下: 方法一:通过单击按钮实现物体的单位运动 这种方法一般在需要按键的游戏中使用.你也可以给某个实体加上这段代码,然后通过单击这个实体达到某种游戏效果. 1.打开Flash,按快捷键"Ctrl + M"

Flash中调用外部文本文件的两种方法

方法一:利用上下滚动按钮 1.打开文本文件,将文本复制到Windows 2000自带的程序"记事本"中,并在文本内容的前面输入"t="("t"为我们定义的一个变量),然后保存为"m.txt"文件,保存位置为"我的文档",编码设为"UTF-8"或"Unicode". 2.运行Flash MX,以"也谈在Flash中调用外部文本文件"为名,保存在&qu

让字体在FLASH中保持清晰的方法

 都知道 当Flash显示静态文本的时候,文字就显得很模糊,中间甚至粘成一块,解决的办法有3个. 1) 使用设备字体 当你在flash中使用静态文本的时候,Flash会插入字体轮廓信息,并进行抗锯齿处理,所以轮廓会显得很模糊,使用设备字体后,Flash不再插入字体轮廓信息,只是在客户端播放时调用客户端的字体信息,也不会进行抗锯齿处理,这样的做结果有: a. 字体在12pt以下时很清晰,但在比较大(大约18pt以上)时有明显的锯齿. b. 如果客户端不存在相应的字体,则显示会出现预料外的情况,肯定

一种自动化检测Flash中XSS方法的探讨

0x00 前面的话对于如何检测Flash 中的XSS,每个人都有自己的方法,无论是使用成型的自动化工具(比如 swfscan)还是自己开发自动化工具(先反编译,再对 actionscript 代码审计)还是直接人工对代码进行审计.都能够检测到 Flash 中存在的 XSS 漏洞. 但是这些方法会存在一些问题,如:自动化工具属于静态分析,误报比较高,需要投入 大量人工精力去加以分析完全人工效果 最好,但是也更加耗费精力在这里我们来探讨一种动态检测 Flash 中 XSS 的方法,该方法有自己的 优