【问题标题】:If touch is in CCSprite bounds? Cocos2d v3如果触摸在 CCSprite 范围内? Cocos2d v3
【发布时间】:2014-07-17 23:31:02
【问题描述】:
我正在尝试创建一个简单的辅助方法来使用此方法检测 UITouch 是否在 CCSprite 的范围内:
- (BOOL)containsTouchLocation:(UITouch *)touch {
CGPoint p = [self convertToNodeSpace:touch.locationInWorld];
CGRect r = self.boundingBox;
return CGRectContainsPoint(r, p);
}
回想起来,它似乎应该起作用,但它只是返回“NO”,即使触摸显然是在屏幕上的精灵中。我在这里做错了什么吗?我正在使用 Cocos2d v3。
【问题讨论】:
标签:
ios
cocos2d-iphone
uitouch
ccsprite
【解决方案1】:
您做错的是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 rect 而不是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 的范围内。