这天一个人走去爬山,国庆节有点闷。不过,爬山却会让人感觉全身轻松起来,没有压力的享受与大自然交流的快乐时光。晚上,就随便写了一个下雪的效果。虽然这种效果已经很落后,不过当年学flash的时候,这个编程却帮了懂了很多。
无聊之中,突然想起了志摩哪首雪花的快乐。却无意中,勾起那段回忆的故事。徐志摩,林徽因 ,梁思成 金岳霖之间故事。
好,闲话不多说。
雪花制作原理:
创建一个影片剪辑Snow,这个Snow就是关键雪花。制作的时候,采用一个灰色的球,然后通过滤镜模糊化,改变光度这样的方式就可以制作一个小球出来。通过时间器让雪花产生不同时间间隔,并且让雪花自动下落一个高度就进行删除,否则内存会开销很大,产生卡的现象。
接下来,还需要准备一张背景图。最好还是与雪有关系的。
完成准备工作,就可以开始写代码。
设计文档类:main.as ,以及雪花Snow.as 类这两个类就可以完成基本工作。
Snow写法
package com.effect
{
import flash.display.MovieClip;
import flash.events.*;
public class Snow extends MovieClip
{
public function Snow()
{
}
}
}
package
{
import flash.display.MovieClip;
import flash.events.*;
import flash.utils.Timer;
import flash.display.Stage;
import flash.display.DisplayObject;
import com.effect.Snow;
public class main extends MovieClip
{
private var time:Timer;
private var speed:int=5;
private var contain:MovieClip=new MovieClip();//存储雪花容器
public function main()
{
init();
}
//初始化时间器
private function init():void
{
addChild(contain);
time=new Timer(200);
time.addEventListener(TimerEvent.TIMER,onTimer);
time.start();
}
private function onTimer(event:TimerEvent):void
{
creatSnow();
creatSnow();
creatSnow();
creatSnow();
creatSnow();
}
//复制雪花
private function creatSnow():void
{
var mysnow:Snow=new Snow();
contain.addChild(mysnow);
mysnow.y=0;
mysnow.x=Math.random()*stage.stageWidth;
mysnow.scaleX=mysnow.scaleY=Math.random()+0.1;
mysnow.addEventListener(Event.ENTER_FRAME,Run);
}
private function Run(event:Event):void
{
var mc:MovieClip=MovieClip(event.currentTarget);
mc.y+=speed;
mc.rotation=Math.random()*360;
if (mc.y>650)
{
contain.removeChild(mc);//删除内存中的mc
mc.removeEventListener(Event.ENTER_FRAME,Run);//删除事件
mc=null;
}
}
}
}
时间Timer使用:
关键的程序,主要使用计数器产生一个产生对象的效果。Timer 每隔200毫秒就会产生一个对象,该对象就会产生一个向下运行的效果。
在init() 方法的时候就构造一个时间器。
对象运动
我们创建的Snow对象,需要对其进行运行,那么我们采用一个简单的方式就是采用Event.ENTER 这样的事件监听,通过这个事件我们可以每一帧对其进行调用。
这样当我们改变y轴的大小,那么就可以产生一个位移改变了。同样在下落的过程当中,适当改变角度就会产生不同的效果了。
删除对象
关于删除的工作,其实不难,不过使用removeChild这个方法的时候,需要注意节点的关系。
在这里采用private var contain:MovieClip=new MovieClip();//存储雪花容器 这种方式存储Snow的对象,
contain.addChilc(mysnow);
这样的话,我们就很容易知道节点父级和子级的关系。contain 作为一个父级点,只有通过这个才能进行删除他容器内的节点。
contain.removeChild(mc);//删除内存中的mc
同样,对删除后的对象要进行删除事件监听,当不使用Event.ENTER_FRAME事件 的时候,则需要对其事件删除,否则就会出错。
mc.removeEventListener(Event.ENTER_FRAME,Run);//删除事件