Gire la image de sprite de acuerdo con la location de toque del usuario?

Estoy empezando a aprender el desarrollo del juego. Como principiante, creo un juego de demostración en el que un cañón golpea a los enemigos con balas (viene hacia el cañón desde diferentes direcciones). Ahora me quedo atrapado en la rotation de la image de sprite de cañón donde el usuario toque la pantalla o los enemigos. Cómo lo hago, Mi código inicial como sigue,

void HelloWorld:: ccTouchesBegan(CCSet *touches, CCEvent * event) { CCSize winSize = CCDirector::shanetworkingDirector()->getWinSize(); CCTouch* touch = (CCTouch*)( touches->anyObject() ); CCPoint location = touch->locationInView(touch->view()); location = CCDirector::shanetworkingDirector()->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)); } 

El código está escrito en cocos2d-x. También acepto la respuesta de alguien que escribió en plain cocos2d.

Gracias iHungry

En primer lugar, reemplace

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

por

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

Entonces, sería mejor configurar la rotation inmediatamente (sin acciones) para procesar múltiples toques frecuentes.

 _cannonImage->setRotation(angleRadians); 

Tal vez deba ajustar la rotation como setRotation(-angleRadians) o setRotation(angleRadians+90) – depende de su sistema de coorderadas.

La respuesta perfecta como sigue,

 float HelloWorld::changingAngleAccordingToCoordinateSystem(CCPoint imageCenter, CCPoint touchLocation, float calculatedAngle){ //Consideration :- all Angles is in Degree if((calculatedAngle >= 0 && calculatedAngle <= 90) || (calculatedAngle >= 90 && calculatedAngle <= 180)){ //Ist quardant calculatedAngle = calculatedAngle; } else if(calculatedAngle < 0 && calculatedAngle >= -90){ //IInd quardant calculatedAngle = 270 + (90 + calculatedAngle); } else if(calculatedAngle < -90 && calculatedAngle >= -180){ calculatedAngle = 180 + (180 + calculatedAngle); } return calculatedAngle; } //Rotate cannon direction toward touch point float diff_X = touchLocation.x - myImage->getPosition().x; float diff_Y = touchLocation.y - myImage->getPosition().y; CCPoint diffPoint = CCPoint(diff_X, diff_Y); float angleRadians = atan2f(diffPoint.y,diffPoint.x); angleRadians = CC_RADIANS_TO_DEGREES(angleRadians); angleRadians = HelloWorld::changingAngleAccordingToCoordinateSystem(myImage->getPosition(), touchLocation, angleRadians); myImage->setRotation(-angleRadians); 

Utilicé este código para rotar mi sprite. Estaba moviendo el sprite según mi lectura del acelerómetro.

 float angleRadians =-accelX; float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians); objGlider->sprite_Glider.rotation = cocosAngle; 

Revisalo. El motivo de la lentitud puede ser que esté utilizando CClog o NSLog en el código.

Aquí va el código completo.

 if(!boolPlayerDied) { static float prevX=0, prevY=0; #define kFilterFactor 1.0f// don't use filter. the code is here just as an example float accelX = (float) acceleration.x * kFilterFactor + (1- kFilterFactor)*prevX; float accelY = (float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY; prevX = accelX; prevY = accelY; accelX = accelX-0.5;// Angle check fot tgfor the player to play float angleRadians =-accelX; float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians); if(accelX>0) { cocosAngle = 1.1 * angleDegrees; } else { if(accelX<-0.5) accelX=-0.5; cocosAngle = 1.1 * angleDegrees; } objGlider->sprite_Glider.rotation = cocosAngle; } 

objGlider es el object de la class que crea el sprite de planeador y sprite_Glider es el sprite utilizado en la class de planeador.

Puedes usar la propiedad de rotation con tu sprite para girar. En cocos2Dx puede ser setRotation .