如何检测儿童精灵的触摸

时间:2012-09-21 14:53:07

标签: graphics cocos2d-iphone cocos2d-x

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

问题在于,虽然父精灵为我提供了当前所有的信息(边界框,缩放,旋转等),但子精灵仍保留原始数字,尽管与父母一起转换,我无法弄清楚计算孩子们“真实”维度的正确方法。

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

  1. 子边框的初始尺寸是相对于父级的初始边界框报告的。
  2. 在父项旋转之后,我无法计算父项的初始边界框(见下图),因此我无法计算父精灵的左下角现在,我需要将其作为子变换的关系点。
  3. 以下是这种情况的图纸:

    Sprite bounding box after rotation

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

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

3 个答案:

答案 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
}