レイヤーを重ねると、下の階層のあるメニュー等が反応をしてうまく動作がしないことがあります。 このような現象を防ぐために「モーダルレイヤー」を作成します。
「モーダルレイヤー」とは、簡単に言いますとレイヤーのタッチを優先的に受けることができるレイヤーのことです。 今回は、この「モーダルレイヤー」をcocos2dx Ver3.xで実装をする方法を紹介します。
モーダルレイヤー実装
レイヤーの初期化時に、下記コードを読み出せば「モーダルレイヤー」になります。 [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点が変わっているのではないかと思います。