Graphics 如何检测对儿童精灵的触摸

Graphics 如何检测对儿童精灵的触摸,graphics,cocos2d-iphone,cocos2d-x,Graphics,Cocos2d Iphone,Cocos2d X,我正在写一个cocos2d-x应用程序。我有一个雪碧,上面有两个小雪碧。这些精灵表示屏幕上的一个逻辑对象,该对象被转换为一个整体对象。现在,当物体被触摸时,我需要发现哪个孩子的精灵被触摸了 问题是,虽然父精灵提供了当前的所有信息(边界框、比例、旋转等),但子精灵仍保持其原始数字,尽管与父精灵一起变换,我无法找到计算子精灵“真实”尺寸的正确方法 在我看来,有两个事实导致了所有的困难: 子边界框具有相对于父边界框报告的初始尺寸 旋转父对象后,我无法计算父对象的初始边界框(请参见下图),因此我无法计算

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

问题是,虽然父精灵提供了当前的所有信息(边界框、比例、旋转等),但子精灵仍保持其原始数字,尽管与父精灵一起变换,我无法找到计算子精灵“真实”尺寸的正确方法

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

  • 子边界框具有相对于父边界框报告的初始尺寸
  • 旋转父对象后,我无法计算父对象的初始边界框(请参见下图),因此我无法计算父对象精灵的左下角在哪里,我需要它作为子变换的关系点
  • 下面是这种情况的示意图:

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


    有什么想法吗?我遗漏了什么吗?

    假设你有父母

    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");
        }
    }
    

    假设你有父母

    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");
        }
    }
    

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

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

    如果有人想找到旋转标签中的字母边界框:

    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
    }
    
    int maxIdx=label->getStringLength()-1;
    Mat4 trans=标签->getNodeToParentTransform();
    for(intidx=0;idxgetLetter(idx);
    Rect-letrect=letter->getBoundingBox();
    点p=点ApplyTransform(letterRect.origin,trans);
    Rect Rect=Rect(p.x,p.y,10,10);//字母近似Rect
    }
    
    如果有人想找出旋转标签中的字母边界框:

    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
    }
    
    int maxIdx=label->getStringLength()-1;
    Mat4 trans=标签->getNodeToParentTransform();
    for(intidx=0;idxgetLetter(idx);
    Rect-letrect=letter->getBoundingBox();
    点p=点ApplyTransform(letterRect.origin,trans);
    Rect Rect=Rect(p.x,p.y,10,10);//字母近似Rect
    }
    
    据我所见,我得到的子边界框不是真正的边界框,而是在所有转换之前的原始边界框。@FireAphis这很奇怪。因为在我的应用程序中,我有一个时钟指针,它是时钟面的子对象,时钟指针的旋转和定位点都发生了变化,但我在检测触摸方面没有任何问题使用上面的代码。你可以从我看到的来看,我得到的子边界框不是真正的边界框,而是在所有转换之前的原始边界框。@FireAphis这很奇怪。因为在我的应用程序中,我有一个时钟指针,它是时钟面的子对象,时钟指针的旋转和定位点都改变了,但我确实改变了使用上述代码检测触摸没有任何问题。您可以查看