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

5

我开始学习游戏开发。作为初学者,我创建了一个演示游戏,在游戏中一个大炮向不同方向的敌人发射子弹。 现在,我遇到了问题:如何使大炮精灵图像根据用户在屏幕上的触摸或敌人的位置旋转。以下是我的初始代码:

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

}

这段代码是用cocos2d-x编写的。如果有人使用普通的cocos2d编写,我也可以接受答案。

谢谢 iHungry


你能否提供一下这段代码的具体问题?顺便说一下,如果cocos2d-x中有ccpAngle和ccpAngleSigned函数的话,可以去看看。 - CodeSmile
@LearnCocos2D,是的老板...它能工作,但它没有我想要的旋转效果... - Tirth
我也在检查角度的变化... 但它没有起作用... 实际问题是图像旋转缓慢且只有小角度... 我想将炮口设置为朝向用户触摸位置。 - Tirth
3个回答

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

3
我使用了这段代码来旋转我的精灵。根据我的加速度计读数,我正在移动精灵。
float angleRadians =-accelX;
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);
objGlider->sprite_Glider.rotation = cocosAngle;

请检查。慢速的原因可能是您在代码中使用了CClog或NSLog。

这里是完整的代码。

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是创建滑翔机精灵的类的对象,而sprite_Glider是滑翔机类中使用的精灵。

您可以使用rotation属性使您的精灵旋转。在Cocos2Dx中,它可能是setRotation


能否提供一下您的简短代码,因为我不明白sprite_Glider.rotation这个术语的含义......即使cocos2dx不接受旋转的点(.)语法...我们必须使用CCRotateBy或CCRotateTo类。 - Tirth
是的,你的代码也没问题,但是被接受的代码对我有效。我只会给你点赞。 - Tirth
没问题。只有一个问题。在cocos2D-x中使用setRotation属性与精灵一起,它能正常工作吗? - NiKKi

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

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

那么最好立即设置旋转(无需操作)以处理多个频繁的触摸。

_cannonImage->setRotation(angleRadians);

也许你需要调整旋转角度,例如 setRotation(-angleRadians) 或者 setRotation(angleRadians+90) - 这取决于你的坐标系。


在我的代码中,我不得不将x和y切换为atan2f(diffPoint.x,diffPoint.y);并设置setRotation(angleRadians / M_PI * 180); - Philiiiiiipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接