Help us understand the problem. What is going on with this article?

[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で値調整するなど,考えると良い。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away