闪吧发表,请勿转载!
雪 花 纷 飞
雪花纷飞(如图1所示)是一个在制作情景剧或MV时经常要用到的效果。该动画中纷纷扬扬的大雪配以冰天雪地的背景,就算在酷暑季节也会给人一种清凉的感觉。并且几乎每一片雪花的大小、角度、方向和飘落的速度都不相同,这样的效果是不是很吸引人?本例从画面效果上看简洁明快,在实际制作时也一点不难。在时间轴上只有一个帧,库中也只有背景图片和雪花这两个元件。实现雪花漫天飞舞的效果关键在于随机函数random的应用。
图1 “雪花纷飞”效果图
软件知识点
: 影片剪辑事件onClipEvent
: attachMovie语句
: random语句
实例分析
在动手制作“雪花纷飞”前,让我们先理清本实例的设计思路和制作方法,然后可以一步到位做出效果。
制作特点
本任务主要有以下特点:
(1)需要的素材就是一幅雪景图片,素材选取质量的好坏对最后的效果也有很大的影响。
(2)本实例的关键还在脚本的编写上,所以在动手制作之前需要对onClipEvent、attachMovie和random语句有一定的了解。实例10已经应用到了attachMovie语句,在介绍实际操作步骤之前,还将对onClipEvent和random函数作一些说明。
创意分析
想要制作雪花纷飞的效果,如果一片一片地对雪花进行绘制并添加动作,将吃力不讨好而且还会成为一个笑话。本实例用attachMovie方法将一个雪花元件作为影片剪辑实例添加多个到场景中,再使用随机函数random为每一片雪花随机设置产生位置、大小、旋转方向、运动方向和运动速度,这样,在纷纷扬扬的无数片雪花中就再也找不到两片完全相同的了。
用Flash制作下雪效果总的来说主要有以下两种方法:
【方法1】
设计静止的雪花图像,在调用影片剪辑时为其添加速度使其下落。这是本例用到的方法。从微观上看,每一片雪花从下落开始只保持一种大小、方向和速度,但从宏观上看,众多雪花交错飞舞的效果便出来了。
【方法2】
在影片剪辑中使用引导动画做成雪花飘落的效果,在场景中对其进行调用。这种方法不涉及到用Actions控制雪花的速度和方向,但同样可以用random语句控制其大小。
技术要领
使用中文版Flash MX制作“雪花纷飞”特效动画的技术要领主要在恰当运用影片剪辑事件onClipEvent和随机函数random。
1.onClipEvent(movieEvent){
statement(s);
}
影片剪辑事件onClipEvent是专用于影片剪辑的事件处理函数,它用来触发为影片剪辑实例定义的动作。movieEvent 是一个事件触发器,当事件发生时,就执行大扩号内定义的动作。movieEvent可以是load、unload、enterFrame、mouseMove、keyDown等等。本例用到的是load和enterFrame事件。播放动画时,当影片剪辑被加载(不一定开始播放)到时间轴上即触发load事件,当动画播放到影片剪辑所在时间轴上的帧位置,即触发enterFrame事件。
2.random(value)
随机函数random(value)返回0到value之间的一个随机整数。如random(10)将随机返回0~9这10个数中的一个数。本实例将用到大量的随机函数。
操作过程
下面介绍制作雪花纷飞效果的操作过程。
1.编辑元件
本实例用到的两个元件是一幅背景图片和一片雪花的影片剪辑。背景图片是从电脑中导入的,雪花得手工绘制。
(1)启动Flash MX,单击属性面板中的按钮,在出现的“文档属性”对话框中将文档尺寸设为500×400像素,将背景色设为黑色。将背景色设为黑色是为了方便绘制白色的雪花。
(2)选择“文件”/“导入”命令,将背景.jpg图片导入到舞台中并对齐到舞台中心。
(3)按快捷键Ctrl+F8新建一个影片剪辑元件,将其命名为“雪花”。
(4)使用放大镜工具放大舞台中心,对雪花元件进行编辑。编辑好的雪花元件及参数如图2所示。
图2 雪花元件及参数
(5)在库面板中的“雪花”元件上单击鼠标右键,在弹出的快捷菜单中选择“链接”命令,在出现的“链接属性”对话框中选中为动作脚本导邮复选框,下面的在第一帧导出复选框同时被选中,将标识符设为snow,单击确定按钮 。添加了链接的影片剪辑元件“雪花”就做好了。
2.添加Actions
影片剪辑事件onClipEvent只能用于影片剪辑实例,所以在添加Actions之前必须在场景中创建影片剪辑的实例。
(1)在主场景中单击图层区的按钮新建一个图层。
(2)在库面板中选中“雪花”元件并拖动到舞台中的任意位置。
(3)确定“雪花”元件为选中状态,打开影片剪辑动作面板,在其中添加如下Actions:
this._visible = false; v0 = 2; scale0 = 20; num = 100; var dir = new Array(); var v = new Array(); for (i=1; i<=num; i++) { _root.attachMovie("snow", "snow"+i, i); scale = random(2.5*scale0)+scale0; with (_root["snow"+i]) { _xscale = scale; _yscale = scale; _x = random(500); _y = -(random(400)); _rotation = random(360); dir[i] = -(random(180)); v[i] = random(v0)+v0; } } } onClipEvent (enterFrame) { for (i=1; i<=num; i++) { with (_root["snow"+i]) { _x += Math.cos(dir[i]); _y += v[i]; if (_x<0) { _x = 500; } if (_x>500) { _x = 0; } if (_y>400) { _y = 0; } } } }
以上脚本在影片剪辑的load事件中对所有要出现的雪花进行初始化。v0用于控制总体下落速度,scale0用于控制总体雪花大小,num用于控制雪花总数,数组dir和v用于记录每一片雪花的下落方向和下落速度。在for循环语句中分别对每一片雪花使用随机数设置其大小、位置、自身旋转方向、运动方向和下落速度。
在影片剪辑的enterFrame事件中对每片雪花的位置进行调整。_x += Math.cos(dir[i]);语句使其每执行一次即在x方向移动Math.cos(dir[i])距离;_y += v[i]语句使其每执行一次即在y方向移动v[i]距离。这两个语句保证了每片雪花在下落时保持不变的方向和速度。
后面的3个if语句使每片雪花在超出边界范围时能再次进入场景中,以此不停循环,纷纷扬扬的大雪就做成了。
(4)按快捷键Ctrl+Enter测试影片,效果如图1所示。
3.改进Actions
仔细观察现在的效果,是不是所有雪花都要到达窗口边界才会消失?为了体现出远近层次,可以对Actions作一些改进,让部分雪花从水面上消失,以实现雪融于水的效果。
(1)在load事件中初始化数组的位置添加如下语句,为雪花的下落深度值分配一个数组。
var depth = new Array();
(2)在load事件中的for循环语句内添加如下语句,为每一片雪花的下落深度分配一个随机数。
depth[i] = random(200)+200;
(3)在enterFrame事件中将原来的if (_y>400)中的条件_y>400改成_y>depth[i]。
(4)按快捷键Ctrl+Enter测试影片,即可看到雪花融入水中的效果。
本例小结
本例的任务是设计制作“雪花纷飞”的特效动画。“雪花纷飞”在创意设计上力求用最少的工作做出下雪这一平常而美丽的自然现象。
attachMovie方法和random函数帮助我们实现了这一愿望。本例仅仅使用了一幅背景、一片雪花,通过attachMovie方法调用影片剪辑产生新的实例并将它们安排在不同的深度级别上,再用random函数为每片雪花设置不同的属性,从而实现了纷纷扬扬的雪花没有两片雷同的效果。
本例最后通过改进Actions实现雪融于水的效果,其中也有不足之处,如水面太平静,并且没有雪花的倒影。其实要做出更真实的效果也是可行的,如为每一片雪花的倒影分配相关的数组,降低其透明度属性_alpha的值,使每片雪花与其倒影以depth[i]的位置作相向的运动即可做出倒影效果。
值得指出的是,本例用雪花影片剪辑承载影片剪辑事件函数onClipEvent,并在脚本运行时使用this._visible=false将其隐藏。其实也可以用别的影片剪辑元件来承载Actions,只不过既然有“雪花”元件可以用,就没有必要再添加别的影片剪辑了。
点击浏览该文件
点击浏览该文件


