飞闪物理──用Flash做物理课件之布朗运动

IT商界

  上一篇我们讲了交互式课件及拖曳控制的实现。源文件下载地址:http://www.cpcw.com/download/39/flash2.fla,成品文件下载地址:http://www.cpcw.com/download/39/flash2.swf。

  这一节,我们来看看随机函数的重要作用。通常用的Flash动画主要由Shape(形状)和Motion(移动)以及逐帧动画这样一些基本的方法来实现,但这样做出来的动画只能是按部就班的,对于像布朗运动这样随机性很强、要求动画自然逼真的课件,靠上两期的几种动画就无能为力或非常麻烦。

  分 析

  为了能够真实地表现在显微镜下看到的布朗运动(为了节省演示时间可以将速度加快),我们需要构建若干炭粒各自的随机运动,然后再让这些炭粒随机地分布,并随机地改变大小、旋转角度,这样,整个运动完全是随机的,而不是人为操纵的。

  另外,还要能够每隔一段时间记录炭粒的路径,用以说明教材中布朗运动轨迹图的来历,并说明该轨迹图并不是精确的轨迹。这就需要借助画线语句。幸运的是,AS中每画完一条线,画图笔头就会自动移到线的末端,这无疑为本例提供了极大的方便。

  要点提示

  (1)Math.Random()

  这个函数是本例的基本函数,没有参数,功能是产生一个0~1之间的随机数。那么,如果要产生任意给定的实数(a,b)间的一个数该怎么办呢?我们可以使用这条发展了的语句:

  M=Math.Random()*(b-a)+a

  其中M为待赋随机值的变量,且a<b。例如,要产生一个(-15,30)间的随机数,就应该写M=Math.Random()*45-15。

  (2)用户组件CheckBox的使用

  在Windows应用程序中我们经常看到复选框这种控制元件,Flash MX也提供了这种控件。按“Ctrl+F7”打开“组件”面板,可以找到“CheckBox”。

  拖曳一个CheckBox进入场景,观察属性栏(如图1)。

  在最左侧的文本框中,可以改变组件的名称或者改变一个元件的名称。在右侧的参数面板中(或按“Alt+F7”打开Component Parameters组件参数面板)有若干可供设置的参数,意义如下:

  Label:设置复选框的文字提示标签

  Initial Value:设置复选框的初始值(选中或未选中)

  Label Placement:设置文字标签是放在复选框的左侧还是右侧

  Change Handler:当鼠标点击复选框改变其值时,触发的函数的名称

  CheckBox组件的常用方法(如表)

  元件制作及程序编写

  1.新建一个影片剪辑元件Circle,在其中央画一个蓝色的线宽为1.5,和12×12的无填充圆圈,用以在追踪路径时突出显示炭粒。

  2.新建影片剪辑元件Granule,在其中央画一个7.5×7.5的炭粒,并把刚才画好的Circle组件拖入其中央与炭粒的中心对齐,在属性栏中将它命名为c1,并将其“颜色”的“Alpha”值设为0,使它不可见(如图2)。

  3.新建组件Movement(单独炭粒的运动),将Granule拖入其中央,点击时间轴第一帧,输入动作脚本(注意是第一帧的动作,不是Granule组件的动作):

  n++;

  p00._x+=Math.random()*30-15;//随机移动-15到15像素

  p00._y+=Math.random()*30-15;

  p00._rotation+=Math.random()*120-60;//随机旋转-60到60度

  if (this._name=="p100"){//如果这一个组件的实例是要追踪的那一个

  if (_root.checkBox1.getValue()==true){//如果主场景中“记录路径”复选框被选中

  p00.c1._alpha=90;//显示圆圈

  if(n%12==0){//每隔12帧(1秒)记录一次路径

  this.lineStyle(2,0xFF0000,50);

  this.lineTo(p00._x,p00._y);

  }

  }else{

  this.clear();//清除记录的路径

  n=0;

  p00.c1._alpha=0;//隐藏圆圈

  }

  if(n%12==0){//更新记录笔头的位置

  moveTo(p00._x,p00._y);

  }

  }

  //如果偏离得太远那么强制其回头

  if (p00._x>150){

  p00._x-=20;

  }

  if (p00._y>150){

  p00._y-=20;

  }

  if (p00._x<-150){

  p00._x+=20;

  }

  if (p00._y<-150){

  p00._y+=20;

  }

  4.在时间轴中点击第二帧的位置,按F6新建关键帧。输入第二帧的脚本:

  gotoAndPlay(1);

  5.新建一个影片剪辑元件Main,将Movement组件拖入其中央,输入第一帧的脚本:

  for(i=1,i<=99,i++){

  duplicateMovieClip(p0,"p"+i,i);//复制出前99个运动的炭粒实例

  with(this["p"+i]){//随机设置其位置、旋转角度及大小

  _x=Math.random()*400-200;

  _y=Math.random()*400-200;

  _rotation=Math.random()*360-180;

  p00._width=Math.random()*10;

  p00._height=p00._width;

  }

  }

  for (i=-200,i<=200,i+=20){//画出网格线

  this.lineStyle(1,0x000000,20);

  this.moveTo(i,-200);

  this.lineTo(i,200);

  this.moveTo(-200,i);

  this.lineTo(200,i);

  }

  duplicateMovieClip(p0,"p100",100);//复制出供追踪路径的那一颗炭粒

  with (p100) {

  _x=Math.random()*20-10;//为便于观察,起始位置在视野中央附近

  _y=Math.random()*20-10;

  p00._width=15;//突出该炭粒的大小

  p00._height=15;

  }

  6.元件的制作至此完成。回到主场景,将影片大小改为700×500。把Main组件拖入第一层中央。

  7.在该层上方新建一个图层,在该层中画一个400×400的实心圆,务必使圆的中心对齐Main组件的中心[由于Main组件被遮住,故需先记下其坐标,然后将其横、纵坐标分别减去194(=400÷2-12÷2)即得圆的位置坐标]。将其边线剪切下来。在时间轴窗口左边的图层栏右击第二层,在弹出快捷菜单中将它设置为遮罩层。

  8.在第二层上方再新建一个图层,输入标题文字,并绘制一个显微镜(可在闪吧网站矢量图库http://www.flash8.net/vector_show.asp?id=3018下载,打开后将它复制入本文件),把刚才那个圆的边线粘贴进来并稍作加工作为显微镜下视野的边框。从组件窗口中引入一个CheckBox组件,在属性栏中将它命名为CheckBox1,Label参数设为“记录路径”。

  本例中元件按从属关系,由低级到高级的顺序为Circle∈Granule∈Movement∈Main∈主场景。

  主场景的层次及元件安排如图3所示。注意主场景中所有的层都只有1帧。

  小 结

  在本例中我们发挥了Random函数的作用。由于真实世界中的随机性很强,在这里随机数对于模拟真实情况无疑起了非常重要的作用。Flash UI组件是MX版本的新产物,在AS程序开发中免去了很多制作控制元件的工作,大大提高了工作效率。