根据用户触摸位置旋转精灵图像?

Tir*_*rth 5 iphone cocos2d-iphone ios cocos2d-x

我开始学习游戏开发。作为一名初学者,我创建了一个演示游戏,其中一门大炮向敌人发射子弹(从不同方向朝大炮射来)。现在,我在用户触摸屏幕或敌人的任何地方都坚持大炮精灵图像旋转。我如何做到这一点,我的初始代码如下,

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

}
Run Code Online (Sandbox Code Playgroud)

代码是用 cocos2d-x 编写的。我也接受用普通 cocos2d 编写的人的回答。

谢谢我饿了

Tir*_*rth 5

完美答案如下:

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);
Run Code Online (Sandbox Code Playgroud)


bri*_*dir 1

首先,更换

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;
}
Run Code Online (Sandbox Code Playgroud)

经过

float angleRadians = atan2f(diffPoint.y, diffPoint.x);
Run Code Online (Sandbox Code Playgroud)

那么最好立即设置旋转(不进行任何操作)来处理多次频繁的触摸。

_cannonImage->setRotation(angleRadians);
Run Code Online (Sandbox Code Playgroud)

也许您需要像setRotation(-angleRadians)或 那样调整旋转setRotation(angleRadians+90)- 这取决于您的坐标系。