gpt4 book ai didi

c++ - 我是否需要为每个要检测的 Sprite 设置 addEventListenerWithSceneGraphPriority?

转载 作者:行者123 更新时间:2023-11-30 01:54:52 25 4
gpt4 key购买 nike

我想检测哪个 Sprite 被触摸了。如果我这样做:

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());

Sprite 检测正常。

问题是我在层上有大约 20 个 Sprite ,我需要能够检测到它们我需要设置吗

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

对于每个 Sprite ?

最佳答案

不,您不需要为所有 Sprite 添加 eventListener。

您需要一个 Sprite 父节点的事件监听器。

试试这个:

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-index 的 Sprite (如果它们重叠)。

希望这对您有所帮助。

关于c++ - 我是否需要为每个要检测的 Sprite 设置 addEventListenerWithSceneGraphPriority?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21475075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com