2014年9月7日日曜日

cocos2d-x v3系のLayerタッチイベント登録方法

cocos2d-x v3系でLayerのタッチイベントを設定するのは、旧来(v2系)の方法も残っているようですが、今後はEventDispatcherを使って設定するのが推奨されています。

1つのタッチ毎にイベントが飛んでくる方式(TouchOneByOne)の場合ですと、Layerサブクラスのinit()メソッドなどの中で、以下のような設定をします。GameSceneというのは自分で作ったLayerサブクラスの名前です。
// レイヤータッチイベント登録
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = std::bind(&GameScene::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2);
listener->onTouchEnded = std::bind(&GameScene::onTouchEnded, this, std::placeholders::_1, std::placeholders::_2);
listener->onTouchMoved = std::bind(&GameScene::onTouchMoved, this, std::placeholders::_1, std::placeholders::_2);
listener->onTouchCancelled = std::bind(&GameScene::onTouchCancelled, this, std::placeholders::_1, std::placeholders::_2);
    
getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);


onTouchBeganやonTouchEndedなどのメソッドは、Layerクラスのヘッダファイルにvirtual宣言されていますが、実のところこのメソッドを使わなくても自分オリジナルのメソッドでも良いです。(メソッドの返り値と、引数のタイプは合わせてね)

上記、std::bindの部分は、CC_CALLBACK_2というマクロを使えば、もっとスッキリ書くことができます。ただ、将来的な応用力&理解力をつけるためにも、ここはがんばってstd::bindを使ってみることをオススメします。いざという時に助かることもあるでしょう。

listenerに登録しているメソッドは、onTouchBeganを登録してさえあればOKで、他のEnded、Moved、Cancelledイベントは、必要なければ登録しなくても構いません。
Ended、Moved、Cancelledのどれか一つでもメソッドを登録する場合は、Beganも登録してください。

レイヤーが削除されると、イベントは自動で破棄されるのか、実は調べてないのですが(汗)、僕はデストラクタで以下のような感じで削除しておくようにしています。
GameScene::~GameScene()
{
    getEventDispatcher()->removeEventListenersForTarget(this);
}

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...