package tools { import flash.display.DisplayObject; import flash.events.TimerEvent; import flash.utils.Timer; public class Earthquake { /** * 参数 */ private var _timer:Timer; private var _displayObject:DisplayObject; private var _originalX:int; private var _originalY:int; private var _intensity:int; private var _intensityOffset:int; /** * 时间 */ private var _seconds:Number; /** * 方向 */ public static const LEFT_RIGHT_UP_DOWN:int = 0; public static const LEFT_RIGHT:int = 1; public static const UP_DOWN:int = 2; /** * 帧频 */ public static const FRAME_RATE:int = 60; /** * 方向 */ private var _direction:int; /** * 震动中 */ private var _bShaking:Boolean = false; /** * 是否自动销毁 */ private var _bDestroy:Boolean = false; /** * 对一个显示对象应用地震效果。 * @param displayObject 抖动对象 * @param intensity 强度 * @param seconds 持续时间 秒 * @param direction 方向 * @param autoDestroy 自动销毁 */ public function Earthquake(displayObject:DisplayObject, intensity:Number = 10, seconds:Number = 1, direction:int = 0, autoDestroy:Boolean = false):void { _displayObject = displayObject; _originalX = displayObject.x; _originalY = displayObject.y; _intensity = intensity; _intensityOffset = intensity / 2; _seconds = seconds; _direction = direction; _bDestroy = autoDestroy; } /** * 开始后抖动 */ public function go():void { if (_bShaking) return; _bShaking = true; var msPerUpdate:int = int(1000 / FRAME_RATE); var totalUpdates:int = int(_seconds * 1000 / msPerUpdate); if (!_timer) { _timer = new Timer(msPerUpdate, totalUpdates); _timer.addEventListener(TimerEvent.TIMER, quake); _timer.addEventListener(TimerEvent.TIMER_COMPLETE, resetImage); } else { _displayObject.x = _originalX; _displayObject.y = _originalY; _timer.reset(); } _timer.start(); } /** * 抖动 * @param event */ private function quake( event:TimerEvent ):void { var newX:int = _originalX; var newY:int = _originalY; switch(_direction) { case LEFT_RIGHT_UP_DOWN: newX = _originalX + Math.random() * _intensity - _intensityOffset; newY = _originalY + Math.random() * _intensity - _intensityOffset; break; case LEFT_RIGHT: newX = _originalX + Math.random() * _intensity - _intensityOffset; break; case UP_DOWN: newY = _originalY + Math.random() * _intensity - _intensityOffset; break; } _displayObject.x = newX; _displayObject.y = newY; } /** * 重置 * @param event */ private function resetImage( event:TimerEvent = null ):void { _displayObject.x = _originalX; _displayObject.y = _originalY; cleanup(); } /** * 清除 */ private function cleanup():void { _bShaking = false; /*_timer = null; _timer.stop();*/ _timer.reset(); if (_bDestroy) { _timer.removeEventListener(TimerEvent.TIMER, quake); _timer.removeEventListener(TimerEvent.TIMER_COMPLETE, resetImage); _timer = null; _displayObject = null; } delete [this]; //_displayObject = null; } } }