2012-07-16 100 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);