Search code examples
iosobjective-ccocos2d-iphone

Detect touch point on circle , Cocos2d


I have created a circle with draw function in cocos2d, I am trying to detect touch point on circle line, lets say user touches bottom of the circle I want to print 270, if user touches top of the circle I want to print 90 etc....

I have looked this questions but they detect a sprite first then just compare if touches inside or outside of the circle

http://www.cocos2d-iphone.org/forum/topic/21629

how to detect touch in a circle

- (void) draw
{
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    glLineWidth(10.0f);
    ccDrawColor4F(0.2f, 0.9f, 0.02f, 0.6f);
    CGPoint center = ccp(winSize.width*0.88, winSize.height*0.8);
    CGFloat radius = 100.f;
    CGFloat angle = 0.f;
    NSInteger segments = 100;
    BOOL drawLineToCenter = YES;

    ccDrawCircle(center, radius, angle, segments, drawLineToCenter);
}

How can I detect a touch point on the circle line?


Solution

  • Try this , didnt test the code , improved it according to your needs

    -(BOOL) ccTouchBegan:(UITouch*)touch withEvent:(UIEvent*)event
    {    
        CGSize winSize = [[CCDirector sharedDirector] winSize];
        CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
        CGPoint center=ccp(winSize.width*0.88, winSize.height*0.8);
    
        //now test against the distance of the touchpoint from the center change the value acording to your need
        if (ccpDistance(center, location)<100)
        {
            NSLog(@"inside");
    
            //calculate radians and degrees in circle
            CGPoint diff = ccpSub(center, location);//return ccp(v1.x - v2.x, v1.y - v2.y);
            float rads = atan2f( diff.y, diff.x);
            float degs = -CC_RADIANS_TO_DEGREES(rads);
            switch (degs) 
            {
                case -90:
                //this is bottom
                break;
                case 90:
                    //this is top
                    break;
                case 0:
                    //this is left side
                    break;
                case 180:
                    //this is right side
                    break;
                default:
                    break;
            }
        }   
        return YES;
    }