Почему это обнаруживает касания только в центре CCSprites?

Я пытаюсь позволить пальцу перетащить 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);

}

Моя логика такова:

В ccTouchesBegan я получаю местоположение касания, преобразовываю его в правильные координаты, затем делаю два CGRect, которые, предположительно, имеют одинаковые размеры и расположение двух объявленных мною спрайтов. Затем я проверяю, касается ли палец одного из этих двух прямоугольников, используя CGRectContainsPoint. Там у меня есть глобальный int с именем spriteIndex, которому я присваиваю значение в зависимости от того, какой круг был затронут.

Затем в ccTouchesMoved я проверяю, был ли spriteIndex присвоен «индекс» одного из двух спрайтов, которые я пытаюсь переместить, и если да, устанавливаю местоположение выбранного спрайта на место касания.

Проблема:

Этот код только вроде работает. Это позволяет мне перетаскивать CCSprites, но только если я щелкаю по центру. А спрайт 40 на 40 пикселей, так что он отнюдь не маленький.


person Community    schedule 21.10.2010    source источник


Ответы (1)


Нашел ответ на другом форуме:

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);

должно быть:

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 создаются из центрального указателя, а не из левого нижнего.

person Community    schedule 23.10.2010