Cocos2d iphone 在它们之间的小距离内检测CCSprite触摸

Cocos2d iphone 在它们之间的小距离内检测CCSprite触摸,cocos2d-iphone,Cocos2d Iphone,我在CCLayer中有一些小精灵(宽度/高度),我想检测它们中的哪一个被触摸。我使用以下代码 - (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; CGRect rect = sprite.boundingBox; // i am doing this becaus

我在
CCLayer
中有一些小精灵(宽度/高度),我想检测它们中的哪一个被触摸。我使用以下代码

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];

    CGRect rect = sprite.boundingBox;

    // i am doing this because of the small size of the sprites, 
    // so it would be more easy to detect if a sprite is taped and then move it.
    if (rect.size.width > rect.size.height) {
        rect.size.width *= 2.5;
        rect.size.height *= 5;
        rect.origin.y -= rect.size.height / 2;

    } else {
        rect.size.width *= 5;
        rect.size.height *= 2.5;
        rect.origin.x -= rect.size.width / 2;
    }

    CCSprite *s = nil;
    for (CCSprite *sprite in [self children]) {
        if (CGRectContainsPoint(rect, touchPoint)) {
            s = sprite;
            break;
        }
    }

    if (s != nil) {
        // do something here
    }

    return YES;
}
除了两个精灵彼此非常接近(不重叠)时,所有这些都可以正常工作。然后,由于它们之间的距离很小,检测到错误的精灵


你知道我该怎么纠正吗

如果您试图放大矩形,使其中心保持在原来的位置,则应使用:

    rect.origin.y -= (rectFinalHeight - rectOriginalHeight) / 2;

这将是:

if (rect.size.width > rect.size.height) {
    rect.size.width *= 2.5;
    rect.size.height *= 5;
    rect.origin.y -= rect.size.height * 4 / 2;

} else {
    rect.size.width *= 5;
    rect.size.height *= 2.5;
    rect.origin.x -= rect.size.width * 4 / 2;
}

依我看,在这两种情况下,您都应该沿两个轴调整矩形原点(不仅在一种情况下沿x轴调整,在另一种情况下沿y轴调整),否则您的矩形将不会居中。但是你更清楚你想做什么,这里…

精灵图像有透明的边框吗?因为这些边界也在边界框内。不,它们不在边界框内。我认为问题在于如何调整rect的大小,使其更容易检测精灵。但如果不这样做,它是非常困难的检测,因为它的小尺寸。答案的第一部分是正确的。我先试了一下,按你的建议,但没用。然后我试着减去原来的宽度/高度,效果很好。非常感谢。
if (rect.size.width > rect.size.height) {
    rect.size.width *= 2.5;
    rect.size.height *= 5;
    rect.origin.y -= rect.size.height * 4 / 2;

} else {
    rect.size.width *= 5;
    rect.size.height *= 2.5;
    rect.origin.x -= rect.size.width * 4 / 2;
}