之前项目中用到的一个类,重写了影片剪辑的play、stop、gotoAndPlay、gotoAndStop方法,可以通过设置delay来改变元件的播放速度。
代码如下。
package { import flash.display.MovieClip; import flash.events.TimerEvent; import flash.utils.Timer; /** * ... * @author hanyeah * 重写play、stop、gotoAndPlay、gotoAndStop方法,可以通过设置delay来改变元件的帧频 */ public class HMovieClip extends MovieClip { private var _delay:Number = 40; private var _timer:Timer; private var _time:Number; public function HMovieClip() { super.stop(); _time = new Date().getTime(); _timer = new Timer(_delay, 0); _timer.addEventListener(TimerEvent.TIMER, onTimerHandler); _timer.start(); } //----------------------------------------- override public function play():void { _time = new Date().getTime(); _timer.start(); } override public function stop():void { _timer.stop(); } override public function gotoAndPlay(frame:Object, scene:String = null):void { super.gotoAndStop(frame, scene); _time = new Date().getTime(); _timer.start(); } override public function gotoAndStop(frame:Object, scene:String = null):void { super.gotoAndStop(frame, scene); _timer.stop(); } //-------------------------------------- /** * 设置delay,两帧之间的时间间隔,1000/delay即帧频 */ public function get delay():Number { return _delay; } public function set delay(value:Number):void { _delay = value; _timer.delay = _delay; } //-------------------------------------- private function onTimerHandler(e:TimerEvent):void { //trace(currentFrame); var _curTime:Number = new Date().getTime(); var _lastTime:Number = _time; var dif:Number = _curTime-_time; if (dif >= delay) { var n:int = int(dif / delay); var curF:int = (currentFrame + n) % (totalFrames + 1); gotoAndPlay(curF); _time = _lastTime +n*delay; } } } }
写的略微麻烦,其实没必要用Date,由于某个项目需要精确计时,所以改用了Date来做计时器。
可以直接让影片剪辑继承该类,需要改变影片剪辑的播放速度时,设置delay属性就可以了,其它和普通影片剪辑完全一样。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。