Cocos2d-xでジェスチャー取得

poowww(プログラマー)
がんばります。

はじめまして初投稿です。
よろしくおねがいします

Cocos2d-xでタップとかロングタップとかスワイプなどのジェスチャーを取得したいと思います。

Cocos2d-xにはデフォルトだとジェスチャーを取得するイベントリスナーが存在しません。
タップやスワイプの取得について軽くググると下記のXTLayerが出てきました。
http://www.cocos2d-x.org/boards/6/topics/23011
が、、、、
このXTLayerは2系で書かれていますしLayer拡張です。

これを参考に3系のコードに書き換えてもいいのですが、3系ではタッチイベントはLayerではなくEventListenerで取得しますからこっちに合わせたいところ。
ということで、自分で書くことにしました。

仕様とか

そもそもタップとはなんなのか。
とりあえずそれぞれこんな感じに定義しました。

・タップ

タッチ時間がロングタップ閾値時間より短く、タップ中の移動距離がスワイプ閾値距離より短い場合。

ロングタップ

タッチ中の移動距離がスワイプ閾値距離を超えない間に、タッチを開始してからロングタップ閾値時間以上経過した場合。

・スワイプ

ロングタップ閾値時間内にタッチ中の移動距離がスワイプ閾値距離を超えた場合。 スワイプの方向は上下左右の4方向。

実装

コードはこちら。
https://github.com/Poowww/EventListenerGesture
テスト環境はCocos2d-x3.4です。
3系ならどれでも動くと思うのですが、もし動かなかったりバグってたりしたら教えて下さい。

使い方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
auto listener = EventListenerGesture::create();

//if dont set this value is 0.5f.
listener->setLongTapThreshouldSeconds(1.0f);
//if dont set this value is 100.0f.
listener->setSwipeThreshouldDistance(150.0f);
listener->onTap = [](Vec2 vec2){log("onTap called.");};
listener->onLongTapBegan = [](Vec2 vec2){log("onLongTapBegan called.");};
listener->onLongTapEnded = [](Vec2 vec2){log("onLongTapEnded called.");};
listener->onSwipe = [](EventListenerGesture::SwipeDirection direction)
{
   switch (direction) {
       case EventListenerGesture::SwipeDirection::UP:
           log("Swipe UP.");
           break;
       case EventListenerGesture::SwipeDirection::DOWN:
           log("Swipe DOWN.");
           break;
       case EventListenerGesture::SwipeDirection::RIGHT:
           log("Swipe RIGHT.");
           break;
       case EventListenerGesture::SwipeDirection::LEFT:
           log("Swipe LEFT.");
           break;
       default:
           break;
   }
};

getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

こんな感じでどうでしょうか
ぼくのかんがえたさいきょうのじぇすちゃーりすなー募集中です。