飞闪物理──用Flash做物理课件之平抛运动

IT商界

  概 述

  Flash MX以其良好的矢量绘图功能和改进的Action Script脚本语言,成为实验性学科制作课件的首选。一般来说,一个Flash课件需要经历以下步骤来制作:

  ①原理分析(建模)

  ②结构规划

  ③计算机上模拟过程分析及运算

  ④元件准备

  ⑤程序设计

  ⑥调试、发布

  实例:平抛运动

                           实例的运动图例

  1.分析和计算

  平抛运动是水平方向的匀速直线运动和竖直方向的自由落体运动两个运动的合成。由于在计算机上的显示不是连续的,所以要通过“帧”来定位。

  现在进行模拟计算。匀速运动很好办,速度不变,每帧的位移也是常数。

  取屏幕上每10像素代表1米,那么在通常的800×600分辨率下我们使用当中的700×500像素。也就是相当于下落50米。为了便于观察,时间t将被放大两倍。设屏幕上的自由落体运动加速度为a,我们可以列方程组为:

  gt2/2=50

  a(2t)2/2=500 解得a=24.5像素/秒的平方

  又由于我们的帧频是20,也就是每帧0.05秒,每隔一帧改变小球位置的代码被执行一次,得到每帧的加速度为24.5×0.052=0.0625像素/帧的平方。

  以帧为单位时间,这也就是每帧位移的变化量。

  2.要点提示

  重要的语句:

  (1)复制影片剪辑,创建一个新的引用

  duplicateMovieClip(<原对象>,<复制后的名称>,<在场景中的层次>);

  (2)在场景或者剪辑中,移动画图的起始点。(this代表当前剪辑或场景,还可以用_root指向主场景)

  this.moveTo(x,y)

  以(x,y)为终点画直线

  this.lineTo(x,y)

  (3)改变对象属性

  setProperty(<对象>,<要改变的属性项目名称>,<目标属性值>)这里用到了_x,_y,_alpha属性,分别代表元件的横坐标、纵坐标和不透明度。

  3.元件及场景准备

  将影片背景设为深蓝色#000099,帧频设为20fps,大小700×500。

  新建一个影片剪辑元件,在中央画一个小球,使用渐变色填充增强立体感。

  第一帧:打上标题,并从共享库引入一个play按钮(图1)。

  第二帧:引入一个播放按钮、一个倒带按钮,在属性栏中将其名称(Instance Name)分别命名为bplay和back(如图2);用文字工具画一个文本框,在属性栏中将它改为“动态文本”,在关联变量一栏中填入t(如图3)。从库中把小球拖到场景中创建一个对该剪辑的引用,命名为b1,大小为12×12,X坐标为100,Y坐标为6(图4是该帧的左上角)。

  第三帧:空白帧。

  4.程序编制

  建议使用“专家”模式(单击“动作”窗口中的按钮转换)。在Action Script中,setProperty,on,release这些关键词是区分大小写的,其他的诸如变量名、影片剪辑名称等则不必区分。

  单击时间线中的第一帧,在动作窗口中输入第一帧的脚本:(//后为注释)

  stop();

  xp=100;

  yp=6;//初始化位置变量

  单击选中play按钮,在动作窗口中输入脚本:

  on (release) {

  gotoAndStop(2);

  }

  第二帧的脚本:

  v+=0.0625;//速度的增加

  setProperty("b1", _x, xp+4);

  setProperty("b1", _y, yp+v);

  //改变小球位置

  setProperty("back",_alpha,0)//隐藏倒带按钮

  yp=b1._y;

  xp=b1._x;//记录下当前位置

  if (yp>=500) {//如果超出边界则停止

  stop();

  setProperty("back",_alpha,100);//使重播按钮可见

  }

  if(n%4==2) {//每4帧(0.2秒,现实中的0.1秒)进行一次“频闪照相”

  t=n*0.025;//刷新计时器

  duplicateMovieClip(b1,"b"+n,n);//复制一个小球的形象,加上n作为序号以区别

  setProperty("b"+n,_x,112);

  setProperty("b"+n,_y,b1._y);

  //记录竖直方向的运动轨迹

  duplicateMovieClip(b1,"c"+n,n-1);

  setProperty("c"+n,_x,b1._x);

  setProperty("c"+n,_y,b1._y);

  //记录平抛小球的运动轨迹

  duplicateMovieClip(b1,"d"+n,n+1);//n+1和n-1区别了不同的层次

  setProperty("d"+n,_x,b1._x);

  setProperty("d"+n,_y,5);

  //记录水平方向的运动轨迹

  this.lineStyle(1,0xFFFFFF,50);//定义线的粗细、颜色和透明度

  this.moveTo (0,b1._y);

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

  this.moveTo(b1._x,0);

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

  //画出网格线

  }

  n++;//计数器计数

  “播放”按钮的脚本:

  on (release) {

  gotoAndPlay(3);

  }

  “倒带”按钮的脚本:

  on (release) {

  back._alpha=0//隐藏倒带按钮

  this.clear();//清除网格

  for (var i=2,i<=n,i+=4) {

  removeMovieClip("b"+i);

  removeMovieClip("c"+i);

  removeMovieClip("d"+i);//删除纪录的运动轨迹

  }

  xp=100;

  yp=6;

  n=0;

  t=0;

  v=0;

  setProperty("b1",_x,108);

  setProperty("b1",_y,6);

  //初始化各变量与小球

  setProperty("bplay",_alpha,100);//显示“播放”按钮

  }

  第三帧的脚本:

  gotoAndPlay(2);

  setProperty("bplay",_alpha,0);

  至于说明文字和装饰部件,请读者自己完成。

  小结与拓展

  通过这个例子,我们讲述了如何表现两种基本的运动和记录轨迹。这个例子还可以被改造成譬如飞机投弹、验证机械能守恒等实例,读者可以自己研究。

  注:本系列中所有课件均使用Flash MX制作,所有按钮等素材均可在共享库中找到。