我正在尝试创建一个简单的帮助器方法,以使用此方法检测UITouch是否在CCSprite的范围内:
- (BOOL)containsTouchLocation:(UITouch *)touch {
CGPoint p = [self convertToNodeSpace:touch.locationInWorld];
CGRect r = self.boundingBox;
return CGRectContainsPoint(r, p);
}
它似乎应该回想起来,但它只是返回“NO”,即使触摸显然是在屏幕上的精灵。我在这里做错了吗?我正在使用Cocos2d v3。
答案 0 :(得分:0)
你做错了是boundingBox
类似于frame
而不是bounds
。因此,r
位于节点parent
的坐标空间中,p
位于节点本身的坐标空间中。
如果知道该节点有父节点,您可以在父节点坐标空间中计算p
:
CGPoint p = [self.parent convertToNodeSpace:touch.locationInWorld];
// You can also use a shorthand [touch locationInNode: self.parent];
或者您可以将r
作为bounds
矩形而不是frame
// notice that it is `contentSizeInPoints` and not `contentSize`
CGRect r = { .origin = CGPointZero, .size = self.contentSizeInPoints };
但无论哪种方式,CCNode
现在都有hitAreaExpansion
,您可能需要考虑这一点:
r = CGRectInset(r, -self.hitAreaExpansion);
或者不是做所有这些,你可以使用hitTestWithWorldPos:
方法,默认实现测试给定的世界位置是否在节点+/- hitAreaExpansion
的范围内。