1.12. 长时间执行一个任务

tag:ActionScript 3 CookBook 简体中文

1.12. 长时间执行一个任务
 
问题
我要长时间执行一个任务
解决办法
使用 Timer 类,或者监听 sprite 的 enterFrame 事件
讨论
 
Timer 类是ActionScript 3.0新增的, 来代替早期的 setInterval( ) 和 setTimeout( ) 函数。当创建Timer类的实例时,它会在每个时间间隔激活 timer 事件,你可以在事件之间指定延时,然后就有足够的时间去激活 Timer 构造器了:
var timer:Timer = new Timer(delay, repeatCount);
使用 addEventListener 来设置一个函数处理这个事件,然后使用timer的 start( ) 方法启动或stop( ) 停止它。
Timer 类属于 flash.utils 包,还有 TimerEvent 类在 flash.events 包中,因此需要导入它们:
package ...{
    import flash.display.Sprite;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    
    public class ExampleApplication extends Sprite ...{
       
        private var _PreviousTime:Number = 0;
        
        public function ExampleApplication(  ) ...{
            var tTimer:Timer = new Timer(500, 10);
            tTimer.addEventListener(TimerEvent.TIMER, onTimer);
            tTimer.start(  );
        }
        
        private function onTimer(event:TimerEvent):void ...{
            trace(flash.utils.getTimer(  ) - _PreviousTime);
            _PreviousTime = flash.utils.getTimer(  ); 
        }
    }
}
getTimer( ) 函数已经被移动到flash.utils 包中了。它返回程序开始有到现在的相对时间(微妙)
上个例子中,事件每隔5毫秒激活一次。如果你想模拟setInterval( ) 函数,把重复次数设为0。 stop( ) 方法类似于clearInterval( ) 函数,停止定时器.
如果想模拟 setTimeout( ) 函数,设置重复数为1,定时器等到指定时间激活一次事件,然后停止。
Timer类最好的用处就是创建动画而不依赖于影片帧速。看下面的例子,两个定时器时间间隔分别为50微妙和100微妙:
package ...{
    import flash.display.Sprite;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    
    public class ExampleApplication extends Sprite ...{
        private var _square:Sprite;
        private var _circle:Sprite;
        
        
        public function ExampleApplication(  ) ...{
            // 创建两个图形
            _square = new Sprite(  );
            _square.graphics.beginFill(0xff0000);
            _square.graphics.drawRect(0, 0, 100, 100);
            _square.graphics.endFill(  );
            addChild(_square);
            _square.x = 100;
            _square.y = 50;
            
            _circle = new Sprite(  );
            _circle.graphics.beginFill(0x0000ff);
            _circle.graphics.drawCircle(50, 50, 50);
            _circle.graphics.endFill(  );
            addChild(_circle);
            _circle.x = 100;
            _circle.y = 200;
            
            // 创建两个定时器,启动
            var squareTimer:Timer = new Timer(50, 0);
            squareTimer.addEventListener(TimerEvent.TIMER, onSquareTimer);
            squareTimer.start(  );
            
            var circleTimer:Timer = new Timer(100, 0);
            circleTimer.addEventListener(TimerEvent.TIMER, onCircleTimer);
            circleTimer.start(  );
        }
        
        // 定义两个事件句柄
        private function onSquareTimer(event:TimerEvent):void ...{
            _square.x++;
        }
        
        private function onCircleTimer(event:TimerEvent):void ...{
            _circle.x++;
        }
    }
}
当然用enterFrame 事件也可以实现的,但Timer 技术更加灵活。 

加支付宝好友偷能量挖...


评论(0)网络
阅读(72)喜欢(0)flash/flex/fcs/AIR