Timer事件在Flash物理课件中的妙用

发表时间:2021/3/24   来源:《中国教师》2020年5月14期   作者:郑均
[导读] 用Flash动画来构建物理模型和模拟物理过程,怎样才能更好地实现各物理量随时间的变化,并方便控制,利用Flash课件强大的交互功能更好地辅助物理教学呢?
        郑均
        四川省广元市实验中学 四川省广元市 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
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: