问咎儿:[转]由Timer事件驱动的Flash游戏或者动画的暂停方法

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 08:35:22
不久之前,我介绍了通过ACTIVATE和DEACTIVATE事件侦测焦点暂停Flash游戏或动画。
在使用Timer事件来驱动Flash游戏或者动画时,这个方法出现了意料之外的问题。
尽管你会认为,我只想需要停止和重新启动timer计时,然后重置内部计时器就可以了。
假如有一个timer事件每秒钟触发一次,如果暂停游戏,然后在小于1秒的时间内容恢复又暂停游戏,那么这个timer事件将无法再次被触发。
解决方法可以这样做,首先记录timer事件上一次触发到Flash暂停之间的时间差lapTime,用户恢复timer事件时,将timer的delay设置为普通计时器的delay与这个时间差lapTime之间的差值。
下面的代码可以说明“普通计时器”与“精确计时器”的差别:
Java代码  
  1. package {   
  2.         import flash.display.Sprite;   
  3.         import flash.utils.Timer;   
  4.         import flash.utils.getTimer;   
  5.         import flash.events.TimerEvent;   
  6.         import flash.text.TextField;   
  7.         import flash.text.TextFormat;   
  8.         import flash.events.Event;   
  9.         import flash.text.TextFieldAutoSize;   
  10.         public class pauseTimer extends Sprite {   
  11.                 // the interval between two ticks, in milliseconds   
  12.                 private var interval:int=1000;   
  13.                 // the "normal" timer   
  14.                 private var normalTimer:Timer;   
  15.                 // the "smart" timer   
  16.                 private var smartTimer:Timer;   
  17.                 // just some text field related variables   
  18.                 private var normalTimerText:TextField = new TextField();   
  19.                 private var smartTimerText:TextField = new TextField();   
  20.                 private var normalTextFormat:TextFormat = new TextFormat();   
  21.                 private var smartTextFormat:TextFormat = new TextFormat();   
  22.                 // the "movie paused" screen   
  23.                 private var pausedScreen:pausedMc=new pausedMc();   
  24.                 // variables used to handle the smart timer   
  25.                 private var lapTime:Number=0;   
  26.                 private var currentTimer:Number=0;   
  27.                 public function pauseTimer() {   
  28.                         // nothing interesting, only some layout settings   
  29.                         normalTextFormat.size=24;   
  30.                         normalTextFormat.color=0xA90000;   
  31.                         smartTextFormat.size=24;   
  32.                         smartTextFormat.color=0x00A900;   
  33.                         addChild(normalTimerText);   
  34.                         normalTimerText.autoSize=TextFieldAutoSize.LEFT;   
  35.                         addChild(smartTimerText);   
  36.                         smartTimerText.autoSize=TextFieldAutoSize.LEFT;   
  37.                         addChild(pausedScreen);   
  38.                         smartTimerText.y=50;   
  39.                         // timer initialization   
  40.                         normalTimer=new Timer(interval);   
  41.                         smartTimer=new Timer(interval);   
  42.                         // timer listeners   
  43.                         normalTimer.addEventListener(TimerEvent.TIMER, showNormalTime);   
  44.                         smartTimer.addEventListener(TimerEvent.TIMER, showSmartTime);   
  45.                         // activate/deactivate listeners   
  46.                         addEventListener(Event.ACTIVATE,onActivate);   
  47.                         addEventListener(Event.DEACTIVATE,onDeactivate);   
  48.                 }   
  49.                 private function showNormalTime(e:TimerEvent):void {   
  50.                         // just showing the number of ticks   
  51.                         normalTimerText.text="Normal counter: "+normalTimer.currentCount+" ticks counted";   
  52.                         normalTimerText.setTextFormat(normalTextFormat);   
  53.                 }   
  54.                 private function showSmartTime(e:TimerEvent):void {   
  55.                         // set the delay to "interval" value if it has a different value (it will happen)   
  56.                         if (smartTimer.delay!=interval) {   
  57.                                 smartTimer.delay=interval;   
  58.                         }   
  59.                         // saving the current timer   
  60.                         currentTimer=getTimer();   
  61.                         smartTimerText.text="Smart counter: "+smartTimer.currentCount+" ticks counted";   
  62.                         smartTimerText.setTextFormat(smartTextFormat);   
  63.                 }   
  64.                 private function onActivate(e:Event):void {   
  65.                         pausedScreen.visible=false;   
  66.                         // smart timer delay management   
  67.                         if (smartTimer.delay-lapTime>0) {   
  68.                                 smartTimer.delay=smartTimer.delay-lapTime;   
  69.                         }   
  70.                         // saving the curren time   
  71.                         currentTimer=getTimer();   
  72.                         // starting the timers   
  73.                         normalTimer.start();   
  74.                         smartTimer.start();   
  75.                 }   
  76.                 private function onDeactivate(e:Event):void {   
  77.                         pausedScreen.visible=true;   
  78.                         // stopping the timers   
  79.                         normalTimer.stop();   
  80.                         smartTimer.stop();   
  81.                         // determining how much time has passed since the last tick   
  82.                         lapTime=(getTimer()-currentTimer);   
  83.                         smartTimerText.text="Smart counter: "+smartTimer.currentCount+" ticks counted and "+(smartTimer.delay-lapTime)+"ms to next tick";   
  84.                         smartTimerText.setTextFormat(smartTextFormat);   
  85.                 }   
  86.         }   
  87. }