Я хочу определить, какой спрайт был затронут.
если я сделаю :
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);
для каждого спрайта?
Нет, вам не нужно добавлять 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-индексом на месте (если они перекрываются).
Надеюсь, это поможет.
Да, вы должны добавить 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;
}
Надеюсь, что это работает для вас