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 件のコメント:
コメントを投稿