Posted at

[Snippets]スワイプ判定

More than 5 years have passed since last update.


enum定義


enum kSwipeDirection{
kSwipeRight = 1234,
kSwipeLeft,
kSwipeDown,
kNotSwipeTouch,
};



判定メソッドの実装

//スワイプ判定を行う

kSwipeDirection GameScene::getSwipeDirection(Point first ,Point last) {
//距離の計算
//スレッショルドとなる距離以上のスワイプが行われているかを測定する
int distance = sqrt((first.x-last.x)*(first.x-last.x) + (first.y-last.y)*(first.y-last.y));
double rad =atan((last.y-first.y)/(last.x-first.x));
//スレッショルドを50pxにする
if (distance > 100) {
if (first.x < last.x) {
if ( -M_PI/6<rad && rad < M_PI/6 ){
return kSwipeRight;
}
}
if (first.x > last.x) {
if ( -M_PI/6<rad && rad < M_PI/6 ){
return kSwipeLeft;
}
}
}
if (distance > 70) {
if (first.y >last.y) {
if (-2*M_PI/3 < rad && rad < -M_PI/3) {
return kSwipeDown;
}
}
}
return kNotSwipeTouch;
}


最初のポイントはonTouchBegan,最後のポイントはonTouchEndedで取得しておくこと。そして、スワイプの方向の情報を取ったあとは、

一応初期化しておく事

 kSwipeDirection direction;

direction = getSwipeDirection(firstTouchPoint, lastTouchPoint);
//メンバ変数の初期化
firstTouchPoint = Point::ZERO;
lastTouchPoint = Point::ZERO;



タッチポイントはgetLocationでの取得で良いが、DesignResolutionと、OpenGL上(実際の座標)に大きな差が開いたら端末差が大きくなるので、その場合はgetLocationInViewで取ってscalefactorで値調整するなど,考えると良い。