package { import flash.display.Sprite; import flash.display.Graphics; import flash.events.MouseEvent; import flash.geom.Point; import flash.text.TextField; [ SWF( width = "465" , height = "465" , backgroundColor = "0xFFFFFF" , frameRate = "60" ) ] public class MouseGesture extends Sprite { private var _startPoint : Point; private var _nextPoint : Point; private var _baseDistance : Number; private var _tempDirection : String; private var _direction : String; private var _sp : Sprite; private var _tf : TextField; /*======================================================================*//** * コンストラクタ */ public function MouseGesture() { _tempDirection = ""; _direction = ""; _baseDistance = 20; _tf = new TextField(); _tf.wordWrap = true; _tf.selectable = false; _tf.width = 445; _tf.height = 445; _tf.x = 10; _tf.y = 10; _tf.text = "マウスの左ボタンを押しながらカーソルを動かしてね。"; addChild( _tf ); _sp = new Sprite; addChild( _sp ); stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); } /*======================================================================*//** * マウスダウン */ private function mouseDownHandler( e:MouseEvent ):void { var _color : Number = Math.random() * 0xffff00; _startPoint = new Point( stage.mouseX , stage.mouseY ); _direction = "Gesture : "; _sp.graphics.lineStyle( 2 , _color , 1.0 ); _sp.graphics.moveTo( _startPoint.x , _startPoint.y ); stage.addEventListener( MouseEvent.MOUSE_MOVE , mouseMoveHandler ); stage.addEventListener( MouseEvent.MOUSE_UP , mouseUpHander ); } /*======================================================================*//** * マウスムーヴ */ private function mouseMoveHandler( e:MouseEvent ):void { _nextPoint = new Point( stage.mouseX , stage.mouseY ); var _distance : Number = Point.distance( _startPoint , _nextPoint ); // 一定の距離で線を描画、方向判定 if ( Math.abs( _distance ) > _baseDistance ) { _sp.graphics.lineTo( _nextPoint.x , _nextPoint.y ); putDirection(); _startPoint = new Point( stage.mouseX , stage.mouseY ); } } /*======================================================================*//** * マウスアップ */ private function mouseUpHander( e:MouseEvent ):void { _sp.graphics.clear(); stage.removeEventListener( MouseEvent.MOUSE_MOVE , mouseMoveHandler ); stage.removeEventListener( MouseEvent.MOUSE_UP , mouseUpHander ); } /*======================================================================*//** * 角度から方向を割りだす */ private function putDirection():void { var _vector:Point = _nextPoint.subtract( _startPoint ); var _angle : Number = Math.atan2( _vector.y , _vector.x ) * 180 / Math.PI; if ( _angle >= 45 && _angle < 125 ) _tempDirection = "↓"; else if ( _angle >= 125 || _angle < -125 ) _tempDirection = "←"; else if ( _angle >= -45 && _angle < 45 ) _tempDirection = "→"; else if ( _angle >= -125 && _angle < -45 ) _tempDirection = "↑"; if ( _direction.substr( _direction.length - 1 , 1 ) != _tempDirection ) _direction += _tempDirection; _tf.text = _direction; } } } Mouse Gesture