如果触摸是在CCSprite界限? Cocos2d v3

时间:2014-07-17 23:31:02

标签: ios cocos2d-iphone uitouch ccsprite

我正在尝试创建一个简单的帮助器方法,以使用此方法检测UITouch是否在CCSprite的范围内:

- (BOOL)containsTouchLocation:(UITouch *)touch {
    CGPoint p = [self convertToNodeSpace:touch.locationInWorld];
    CGRect r = self.boundingBox;
    return CGRectContainsPoint(r, p);
}

它似乎应该回想起来,但它只是返回“NO”,即使触摸显然是在屏幕上的精灵。我在这里做错了吗?我正在使用Cocos2d v3。

1 个答案:

答案 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的范围内。