郑均
四川省广元市实验中学 四川省广元市 628000
摘要:用Flash动画来构建物理模型和模拟物理过程,怎样才能更好地实现各物理量随时间的变化,并方便控制,利用Flash课件强大的交互功能更好地辅助物理教学呢?作为一名爱好Flash的高中物理教师,根据物理模型和规律,结合Flash ActionScript 3.0编程方法和技巧,通过本文以制作平抛运动模型为例,详细介绍了ActionScript 3.0中Timer事件的用法,旨在抛砖引玉,希望广大爱好Flash的物理老师有更好的方法制作更好的课件,打造物理高效课堂。
关键词:物理课件;Flash动画;ActionScript 3.0;Timer事件
很多物理老师可能都用过Flash做过课件,特别是用Flash动画来构建物理模型和模拟物理过程,能够让抽象的物理模型和较复杂的物理过程形象、直观地呈现,如果再结合实验演示,就能更好地帮助学生建立物理模型和对物理过程的分析和理解。
为了让Flash动画在物理课件中充分发挥作用,我们在用Flash动画来构建物理模型和模拟物理过程时,就必须让物理模型和物理过程中每个物理量的变化和实际情况一样,并能显示出来。而实际的物理量变化大多与时间有关,也就是关于时间的一个函数。如果我们能让时间变量从计时(t=0)开始连续变化,并能暂停,就可以实现对物理模型和物理过程变化的控制,并能让变化过程暂停,方便对变化过程的观察和分析。
要让Flash动画实现上述功能,就必须对物体的运动状态随时间的变化不断刷新。 在ActionScript 3.0中,ENTER_FRAME事件和Timer事件都可以实现刷新功能,但ENTER_FRAME事件只能以帧频来触发,因此使用它有一定的局限性。例如,由于程序是以本地计算机所允许的最快速度来执行程序,因此使用ENTER_FRAME事件会产生在某些较慢的计算机上事件响应程序执行较慢的情况,而且ENTER_FRAME事件的触发最快为0.008秒。如果我们需要无论在何种计算机上都要有更快的相同时间刷新,此时可以使用ActionScript 3.0的Timer类来实现。Timer类在每次达到指定的时间间隔(最快为0.001秒)时都会触发计时器事件。而且Timer类的计时器方便启动和停止,这就更有利于对运动过程的控制,交互功能更强。
下面就以小球做平抛运动为例来说明Timer计时器的用法。首先要创建一个小球的影片剪辑实例,方法如下:
先在舞台上用Flash绘图工具绘制一个渐变填充的小球,按F8转化为元件,如图1:元件名称为小球,元件类型为影片剪辑;再把舞台上的小球即实例命名为ZD_mc,位置和大小按图2设置;然后在主场景时间轴第一帧输入如下程序代码:
var x0:int = 20;//水平坐标初始值
var y0:int = 20;//竖直坐标初始值
var v0:int = 10;//初速度
var g:Number = 9.8;//重力加速度
ZD_mc.x = x0;//设置ZD_mc水平坐标初始值
ZD_mc.y = y0;//设置ZD_mc竖直坐标初始值
接着创建两个Timer计时器:用第一个计时器myTimer0刷新时间,让时间变量t随系统时间变化,并能暂停,暂停后能接着暂停时刻继续变化;用第二个计时器myTimer1刷新小球的位置,就是要让小球的位置坐标随时间变化。在主场景时间轴第一帧输入如下程序代码:
var t:Number = 0;//创建计时时间(秒)变量并声明为Number数据类型
var t_M:int = 0; //创建记忆时间(毫秒)变量并声明为int数据类型
var t_ms:int = 0; //创建计时时间(毫秒)变量并声明为int数据类型
var nowMS:int = 0;//创建计时时刻(毫秒)变量并声明为int数据类型
var myTimer0:Timer = new Timer(0); //创建Timer计时器每毫秒刷新一次时间
myTimer0.addEventListener(TimerEvent.TIMER,timeStart); //创建Timer事件侦听器
function timeStart(event:TimerEvent):void//创建Timer事件响应函数
{
var newMS = new Date().getTime();//获取新的时刻的毫秒数
t_ms = newMS - nowMS + t_M;//计算新的时刻和计时时刻的时间(毫秒)差
t = t_ms / 1000;//将毫秒转换为秒,即计时时间
}
var myTimer1:Timer = new Timer(0); //创建Timer计时器每毫秒刷新一次位置
myTimer1.addEventListener(TimerEvent.TIMER,motionStrat); //创建Timer事件侦听器
function motionStrat(event:TimerEvent):void//创建Timer事件响应函数
{
ZD_mc.x = x0 + v0 * t;//水平坐标方程
ZD_mc.y = y0 + 0.5 * g * Math.pow(t,2);//竖直坐标方程
}
最后创建控制模块:通过单击窗口、点击按钮或敲击键盘来控制Timer计时器的开始和暂停,就可以控制小球运动的开始和停止了。在主场景时间轴第一帧输入如下程序代码:敲一下Space键小球停止运动,再敲一下小球接着运动。
var k1:int = 1;//声明整型变量并赋值
stage.addEventListener(KeyboardEvent.KEY_DOWN, ctrlFun);//创建键盘事件侦听器
function ctrlFun(e:KeyboardEvent)//创建键盘事件响应函数
{
if (Keyboard.SPACE) //判断是否按下SPACE(空格)键
{
K1++;//整型变量中k1自加1
if (k1%2==0)//判断k1是否是偶数
{
nowMS = new Date().getTime();//获取计时时刻的毫秒数
myTimer0.start();//启动myTimer0计时器
myTimer1.start();//启动myTimer1计时器
}
else//如果k1不是偶数
{
myTimer0.stop();//停止myTimer0计时器
myTimer1.stop();//停止myTimer1计时器
t_M = t_ms;//把计时时间记忆在变量t_M中
}
}
}
以上代码虽然只是制作了小球的基本运动,但我们还可以通过添加Timer事件响应函数或创建多个Timer计时器来增加小球运动的速度大小和方向、位移大小和方向等物理量随时间的变化。还可以利用Timer事件响应函数可以同时执行多个命令和多个Timer计时器可以同时启停,也可单独启停的特点,让Flash课件的交互功能变得很强大,这样就更加有助于老师的课堂教学和学生互动探究。
参考文献:
[1]何红玉,夏文栋.ActionScript 3.0编程基础与范例教程[M].北京:清华大学出版社,2013:80~81