我正在写一个cocos2d-x应用程序。我有一个带有几个孩子精灵的精灵。这些精灵代表屏幕上的一个逻辑对象,它被转换为整个对象。现在,当触摸对象时,我需要发现哪些子精灵被触摸了。
问题在于,虽然父精灵为我提供了当前所有的信息(边界框,缩放,旋转等),但子精灵仍保留原始数字,尽管与父母一起转换,我无法弄清楚计算孩子们“真实”维度的正确方法。
在我看来,两个事实导致了所有困难:
以下是这种情况的图纸:
因此,总而言之,为了检查触摸是否触及子精灵,我需要根据父变换来计算子节点的当前边界框。我可以计算孩子的缩放和旋转,但我不知道它应该相对于父的位置,因为父的边界框与开始时的边界框非常不同。为故事添加奇怪的锚点,它变得更加复杂。完美的解决方案是获取原始精灵的顶点而不是边界框。有可能吗?
有什么想法吗?我错过了什么吗?
答案 0 :(得分:1)
boundingBox()的源代码可能会有所帮助。您可以通过nodeToParentTransform()获取affinetransform,并使用CCPointApplyAffineTransform获取四个点的新位置。然后你可以编写一个新方法来检查触摸是否位于新的矩形中。
答案 1 :(得分:0)
假设您有父母
CCSprite* parent;
和一个孩子,
CCSprite* child; //child Tag is 100
您可以尝试使用触控方法:
YOUR_CLASS::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){
CCPoint touchLocation = parent->convertTouchToNodeSpace(pTouch);
if (CCRect::CCRectContainsPoint(parent->getChildByTag(100)->boundingBox(),touchLocation)){
//do something
CCLOG("touch on child");
}
}
答案 2 :(得分:0)
如果有人想要找到旋转标签中的字母边框:
int maxIdx = label->getStringLength() -1;
Mat4 trans = label->getNodeToParentTransform();
for(int idx = 0; idx<=maxIdx; idx++) {
Sprite* letter = label->getLetter(idx);
Rect letterRect = letter->getBoundingBox();
Point p = PointApplyTransform(letterRect.origin, trans);
Rect rect = Rect(p.x, p.y, 10, 10); // Letter Approximation rect
}