Graphics 如何检测对儿童精灵的触摸
我正在写一个cocos2d-x应用程序。我有一个雪碧,上面有两个小雪碧。这些精灵表示屏幕上的一个逻辑对象,该对象被转换为一个整体对象。现在,当物体被触摸时,我需要发现哪个孩子的精灵被触摸了 问题是,虽然父精灵提供了当前的所有信息(边界框、比例、旋转等),但子精灵仍保持其原始数字,尽管与父精灵一起变换,我无法找到计算子精灵“真实”尺寸的正确方法 在我看来,有两个事实导致了所有的困难:Graphics 如何检测对儿童精灵的触摸,graphics,cocos2d-iphone,cocos2d-x,Graphics,Cocos2d Iphone,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这很奇怪。因为在我的应用程序中,我有一个时钟指针,它是时钟面的子对象,时钟指针的旋转和定位点都改变了,但我确实改变了使用上述代码检测触摸没有任何问题。您可以查看