黎昌庆 向兴花 何姬勋
一、设计预演效果
要避免制作课件过程的盲目性,做到省时高效,最好能在制作课件前将要实现的演示效果书面化。
笔者希望通过Flash实现的效果是让小球实体在平衡位置O点左右来回振动,振动过程中作变加速运动,且弹簧实体的长度也要随之变化,给人的视觉效果就是弹簧使小球做往复运动。合力(或者加速度)实体和速度实体同步显示相关物理量大小和方向。同时,为了让课件具有交互性,并能留给学生思考研究的空间,可以通过按钮控制合力(或者加速度)实体和速度实体的显示或隐藏,还可以通过图1左下角的一系列按钮改变小球质量、弹簧的劲度系数、最大形变量(振幅)的大小,引导学生观察不同变化情况下小球的振动,进而研究小球的振动周期与哪些因素有关、有什么关系。
二、素材的制作
根据构思确定需要哪些素材。从图1可以看出需要两类素材:影片剪辑实体和按钮实体。其中,弹簧实体、小球实体、合力实体和速度实体属影片剪辑,需要另行分别制作。按钮实体可以直接通过“窗口 → 公用库 → 按钮”找到。
在Flash的编辑窗口,依次打开“插入”→“新建组件”→“创建新元件”,在弹出的“创建新元件”属性对话框中,素材的性质应设成“影片剪辑”(图2)。在制作“弹簧实体”时,屏幕上的坐标原点就是中心位置,应从中心位置开始画折线,形成一个水平放置的弹簧(图3)。
这时弹簧实体已在库中,通过“窗口 →库→ 影片剪辑”,就可以在影片剪辑列表中看到名称为“弹簧实体”的影片,将名称为“弹簧实体”的影片拖到场景中,点击工具栏左上角的箭头按钮,选中场景中的“弹簧实体”,点击工具栏右下角的缩放按钮,改变弹簧实体的大小。制作其他影片剪辑实体与制作“弹簧实体”相似,在制作小球实体组件时,要让球心与编辑窗口中的中心位置重合。制作合力实体和速度实体时,将箭头与编辑窗口的中心位置重合。
三、程序设计
在图4“Action”图层中设置程序。要在某一帧设置程序,需将鼠标移至该帧,单击鼠标右键弹出下拉菜单,单击“动作”选项(图5),即可进入动作设置属性对话框进行程序设置(图6)。
1.主体程序
(1) 在Action图层(图4)的第一帧设定初始参数
x0 = 392;//图1中振子平衡位置O点的横坐标
x1 = 532;//图1中B点的横坐标
y0 = 88;//弹簧振子和小球实体的纵坐标
v0 = 0;//小球的初始速度
p1 = 74;//图1中弹簧固定点的横坐标
zhi1 = false;
zhi2 = false;//“zhi1”和“zhi2”是两个逻辑变量,初始布尔值是False
m = 2000;//表示小球的质量
k = 0.01;//表示弹簧的劲度系数
play();
(2)在第三帧设定下列参数
t0 = getTimer();//表示获取程序执行第三帧时的时间
m2 = x0;//合力实体的横坐标
n2 = Number(y0)+100;//合力实体的纵坐标
m3 = x0;//速度实体的横坐标
n3 = Number(y0)+200;//速度实体的纵坐标
(3)在第四帧设置程序
x0 = 392;
t1 = getTimer();
y1 = y0;
t = t1-t0;
x = x1-x0;
f = k*x/10;
a = f/m;
v0 = Number(v0)+Number(a*t);
s = v0*t;
x1 = x1-s;
//伴随时间发生变化,可以由动力学知识和运动学知识计算出小球位置坐标,速度、位移和受力都在随时间的变化而变化。
setProperty("/小球", _x, x1);//根据计算出的坐标确定小球应处的位置
p = (x1-p1)/(x0-p1);
setProperty("/弹簧", _xscale, p*100);//根据小球的位置设定弹簧实体x轴方向的放大比例,使弹簧右端随时和小球中心重合。这样给人的视觉是弹簧带动小球在振动。
n = (x1-x0)/120;
if (Number(n)>0) {
setProperty("/合力", _xscale, n*100);
setProperty("/合力", _x, m2);
setProperty("/合力", _y, n2);
setProperty("/合力1", _alpha, 0);
setProperty("/合力", _alpha, 100);
} else {
setProperty("/合力1", _xscale, (x0-x1)/1.2);
setProperty("/合力1", _x, m2);
setProperty("/合力1", _y, n2);
setProperty("/合力", _alpha, 0);
setProperty("/合力1", _alpha, 100);
}
//将合力实体复制,把复制的合力实体水平翻转并命名为“合力1”。用这两个实体分别表示振子在平衡位置两边所受合力的方向,其长短的变化表示合力大小的变化。实体长短的变化由位移x1-x0的绝对值来决定。当振动小球位于平衡位置右边时,合力实体的alpha值设为0,即不透明,合力1实体设成透明;当小球位于平衡位置左边时,情况相反。
if (Number(v0)>0) {
setProperty("/速度", _xscale, v0*1000);
setProperty("/速度", _x, m3);
setProperty("/速度", _y, n3);
setProperty("/速度", _alpha, 100);
setProperty("/速度1", _alpha, 0);
} else {
setProperty("/速度", _alpha, 0);
setProperty("/速度1", _alpha, 100);
setProperty("/速度1", _xscale, v0*1000);
setProperty("/速度1", _x, m3);
setProperty("/速度1", _y, n3);
}
//关于速度的显示与上文所述合力的显示雷同。
x1 = getProperty("/小球", _x);
gotoAndPlay(3);//将实体小球的横坐标值赋给变量x1并返回第三帧,循环执行第四帧的程序
2.交互性设置
on (release) {
setProperty("/合力", _visible, zhi1);
setProperty("/合力1", _visible, zhi1);
zhi1 = not zhi1;
}
//对合力实体显示与否由逻辑判断来决定。逻辑变量zhi1的值是True时,就显示合力,是False就隐藏。每按一次“显示/隐藏”按钮,逻辑值变一次,从而达到控制显示与隐藏
on (release) {
setProperty("/速度", _visible, zhi2);
setProperty("/速度1", _visible, zhi2);
zhi2 = not zhi2;
}
//对速度的显示与隐藏和合力实体的交互性设置雷同,也是由逻辑判断来决定的
On (Release)
Set Variable: "m" = 6000
End On
//小球质量变大按钮的动作设置
On (Release)
Set Variable: "m" = 500
End On
//小球质量变小按钮的动作设置
On (Release)
Set Variable: "k" = 0.04
End On
//弹簧劲度系数变大按钮的动作设置
On (Release)
Set Variable: "k" = 0.005
End On
//弹簧劲度系数变小按钮的动作设置
On (Release)
Set Variable: "x1" = 550
End On
//弹簧形变量变大按钮的动作设置
On (Release)
Set Variable: "x1" = 470
End On
//弹簧形变量变小按钮的动作设置
On (Release)
Go to and Play (1)
End On
//对复原播放按钮的动作设置
On (Release)
Stop
End On
//对暂停按钮的动作设置
On (Release)
Go to and Stop (5)
End On
//下一页按钮的动作设置
除了上述按钮交互设置,还可以根据教学的需要把教材的练习用文本框来表示。这些文本框都可以通过输入文字达到交互的目的,以此激发学生学习兴趣。
四、导出动画
制作完毕,设定动画的播放速度,建议值为120帧/秒,以保证动画效果是连续的。最后需要将文件以动画形式导出,点击“文件”下拉菜单中“导出动画”选项,在弹出的保存动画中输入一个文件名并确定,这样一个以SWF为扩展名的文件便生成了。当你打开这个新文件时,就可以看到振动着的弹簧振子了。