飞闪物理──用Flash做物理课件之元件应用
IT商界
上一篇我们讲了布朗运动的控件实现。源文件下载地址:http://www.cpcw.com/download/39/flash3.fla,成品文件下载地址:http://www.cpcw.com/download/40/flash3.swf。
上期做布朗运动,我们讲到了随机效果的应用。相信读者看过一些物理课件之后,不难发现其实有相当一部分的元件制作是雷同的,特别是一些常用的控制元件、仪表,如果能够一次制作好,那么以后制作不同课件的时候可以直接引用,从而大大提高工作效率。在这一篇中,我们以Slider滑块控件(就是用来拖动以改变数值的控件)、小灯泡和电流(压)表这三种常用的元件为例,来讲公用元件的制作。最后我们将会用到这些元件。
实例:滑块、小灯泡与电流(压)表
分 析
在本例的开发中我们体现了模块化编程的思想。虽然Flash MX提供了“组件”(Component)这一功能(事实上一些大型的公用元件也是被封装为组件来使用),但制作一些简单的元件也要做成组件无疑是“杀鸡用牛刀”。
我们来着重分析一下本例中难度较大的电流表的制作。
由于绘制表盘比较麻烦,我们采用现成的实物照片(如图1,笔者使用的是杭州电表厂的电流表的照片)。
设定一个“wmode变量”用来指示量程,0时(100毫安挡)为0~100毫安,1时(500毫安挡)为0~500毫安。经过测量知道指针摆动的范围是-40o~40o(以竖直向上为0o),因此指针的偏角=-40+80×电流值÷最大量程,当使用100毫安挡的时候,指针每偏转1o表示电流变化1.25毫安;500毫安挡则为7.25毫安。
为了模拟指针逐渐摆至指定位置的效果,我们设置一个变量用来存储目标值(就是下面的Valset),一个变量用来读取当前值(currVal),如果未达到目标值那么根据与目标值之间的距离设定速度逐渐逼近目标值(这样有个好处,就是不至于因为变量上小到0.01的差距而摆过了头),而无论何时,指示值(currVal)变化的速率是角度变化速率的1.25(7.25)倍。
为了模拟超过量程时的“打表”现象,我们增设一个速度转换因数(speed),在目标值超过量程的时候,目标值=量程×110%,速度为正常摆动的5倍。
要点提示
点(.)语法
我们在第二篇中介绍过,这里我们使用它来访问变量,比如要访问名为c1的元件下名叫v的变量,就写成c1.v。相信学过VB或Delphi等面向对象的可视化高级语言编程的读者不难理解。点语法使我们可以方便地访问元件内部的变量和函数,这就提供给我们通过在元件外改变这些变量来控制元件的变化的可能。今天的例子正是基于这一思想制作的。
增量(+=)语法
在以前的例子中我们也使用过,比如a+=3的意义等同于a=a+3,即把变量a的值增加3再重新赋给a。如果a原先的值为2,那么经过这一处理便成了5。类似的还有“-=”、“*=”、“/=”,相信不用我说大家都明白是什么意思了。
元件制作及程序编写
本例素材下载:http://www.cpcw.com/download/40/sucai.zip
滑块的制作
1.新建一个影片剪辑(以下简称MC)元件,名为Drag。在其中央画一个滑块(如图2),样式可以根据个人喜好自定。应尽量使其处于正中处。
2.新建MC元件Slider,利用矩形和直线工具画好滑槽和刻度。滑槽的尺寸与位置:W=6,H=212,X=-3,Y=-6。刻度线最上面一条的纵坐标应当为0。在滑槽的顶端用文本工具画一个文本框,并在属性栏中将它改为动态文本并与Val变量关联。
3.在第一层上方新建一个图层,把Drag元件拖入第二层中,移到滑槽顶端,在属性栏中将它命名为d1。
布置好后的Slider如图3所示。
4.选中d1,并写入d1的动作脚本:
on(press){
//开始拖动,其中后面四个参数依次规定了拖动的左、上、右、下的范围,本例中使其只能竖直拖动
startDrag(d1,true,0,0,0,200);
}
on(release){
stopDrag();//停止拖动
}
在时间线窗口选择第一层的第1帧,并输入其脚本
d1._y=200-iniv/vmax*200;//设定初始位置,其中iniv是初始值,vmax为Slider调节的最大值,可以在外部通过点语法指定
Val=iniv; //刷新显示变量
5.在第一层第2、3帧新建关键帧,并输入第三帧的脚本:
Val=d1._y*vmax/200;//刷新显示值
gotoAndPlay(2);
6.在第二层的第3帧新建一个帧(不是关键帧),保证所有的第3帧中Drag都可见就行。
至此本元件已完成。建议在库窗口中新建一个目录,把刚刚做的Drag和Slider都放进去,这样在别的文件中引用的时候把那个目录拖到目标文件的库中去就行了,不会丢失零件。
提示:你也可以把它做成一个滑动变阻器,只要把背景换一换,Drag元件画成滑片状即可。
可调节亮度的小灯泡
这个元件很简单。新建MC元件light,画一个无边框的中间为黄色的径向渐变填充圆作为光晕。新建MC元件Bulb,画好底座和灯泡,把light拖进去放在灯泡上(如图4),命名为l1,Alpha值调成65。
并输入Bulb第1帧的脚本:
if (lum<=100){//不超过最大亮度
l1._alpha=lum*0.8;//lum变量指定了其亮度
}
在第2帧新建关键帧,脚本为:gotoAndPlay(1);
然后把两个文件收进一个目录中去。
制作电流表
提示:只要稍加改头换面,就可以作为电压表来演示。
1.新建MC元件Hand,在其中画上指针,注意指针下端与元件中心点对齐(如图5),否则无法绕根部摆动。
2.新建MC元件Ampere Meter,导入电流表的照片(建议先用PhotoShop把白色背景部分去掉,导出成透明背景GIF,以适应不同背景的课件),置于正中。在上方新建图层,把Hand拖进去,注意其下端要置于图片上的指针根部(如图6)。在第二层的第3帧新建一个帧。
3.第一层第1帧的脚本:
//根据量程设定初始位置
if (wmode==0){
h1._rotation=-40+80*iniv/100;
}else{
h1._rotation=-40+80*iniv/500;
}
currVal=iniv;//iniv为电流表初始值
Valset=iniv;
在第一层第2、3帧新建关键帧。第3帧的脚本:
if (currVal!=Valset){
if (wmode==0){
if (Valset>110){//如果超过量程
Valset=110; //最多指到110mA处
speed=0.8;//设定速度因数
}else{//正常摆动
speed=0.16;
}
curFac=1.25;//设定角度/指示值转换因数
}else if(wmode==1){
if (Valset>550){
Valset=550;
speed=0.16;//由于值是100mA档的5倍,速度因子则为其1/5
}else{
speed=0.032;
}
curFac=7.25;
}
h1._rotation+=(Valset-currVal)*speed;//指针摆动
currVal+=(Valset-currVal)*speed*curFac;//记录当前指示值
}
gotoAndPlay(2);
至此电流表也完成了。把Hand、Ampere Meter和背景图放进一个目录中去。如果使用的时候发现指针位置不对,可以通过移动指针位置来调节直至准确。
提示:如果要做电压表(本例源文件做好了一个),只需将上面的元件复制一份,把背景图片换成电压表,例如当量程为5V的时候只要把上面第3帧程序中的Valset和speed缩小为,10V时缩小,并根据图片上摆动范围按一开始讲的计算方法改变curFac即可。
综合应用实例
下面我们来做一个综合应用实例,目的是通过调节滑块来改变加在灯泡两端的电压改变亮度,并且相应改变电压表、电流表的值。
把做好的电流表Ampere Meter、电压表Voltage Meter、滑块Slider、灯泡Bulb(注意是最后完整的元件,不是零件)拖进主场景,分别命名为a1、v1、s1、b1。输入主场景第一帧的脚本:
s1.vmax=10;//设定滑块最大值
s1.iniv=5;//设定滑块初始值
v1.wmode=0;//设定电压表量程为0~5V
a1.wmode=0;//设定电流表量程为0~100mA
当然,在其他课件中也可以通过诸如a1.iniv=50之类的语句来直接设定电流表的初始值。
在第2帧新建关键帧,并输入脚本(假定灯泡电阻为50Ω,则电流为5V/50Ω=0.1A=100mA,毫安数值为电压的20倍):
v1.Valset=s1.Val;//v1指示滑块设定的电压
b1.lum=s1.Val*20; //根据滑块的值设定亮度,亮度最大为100
a1.Valset=v1.Valset*20;//设定毫安值
gotoAndPlay(1);
然后新建一个图层,在上面画上电线,写上说明文字。运行影片(如图7),拖动滑块,可以看到灯泡亮度改变,而当滑块设定值>5的时候,可以欣赏到平时不敢看的打表现象。
小 结
通过以上实例,我们不难得出,公用元件要具有通用性,就需要设定一些可控制的量,随时根据情况来设定。另外,一个元件的目录必须包含组成这个元件的所有零部件,这样在其他地方引用的时候才不会出错。
在其他文件中引用这些元件的时候,选择“文件”菜单下“以库打开”的命令,打开这个文件,就会出现一个包含这些元件的窗口(如图7),把欲引用的元件拖进目标文件的库中即可。







