cocos2d-x タッチ判定 | 渋谷で働くUnity野郎

渋谷で働くUnity野郎

備忘録として有効活用していきます。

cocos2d-xのタッチ判定を作成したクラスに付与したいことってありますよね。
調べてもなかなか良い文献がなかったので書くことにしました。

各タッチ判定は次の通り

シングルタッチ
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

マルチタッチ
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesCancelled(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);

これらのタッチは基本的にCCLayerを継承していれば使用できます。
仮にどうしてもCCLayerを継承したくない人は、

シングルタッチ
class Hoge : public CCTargetedTouchDelegate {

}

マルチタッチ
class Hoge : public CCStandardTouchDelegate {

}

CCTargetedTouchDelegateまたはCCStandardTouchDelegateを継承してください。

さて、CCLayerまたは、上記で挙げたものを継承した上でどういうプログラムを書けばよいのか。
ステップは2段階です。

まずはこれからタッチイベントをリスナする宣言をします。
次に、そのタッチイベントを実装します。

意外と単純明快。

まずシングルタッチから。

コンストラクタやイニシャライザで
CCTouchDispatcher *dispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
dispatcher->addTargetedDelegate(this, -1, false);

これでリスナとしての登録完了です。
ちなみに赤字の部分がtrueの時は、他のクラスのリスナが効力を発揮しなくなります。
私の場合、HelloWorldSceneクラスのccTouchesBeganなどのマルチタッチが全て反応しなくなり、2時間ほど格闘することになったので注意してください。

さて、あとはタッチイベントの実装ですが、ヘッダに

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event) {
CCLog("touched!");
return false;
};

virtual void ccTouchMoved(CCTouch* touch, CCEvent* event) {
CCLog("moved");
};

virtual void ccTouchEnded(CCTouch* touch, CCEvent* event) {
CCLog("ended");
};

こんな感じで記述すればOKです。
ccTouchBeganの戻り値に真偽値を返してますが、falseの時MovedやEndedは実行されません。
Beganだけで処理が事足りる場合に使う感じですね。

次にマルチタッチですが、はじめの初期化部分が違います。
CCTouchDispatcher *dispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
dispatcher->addStandardDelegate(this, 0);

これでOK.
あとはヘッダに
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesCancelled(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
を宣言して、cppに実装コードを記述してください。


ちなみにHelloWorldSceneクラスに関しては、シングルタッチの処理は上記のようにする必要がありますが、マルチタッチについてはリスナの登録が必要ありません。
初めからされてるんですかね?
私はリスナの登録しようとして、何度もエラーを吐かれ諦めかけたのでお気をつけください。

お役に立てれば幸いです。