Нужно ли устанавливать addEventListenerWithSceneGraphPriority для каждого спрайта, который я хочу обнаружить?

Я хочу определить, какой спрайт был затронут.
если я сделаю :

auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), mySprite);

и тогда в моем методе касания я делаю:

bool HelloWorld::onTouchBegan(Touch* touch, Event* event)
auto spriteBlock = static_cast<Block*>(event->getCurrentTarget());

спрайт обнаружен нормально.

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

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), mySprite);

для каждого спрайта?

1

Решение

Нет, вам не нужно добавлять eventListener для всех спрайтов.

Вам нужен прослушиватель событий для родительского узла спрайтов.

Попробуй это:

bool HelloWorld::onTouchBegan(Touch *touch, Event *event) {
Node *parentNode = event->getCurrentTarget();
Vector<Node *> children = parentNode->getChildren();
Point touchPosition = parentNode->convertTouchToNodeSpace(touch);
for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
Node *childNode = *iter;
if (childNode->getBoundingBox().containsPoint(touchPosition)) {
//childNode is the touched Node
//do the stuff here
return true;
}
}
return false;
}

Это итерация в обратном порядке, потому что вы коснетесь спрайта с самым высоким z-индексом на месте (если они перекрываются).

Надеюсь, это поможет.

4

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

Да, вы должны добавить EventListener для каждого спрайта
и обнаруживать прикосновения на каждом
Вы должны добавить это в функции начала касания

bool OwlStoryScene0::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event) {
cocos2d::Touch *touched = (Touch *) touch;
Point location = touched->getLocationInView();
location = Director::getInstance()->convertToGL(location);
auto target = static_cast<Sprite*>(event->getCurrentTarget());
Point locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);
if (rect.containsPoint(locationInNode)  && target == SPRITE) {
//DoSomething
}
else if (rect.containsPoint(locationInNode) && target == SPRITE) {
//DoSomething
}
return false;
}

Надеюсь, что это работает для вас

0