Iphone 为什么这只检测CCSprites中心的触摸?

Iphone 为什么这只检测CCSprites中心的触摸?,iphone,cocos2d-iphone,collision-detection,Iphone,Cocos2d Iphone,Collision Detection,我试图让手指拖动CCSprite,代码如下: -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint location = [touch locationInView: [touch view]]; CGPoint convertedCoordinate = [[CCDirector sharedDirector] convertToGL:location]; CGRect re

我试图让手指拖动CCSprite,代码如下:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [touch locationInView: [touch view]];
    CGPoint convertedCoordinate = [[CCDirector sharedDirector] convertToGL:location];

    CGRect redCircleRect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
    CGRect redCircle2Rect = CGRectMake(redCircle2.position.x, redCircle2.position.y, redCircle2.contentSize.width, redCircle2.contentSize.height);

    if(CGRectContainsPoint(redCircleRect, convertedCoordinate)) {
        //redCircle.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
        NSLog(@"Touched");
        spriteIndex = 1;
    }
    else if(CGRectContainsPoint(redCircle2Rect, convertedCoordinate)) {
        //redCircle2.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
        NSLog(@"Touched2");
        spriteIndex = 2;
    }
    else {
        spriteIndex = 0;
    }
    return YES;
}
-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [touch locationInView: [touch view]];
    CGPoint convertedCoordinate = [[CCDirector sharedDirector] convertToGL:location];   

    if (spriteIndex == 1) {
        redCircle.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
    }
    else if (spriteIndex == 2) {
        redCircle2.position = ccp(convertedCoordinate.x, convertedCoordinate.y);
    }

    //CGRect RedCircleRect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
    //CGRect RedCircle2Rect = CGRectMake(redCircle.position.x, redCircle.position.y, redCircle.contentSize.width, redCircle.contentSize.height);
}

我的逻辑如下:

在cctouches中,我首先获得触摸的位置,将其转换为正确的坐标,然后制作两个CGRect,假设它们与我声明的两个精灵的尺寸和位置相同。然后,我使用CGRectContainsPoint检查手指是否接触到这两个矩形中的一个。在这里,我有一个名为spriteIndex的全局int,我根据所接触的圆分配一个值

接下来,在ccTouchesMoved中,我检查spriteIndex是否已被赋予我尝试移动的两个精灵中的一个的索引,如果是,则将所选精灵的位置设置为触摸位置

问题是:

这段代码只在某种程度上起作用。它允许我拖动ccsprite,但前提是单击中心。精灵是40乘40像素的,所以它绝不是小的。

在下面找到了答案:

应该是:

CGRect redCircleRect = CGRectMake(redCircle.position.x-20.0, redCircle.position.y-20.0, 40.0, 40.0);
CGRect redCircle2Rect = CGRectMake(redCircle2.position.x-20.0, redCircle2.position.y-20.0, 40.0, 40.0);
这是因为,CGRect副本是从中心指针创建的,它应该从左下角创建

CGRect redCircleRect = CGRectMake(redCircle.position.x-20.0, redCircle.position.y-20.0, 40.0, 40.0);
CGRect redCircle2Rect = CGRectMake(redCircle2.position.x-20.0, redCircle2.position.y-20.0, 40.0, 40.0);