Обработка касаний на дочернем слое Cocos2d-x

Я добавил слой как ребенок в сцене. Я хочу, чтобы при касании любого спрайта на этом дочернем слое касание не переходило на родительский слой.
Я написал следующий код для регистрации событий касания, но касания все еще идут к родительскому слою, а не возвращаются из него.

void onEnter()
{
Layer::onEnter();

// Register Touch Event
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();

listener->setSwallowTouches(true);

listener->onTouchBegan = CC_CALLBACK_2(onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(onTouchEnded, this);

dispatcher->addEventListenerWithSceneGraphPriority(listener, _cancelLayer);
}

Здесь _cancelLayer — это имя моего дочернего слоя. Пожалуйста, кто-нибудь расскажет, что не так с этим кодом? Я не зарегистрировал никакого события касания с родительским слоем, но когда я касаюсь родительского слоя, он все еще входит в функции касания.

Примечание. Размер дочернего слоя намного меньше родительского.

В touchBegin я ничего не делаю, я просто хочу использовать его для ограничения касаний для перемещения на родительский слой.

bool HeaderTableView::onTouchBegan(Touch *pTouch, Event *pEvent)
{
return true;
}

0

Решение

TouchEventListener будет реагировать на прикосновения на весь экран, поэтому вам нужно проверить, находится ли касание в нужной ограничительной рамке, например

bool HeaderTableView::onTouchBegan(Touch *pTouch, Event *pEvent)
{
Vec2 touchLocation = pTouch->getLocation(); // Get the touch position
touchLocation = _cancelLayer->getParent()->convertToNodeSpace(touchLocation);
Rect bBox = _cancelLayer->getBoundingBox();
return bBox.containsPoint(touchLocation);
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector