2012-07-16 70 views
4

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

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

+0

将是有益的?顺便说一句,检查ccpAngle和ccpAngleSigned,如果它们在cocos2d-x中可用。 – LearnCocos2D 2012-07-16 11:36:30

+0

@ LearnCocos2D,是的老板......它工作,但它不旋转,我想... – Tirth 2012-07-16 11:47:43

+0

即时通讯也检查改变角度....但它不工作....实际问题是,...图像旋转懒惰和小角度....我想设置加农炮面对用户触摸位置。 – Tirth 2012-07-16 11:49:32

回答

1

首先,通过

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

更换

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

然后,它会更好立即设置旋转(不动作)来处理多个频繁接触。

_cannonImage->setRotation(angleRadians); 

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

+0

在我的代码中,我必须将x和y切换到atan2f(diffPoint.x,diffPoint.y);和setRotation(angleRadians/M_PI * 180); – Philiiiiiipp 2013-12-12 23:56:13

2

我用这个代码转动我的精灵。我正在根据我的加速度计读数移动精灵。

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

+0

可以提供给我你的简短代码becoz我不理解术语sprite_Glider.rotation ......即使cocos2dx不接受旋转的点(。)语法......我们必须使用CCRotateBy或CCRotateTo类。 – Tirth 2012-07-17 05:20:55

+0

是的乌尔代码也适当,但接受的代码为我工作。我只给你一票赞成票。 – Tirth 2012-07-17 07:41:33

+0

不用担心。只是一个问题。使用'setRotation'属性与精灵,它在cocos2D-x? – NiKKi 2012-07-17 10:09:13

4

完美的答案如下,如果你提到的究竟是这段代码的问题

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