Search code examples
iphoneioscocos2d-iphonecocos2d-x

Rotate sprite image according to user touch location?


I m start learning game development. As a beginner i create one demo game in which one cannon hit bullets to the enemies (coming toward cannon from different direction). Now i stuck on cannon sprite image rotation anywhere user touch on the screen or enemies. How i do that, My initial code as following,

void HelloWorld:: ccTouchesBegan(CCSet *touches, CCEvent * event)
{
    CCSize winSize = CCDirector::sharedDirector()->getWinSize(); 
    CCTouch* touch = (CCTouch*)( touches->anyObject() );
    CCPoint location = touch->locationInView(touch->view());
    location = CCDirector::sharedDirector()->convertToGL(location);

    //Rotate cannon direction toward touch point
    CCPoint diffPoint = ccpSub(_cannonImage->getPosition(), location);
    float angleRadians = atanf((float)diffPoint.y/(float)diffPoint.x);
    float angleOffset = CC_DEGREES_TO_RADIANS(180);

    if(diffPoint.x < 0){
        angleRadians += angleOffset;
    }else{
        angleRadians -= angleOffset;
    }

    CCLog("angle to be rotate = %f", angleRadians);

    _cannonImage->runAction(CCRotateBy::actionWithDuration(0.1, angleRadians));

}

The code is written in cocos2d-x . I also accepting answer by someone who written in plain cocos2d.

Thanks iHungry


Solution

  • First of all, replace

    float angleRadians = atanf((float)diffPoint.y/(float)diffPoint.x);
    float angleOffset = CC_DEGREES_TO_RADIANS(180);
    
    if(diffPoint.x < 0){
        angleRadians += angleOffset;
    }else{
        angleRadians -= angleOffset;
    }
    

    by

    float angleRadians = atan2f(diffPoint.y, diffPoint.x);
    

    Then it would be better to set rotation immediately (without actions) to process multiple frequent touches.

    _cannonImage->setRotation(angleRadians);
    

    Maybe you will need to adjust rotation like setRotation(-angleRadians) or setRotation(angleRadians+90) - it depends on your coordinate system.