1

我正在编写一个 cocos2d-x 应用程序。我有一个精灵,上面有几个子精灵。这些精灵代表屏幕上的一个逻辑对象,该对象被转换为一个整体对象。现在,当对象被触摸时,我需要发现哪个子精灵被触摸了。

问题是,虽然父精灵给了我当前的所有信息(边界框、比例、旋转等),但子精灵保持原来的数字,尽管与父精灵一起转换,我不知道找出为孩子计算“真实”尺寸的正确方法。

在我看来,有两个事实导致了所有困难:

  1. 子边界框的初始尺寸是相对于父边界框的初始尺寸报告
  2. 我无法计算父级旋转后父级的初始边界框(见下图),因此我无法计算父精灵的左下角现在在哪里,我需要它作为子变换的关系点。

这是这种情况的示意图:

旋转后的精灵边界框

因此,总而言之,为了检查触摸是否击中子精灵,我需要根据父级的变换计算子级的当前边界框。我可以计算出孩子的缩放和旋转,但我不知道它应该相对于父级定位在哪里,因为父级的边界框与开始时的边界框非常不同。在故事中添加奇怪的锚点,它变得更加复杂。完美的解决方案是获取原始精灵的顶点而不是边界框。可能吗?

有任何想法吗?我错过了什么吗?

4

3 回答 3

1

boundingBox() 的源代码可能会有所帮助。可以通过nodeToParentTransform()得到仿射变换,使用CCPointApplyAffineTransform得到四个点的新位置。然后您可以编写一个新方法来检查触摸是否位于新矩形中。

于 2012-10-24T08:44:14.447 回答
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
}
于 2014-07-30T09:59:49.707 回答
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");
    }
}
于 2012-09-22T00:28:49.913 回答