Cocos2d-x 3.0遮蔽下層觸控
阿新 • • 發佈:2019-02-18
Cocos2d-x從3.0版本以來,觸控機制有所改變,雖然實現的道理沒有變,不過我今天還是寫出這篇文章,就當是簡單的複習一下3.0的事件分發機制吧,同時把自己在研究的過程中遇到的問題分享出來。這裡採用的方法是最簡單,最直接的方法,整體的思路是這樣的。設定觸控監聽器吞噬觸控,然後在回撥函式onTouchBegan中返回true,同時確保這個層的觸控優先順序大於你要遮蔽的層的優先順序。也許這種方法不能滿足你得需求,那就請自行研究或者看下其他部落格,或者給我留言共同探討吧。在實現中我們肯定會遇到的就是遮蔽選單,讓選單變的不可點選,那我就寫一個簡單的場景,裡邊加入選單,然後加入一個層來遮蔽掉下層的觸控。
bool CreateGame::init() { if(!Layer::init()) return false; //UI auto size = Director::getInstance()->getWinSize(); Vector<MenuItem *> itemVector; for(int i=1;i<4;i++) { auto item = MenuItemImage::create("no_people.png","people.png"); item->setTag(i); itemVector.pushBack(item); } auto menu1 = Menu::createWithArray(itemVector); menu1->alignItemsHorizontallyWithPadding(10); menu1->setPositionY(size.height*0.75); this->addChild(menu1); auto swallowTouch = SwallowTouch::create(); this->addChild(swallowTouch); return true; }
這裡在最後添加了一個層,這個層就是用來遮蔽觸控的,大家要注意新增這個層的位置,這個層是最後新增進來的,也就是說它要顯示的話是顯示在最前邊的,這個和接下來的遮蔽觸控有聯絡。以下是這個層的init函式。
程式碼很簡單,只是添加了一個事件監聽器,設定這個事件監聽器吞噬掉觸控,在onTouchBegan回撥函式中返回了true。最主要的東西是將事件監聽器新增到分發器中的程式碼,這裡可以選擇倆種方式來做,如果選擇的是第一種,第二個引數是要求我們來將這個事件監聽器和一個node繫結,什麼是和node繫結,就是這個node對觸控的處理是和這個listener一樣的,比如觸控的優先順序,接受到觸控以後的處理程式碼,或者說這個listener來處理node接受到得觸控訊息。這個時候Listener的優先順序就是繫結的node的顯示優先順序,就是誰顯示在場景的前面,誰先接受到觸控訊息,所以在主場景的程式碼中,我們要把建立這個layer的程式碼放到後邊,這樣的話才會優先順序高,才會首先收到觸控訊息。bool SwallowTouch::init() { if(!LayerColor::initWithColor(Color4B(100,100,100,100))) return false; auto label = Label::createWithTTF("touch!","fonts/Marker Felt.ttf",32); label->setPosition(Point(350,800)); this->addChild(label); auto callback = [](Touch * ,Event *) { return true; }; auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = callback; listener->setSwallowTouches(true); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this); //_eventDispatcher->addEventListenerWithFixedPriority(listener,-1); return true; }