detect a gesture of circle[円のジェスチャーを検出する]
/**
* Copyright selflash ( http://wonderfl.net/user/selflash )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/glUl
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
public class FlashTest extends Sprite {
private var _count:uint = 0;
private var _text:TextField;
public function FlashTest() {
GestureDetector.init(stage);
GestureDetector.start();
GestureDetector.threshold = 10;
GestureDetector.addEventListener("sucess", _eventHandler);
GestureDetector.addEventListener("miss", _eventHandler);
_text = new TextField();
_text.x = 100;
_text.y = 100;
addChild(_text);
stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseEventHandler);
graphics.lineStyle(1, 0x000000);
graphics.moveTo(mouseX, mouseY);
}
private function _eventHandler(event:Event):void {
switch(event.type) {
case "sucess":
_count ++;
_text.text = "" + _count;
break;
case "miss":
graphics.clear();
graphics.lineStyle(1, 0x000000);
graphics.moveTo(mouseX, mouseY);
break;
}
}
private function _mouseEventHandler(event:MouseEvent):void {
switch(event.type) {
case MouseEvent.MOUSE_MOVE:
graphics.lineTo(mouseX, mouseY);
break;
}
}
}
}
/**
* jp.selflash.GestureDetector
*
* @author yooKo@selflash
* @version 2.1.0
* @date 2009/11/03
* @see http://selflash.jp/
*
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
import flash.display.Shape;
import flash.display.Stage;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* stage上のマウスの動きに反応して登録した処理を実行させるクラスです.
* 外部から実行可能なメソッドに init(); start(); stop(); dispatchEvent(); addEventListener(); removeEventListener();
*
* このクラスの使い方
* initメソッドでタイマーを生成して開始します.
* このクラスの内部でstage上のマウスの動きを監視していますのでinit()の引数にstageを渡してください.
*
* @example
* <listing version="3.0">
*
* import jp.selflash.GestureDetector;
* // GestureDetectorでマウスの動きを監視する
* GestureDetector.init(stage);
* GestureDetector.start();
* GestureDetector.threshold = 10;
* GestureDetector.addEventListener("sucess", _eventHandler);
* GestureDetector.addEventListenr("miss", _eventHandler);
*
* GestureDetector.stop();
*
* </listing>
*/
class GestureDetector {
public static var threshold:Number = 20;
private static var _dispatcher:EventDispatcher = new Shape();
private static var _stage:Stage;
private static var _timer:Timer;
/**
* コンストラクタを直接呼び出すことはできません..必ずエラーを返します.
* @throws Error #2012: GestureDetector クラスを直接インスタンス化することはできません.
*/
public function MouseController(internalCallEnforcer:InternalCallEnforcer = null):void {
if(!internalCallEnforcer) throw new ArgumentError("Error #2012: GestureDetector クラスを直接インスタンス化することはできません.");
}
/**
* クラスの初期化を行います.
* @param stage ステージの参照です.
* @param sensitivity 感度の設定. 50~100を推奨します.
* @param output swichの状況を常に出力するか否か.trueにすると処理が重くなります.
*/
public static function init(stage:Stage, sensitivity:Number = 50):void {
_stage = stage;
_timer = new Timer(sensitivity);
_timer.addEventListener(TimerEvent.TIMER, _onTimerHandler);
//_timer.start();
}
/** MouseController でのマウスの監視を開始します..停止させるには stop() を用います. */
public static function start():void { _timer.start(); }
/** MouseController でのマウスの監視を停止します..開始させるには start() を用います. */
public static function stop():void { _timer.stop(); }
/** */
public static function dispatchEvent($event:Event):void {
_dispatcher.dispatchEvent($event);
}
/** */
public static function addEventListener($type:String, $listener:Function, $useCapture:Boolean = false, $priority:int = 0, $useWeakReference:Boolean = false):void {
_dispatcher.addEventListener($type, $listener, $useCapture, $priority, $useWeakReference);
}
/** */
public static function removeEventListener($type:String, $listener:Function, $useCapture:Boolean = false):void {
_dispatcher.removeEventListener($type, $listener, $useCapture);
}
private static var _swich:int; // 4段階のスイッチです. スイッチは 0→1→2→3 か 0→4→5→6 の順に入っていきます.
private static var _mouseX:Number; // 前回のマウスのx座標を記録しておく.
private static var _mouseY:Number; // 前回のマウスのy座標を記録しておく.
private static var _distanceX:Number; // マウスのx座標の移動距離
private static var _distanceY:Number; // マウスのy座標の移動距離
private static var _dX:int; // _distanceXの絶対値
private static var _dY:int; // _dixtanceYの絶対値
private static function _onTimerHandler($event:TimerEvent = null):void {
_distanceX = _stage.mouseX - _mouseX; /* xの移動幅を求める */
_distanceY = _stage.mouseY - _mouseY; /* yの移動幅を求める */
_mouseX = _stage.mouseX; /* mouseのx座標をとっておく */
_mouseY = _stage.mouseY; /* mouseのy座標をとっておく */
_dX = Math.abs(_distanceX); /* xの移動幅の絶対値を求める */
_dY = Math.abs(_distanceY); /* yの移動幅の絶対値を求める */
switch(_swich) {
case 0:
if (_dX < _dY && _dY > threshold) { /* yの移動幅の方が大きくかつ20px以上動いた時は switch を 1 に入れる */
_swich = 1;
} else if (_dX > _dY && _dX > threshold) { /* xの移動幅の方が大きくかつ20px以上動いた時は switch を 5 に入れる */
_swich = 5;
}
break;
case 1:
if (_dX > _dY && _dX > threshold) { /* xの移動幅の方が大きくかつ20px以上動いた時は switch を 2 に入れる */
_swich = 2;
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
case 2:
if (_dX < _dY && _dY > threshold) { /* yの移動幅の方が大きくかつ20px以上動いた時は switch を 3 に入れる */
_swich = 3;
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
case 3:
if (_dX > _dY && _dX > threshold) { /* xの移動幅の方が大きくかつ20px以上動いた時 */
_swich = 0; /* switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("sucess"));
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
case 5:
if (_dX < _dY && _dY > threshold) { /* yの移動幅の方が大きくかつ20px以上動いた時は switch を 6 に入れる */
_swich = 6;
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
case 6:
if (_dX > _dY && _dX > threshold) { /* xの移動幅の方が大きくかつ20px以上動いた時は switch を 7 に入れる */
_swich = 7;
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
case 7:
if (_dX < _dY && _dY > threshold) { /* yの移動幅の方が大きくかつ20px以上動いた時 */
_dispatcher.dispatchEvent(new Event("sucess"));
} else {
_swich = 0; /* 条件を満たしていなければ switch を 0 に戻す */
_dispatcher.dispatchEvent(new Event("miss"));
}
break;
}
}
}
/**
* 内部からのみコンストラクタを呼び出すためのクラス
*/
internal class InternalCallEnforcer{}