Mord Fustang Mord Fustang - 1 year ago 124
iOS Question

Detect touch point on circle , Cocos2d

I have created a circle with

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

how to detect touch in a circle

- (void) draw
CGSize winSize = [[CCDirector sharedDirector] winSize];
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?

Answer Source

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)

        //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
            case 90:
                //this is top
            case 0:
                //this is left side
            case 180:
                //this is right side
    return YES;
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download