1. 程式人生 > >Cocos2d-x 3.0遮蔽下層觸控

Cocos2d-x 3.0遮蔽下層觸控



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函式。

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;
}
程式碼很簡單,只是添加了一個事件監聽器,設定這個事件監聽器吞噬掉觸控,在onTouchBegan回撥函式中返回了true。最主要的東西是將事件監聽器新增到分發器中的程式碼,這裡可以選擇倆種方式來做,如果選擇的是第一種,第二個引數是要求我們來將這個事件監聽器和一個node繫結,什麼是和node繫結,就是這個node對觸控的處理是和這個listener一樣的,比如觸控的優先順序,接受到觸控以後的處理程式碼,或者說這個listener來處理node接受到得觸控訊息。這個時候Listener的優先順序就是繫結的node的顯示優先順序,就是誰顯示在場景的前面,誰先接受到觸控訊息,所以在主場景的程式碼中,我們要把建立這個layer的程式碼放到後邊,這樣的話才會優先順序高,才會首先收到觸控訊息。