【问题标题】: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】:

    您做错的是boundingBoxframe 的模拟,而不是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 的范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多