【cocos2dx】モーダルレイヤーを作成する。

レイヤーを重ねると、下の階層のあるメニュー等が反応をしてうまく動作がしないことがあります。 このような現象を防ぐために「モーダルレイヤー」を作成します。

「モーダルレイヤー」とは、簡単に言いますとレイヤーのタッチを優先的に受けることができるレイヤーのことです。 今回は、この「モーダルレイヤー」をcocos2dx Ver3.xで実装をする方法を紹介します。

2014 6 26 fdsas

モーダルレイヤー実装

レイヤーの初期化時に、下記コードを読み出せば「モーダルレイヤー」になります。 [c]

define kModalLayerPriority -1

auto listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); listener->onTouchBegan = ->bool{

return true;

}; auto dip = Director::getInstance()->getEventDispatcher(); dip->addEventListenerWithSceneGraphPriority(listener, this); dip->setPriority(listener, kModalLayerPriority);

[/c]

コードはタッチ処理を行う際に記述に、プライオリティを設定するメソッドを追加しているだけです。 これで完了です。

Ver2.xとの違い

今日、色々と試して見たところ、この記述だけで思ったような動きをしました。 Ver2.xの場合は以下の様なコードが必要でした。 [c] //cocos2dx Ver2.x

define kModalLayerPriority kCCMenuHandlerPriority-1

define kModalLayerMenuPriority kCCMenuHandlerPriority-2

this->setTouchPriority(kModalLayerPriority); this->setTouchEnabled(true); this->setTouchMode(kCCTouchesOneByOne);

//メニューがある場合はこれも追加 menu->setTouchPriority(kModalLayerMenuPriority);

//タッチ処理の記述が必要 bool GameLayer::ccTouchBegan(CCTouchtouch, CCEventevent){

return true;

} [/c]

kCCMenuHandlerPriorityを利用しなくても良くなったこと。 また、Menuクラスにプライオリティを別途設定しなくなったこと。 この2点が変わっているのではないかと思います。