设为首页  加入收藏  联系我们 繁體中文  

黑客软件:

  漏洞扫描 | 木马间谍 | 加密解密 | 远程控制 | 破坏攻击 | 杀毒软件 | 防火墙类 | OICQ专区 | 黑客必备 | 常用工具 | 网吧攻击
文章中心:   最新资讯 | 黑客技术 | 电脑基础 | 菜鸟文摘 | 网络安全 | 网络技巧 | QQ技巧 | OQ空间代码 | 免费资源 | 编程世界 | 建站技术
素材源码:   论坛相关 | ASP源码 | CGI 源码 | NET 源码 | PHP 源码 | 酷站素材 | 字体素材 | 图片素材 | 友情发布 | 网页模版 | 建站软件
教程动画:   黑客教程 | 黑客编程 | 网站入侵 | 菜鸟教程 | 入侵教程 | 破解教程 | 电子书籍 | 网页制作 | 高级会员 | 综合教程 | 本站原创


   

  您当前的位置:中华隐士黑客联盟 -> 电脑基础 -> Flash技术攻略 -> 文章内容 [站内搜索]  

 
Flash MX 编程深层次应用-高级特效(6)
作者:风未起时  来源:中国站长学院  发布时间:2006-11-16 12:27:39  发布人:www.hack86.com
3.3 虚幻特效(6)

    

3.3.2  天堂之云

云彩效果在Flash中也是非常麻烦、非常难制作的,这个在Flash 5时代很棘手的问题在Flash MX中可以通过编程来实现了。因为在Flash MX中有一个非常强大的渐变填充功能,让我们先看看这个渐变填充功能的说明吧(参考了fictiony自在幻想在闪客帝国论坛的有关帖子):

函数格式:

MovieClip.beginGradientFill (fillType, colors, alphas, ratios, matrix)

参数:

fillType:填充类型,可以为“linear”(线性填充)或者“radial”(辐射填充)两种。

colors:一个RGB颜色数值的数组,范围为0x0000000xffffff,用于指定渐变填充里所用到的组成颜色,这个数组有几项就说明填充有几种颜色。

alphas:填充中每一个组成颜色的透明度数值的数组,其范围是0100,如果其值小于0就默认为0,如果大于100就默认为100

ratios:一个颜色分配定量数组,范围为0255,用于指定每一个组成颜色所在的位置,最左端为0,最右端为255,中间按比例折算,它与Color Mixer面板中渐变色的组成有着相对应的地方。

在这里,colorsalphasratios都是一维数组,且数组的length值必须相等。

matrix:一个变形矩阵,它有两种形式。

第一种为标准3×3的二次变换矩阵,形式为:

       a, b, c

d, e, f

g, h, i

具体写的时候就写成{a:#, b:#, c:#, d:#, e:#, f:#, g:#, h:#, i:#},其中#表示具体的数值。这个矩阵每个元素的具体含义在计算机图形学中有,后面会具体解释。

第二种为缩放旋转变换矩阵,形式为:

       x, y   (中心点位置)

w, h   xy轴方向的缩放比例,原始大小为1像素)

 

具体写的时候就写成{matrixType:"box", x:#, y:#, w:#, h:#, r:#} r (旋转的角度,弧度单位,由于辐射填充本来就无角度,故这个参数只对线性填充有效)。这个矩阵具体给出了缩放的比例和旋转的角度,控制起来更直观些,但效率不高。Flash内部处理时会先转化成第一种的矩阵模式,以提高运算效率。在实际的填充过程中,如果wh的值比实际区域要大,则先根据wh值的区域填充然后再按实际的区域进行裁剪。

下面再扩充一下matrix这个参数的具体含义。

学过计算机图形学的人都知道二次变换矩阵的形式如下:

a, b, 0

d, e, 0

g, h, 1

 

一个坐标点(x0, y0),在经过二次变换(也就是缩放+旋转+移动)后,其坐标假设变成(x1, y1),那么x1y1的矩阵运算公式就是:

[x1, y1, 1] = [x0, y0, 1][[a, b, 0],[d, e, 0], [g, h, 1]]T

等价于:

[x1, y1, 1] = [x0×a+y0×d+1×g, x0×b+y0×e×1×h, x0×0+y0×0+1×1] = [ax0+dy0+g, bx0+ey0+h, 1]

matrix的第一种形式就是这个标准二次变换的矩阵,其中cfi三个参数其实可以随便设置,因为Flash内部会自动取001的值。 如果把二次变换的过程拆开,也就是把缩放、旋转和移动一步步进行,那么就成了第二种形式。这里假设x轴缩放比例为wy轴缩放比例为h,旋转度数(弧度)为r,移动的相对位置为(x,y)。那么这里的参数就和matrix第二种形式一一对应了。我们来看具体过程,假定先旋转,后缩放,最后移动。

首先旋转,那么就有:

[x1, y1] = [x0cos(r) + y0sin(r), x0sin(r) – y0cos(r)]

之后缩放,那么就有:

[x2, y2] = [x1w, y1h] = [wx0cos(r) + wy0sin(r), hx0sin(r) – hy0cos(r)]

之后移动,那么就有:

[x3, y3] = [x2+x, y2+y] = [wx0cos(r) + wy0sin(r) +x, hx0sin(r) – hy0cos(r) +y]

当我们把这两种模式所得到的结果进行对比就可以发现:

[ax0+dy0+g, bx0+ey0+h] = [wx0cos(r) + wy0sin(r) +x, hx0sin(r) – hy0cos(r) +y]

也就是有:

a = wcos(r)

b = hsin(r)

d = wsin(r)

e = –hcos(r)

g = x

h = y

但事实上,二次变换并没有限定缩放、旋转和移动的次数。也就是说,我们可以反复进行这些子变换,而最终得到一个对应关系。数学上已经证明,这样的子变换不论进行多少次,最后都能把坐标写成[ax0+dy0+g, bx0+ey0+h]的形式。所以第一种形式的matrix写法所能描述的范围要比第二种大。对于第二种形式,Flash内部的处理方式是和前面假定的方式一样:先旋转、后缩放、最后移动。这样我们就可以看到,对于辐射渐变来说,先旋转毫无意义,这也是为什么第二种形式无法设置辐射渐变的旋转角度的原因所在。

看看“自在幻想”给出的一个例子,用来显示两种形式的matrix之间的对比,可以看到,它们的效果(在某种程度上)是相同的:

http://no-e.net/friend/chinavane/fictiony/gradientfill.fla

http://no-e.net/friend/chinavane/fictiony/gradientfill.swf

(注:h加了200是为了让它的中心下移到和上面相对应的地方,不然两个色块的填充就重合了,看不出对照效果。)

好了,讲了这么多复杂的理论,是不是有点头昏呢?其实如果读者觉得这些关于计算机图形学理论太过于复杂,记不住就算了,就采用第二种方法吧,这种方法比较容易理解与记忆。下面看一个实例:

_quality = "LOW";

begin_x = 70;

begin_y = 250;

y_move_speed = 4;

//先产生一个空白的填充效果

createEmptyMovieClip("dongua_sparkle", 100);

with (_root.dongua_sparkle) {

    beginGradientFill("radial", [0xffffff, 0xffffff], [100, 0], [0, 255], {matrixType:"box", x:0, y:0, w:20, h:20, r:0});

    //顺时针画个圆,然后用前面的定义的白色渐变色填充

    moveTo(10, 0);

    curveTo(20, 0, 20, 10);

    curveTo(20, 20, 10, 20);

    curveTo(0, 20, 0, 10);

    curveTo(0, 0, 10, 0);

    endFill();

}

//这里的tabXtabY分别代表一个圆的圆心位置,共有20个圆

arrays = {tabX:[], tabY:[250, 210, 440, 400, 350, 220, 350, 260, 340, 400, 250, 210, 440, 400, 350, 220, 350, 260, 340, 400]};

dongua_sparkle._visible = false;

_root.onEnterFrame = function() {

    for (i=0; i<20; i++) {

             name = "dongua_sparkle_"+i;

             duplicateMovieClip(dongua_sparkle, name, i);

             _root[name]._x = arrays.tabX[i];

             _root[name]._y = arrays.tabY[i];

             _root[name]._xscale = 4*arrays.tabX[i];

             _root[name]._yscale = 4*arrays.tabY[i];

             _root[name]._alpha = arrays.tabY[i]/6;

        //让云彩往上飘,移动方式以cos函数为基准,每次移动距离很小

             arrays.tabY[i]=arrays.tabY[i]-y_move_speed/ 2*Math.cos(angle-i)-y_move_speed;

             //如果云彩的中心小于5时就重新从下面开始

             if (arrays.tabY[i]<5) {

                      arrays.tabY[i] = begin_y;

             }

             //云彩的x坐标变化值是以sin函数为基准

             arrays.tabX[i] = begin_x+(30*Math.sin(angle-i));

        //调整角度

             angle = angle+0.002;

    }

};

这个特效的核心就是通过产生20个圆,用白色渐变填充,然后控制它的大小、宽度,再让它从下向上飘动,同时修改它的大小、宽度与透明度,当它到最顶端后,透明度也基本降到了最低,然后又重新从下面开始。用来控制它的x坐标的是sin函数,而sin函数的取值范畴是[–1,1]arrays.tabX[i]=…程序中用30来乘就扩大了x坐标的波动范围,可以在[begin_x–30, begin_x+30]内波动。用来控制y坐标的是cos函数,arrays.tabY[i]=…这一句实际上是保证渐变的圆每次上移的距离在[0.5*y_move_speed1.5*y_move_speed]之间,从而保证了上移是连续的!而最后一句中angle每次调整的角度非常之小,只有0.002,这就是为了让sin函数和cos函数求出的值与上次变化非常小,肉眼看上去每一次变化都很细小,从而达到预期的效果。见图3-14与图3-15只是连续变化效果的两个画面,其实效果是极具动感的。


           

3-14                                             3-15



[] [返回上一页] [打 印] [收 藏]
  [相关文章评论]    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 

  QQ空间4个FLASH时钟..
黑色的个性flash时钟..
QQ空间FLASH模块:天..
QQ空间最新FLASH模板..
QQ空间FLASH模块:对..
QQ空间FLASH模块:经..
Flash Player11月出..
QQ空间周杰伦FLASH播..
3.0空间教程系列:使..
QQ空间FLASH模板:4款..


 
中华隐士黑客联盟
本站超级酷的Flash (不看会后悔的..
免费在线看的电影网站(一)
最新QQ空间4.0全屏版效果图!!
免费获得Q币的最新方法
黑客快速入门(强烈推荐)
不用木马,轻松万能偷盗QQ号码
揭秘远程破解盗窃QQ密码的各种方..
免费二级域名申请
18岁少女欲6000元卖处女身 救患血..
 
防止QQ和QQ币游戏币被盗的办法 12-03
养在深闺人未识:FU_Rootkit 12-03
黑客学堂:什么是社会工程学? 12-03
VB程序实现XP效果的界面 12-03
fport.vbs for XP/2003 12-03
保卫自己网站的胜利果实 12-03
SQL注入建立虚拟目录,免得找Web.. 12-03
搜索型注入的文章 12-03
如何用虚拟机安装Windows Vista系.. 12-03
通杀腾讯QCC所有商品免费拿! 12-03
 
关于本站 网站帮助 广告合作 下载声明 友情连接 网站地图 访客留言 论坛登录
〖中华隐士黑客联盟〗,Copyright © 2006-2010 WwW.Hack86.Com 闽ICP备:06023304号
站长:小质 QQ:771760,软件发布MAIL:Hack086@21cn.com