2012-05-16 149 views
2

我似乎在計算我的精靈和觸摸點之間的角度有問題。我試圖讓我的精靈在用戶觸摸屏幕時直接面對觸摸點的方向。這裏是我的代碼:旋轉精靈面對一個點(cocos2d)

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    CGPoint tapPosition; 
    for (UITouch *touch in touches){ 
     CGPoint location = [touch locationInView:[touch view]]; 
     tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]]; 
    } 

    float angle = CC_RADIANS_TO_DEGREES(ccpAngle(fish.position, tapPosition)); 
    [fish runAction:[CCRotateTo actionWithDuration:0.5 angle:angle]]; 
} 

任何想法?謝謝

回答

3

試試這個,首先你不需要那個循環,因爲你最終只會碰到最後一個觸摸位置。你可以使用[觸及anyObject]如下。

其次,我不確定ccpAngle是怎麼做的,但是當像這樣的宏不起作用時,它更容易自己做數學。

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint tapPosition; 
    UITouch *touch = [touches anyObject]; 

    CGPoint location = [touch locationInView:[touch view]]; 
    tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]]; 

    float dY = fish.position.y - tapPosition.y; 
    float dX = fish.position.x - tapPosition.x; 
    float offset = dX<0 ? 90.0f : -90.0f; 
    float angle = CC_RADIANS_TO_DEGREES(atan2f(dY, dX)) + offset; 

    [fish runAction:[CCRotateTo actionWithDuration:0.5 angle:angle]]; 
} 

您可能可以用ccpDiff中的一個點代替dX和dY,但它並不重要。同樣取決於你的魚頭在哪裏,你可能需要調整角度偏移量,但是我會保留這一點。

讓我知道這是否有幫助。

+0

嘿,謝謝你的試用。我試圖插入你的代碼,無濟於事。看起來輪換似乎不太合適。有任何想法嗎?謝謝 – user339946

+0

我需要更多細節,究竟發生了什麼? –

+0

當屏幕被點擊時,它旋轉,但不是正確的角度。有時它不是很接近於正確的角度 – user339946

3

CCPoint pos1 = [魚的位置]; CCPoint pos2 = touchlocation;

float theta = atan((pos1.y-pos2.y)/(pos1.x-pos2.x)) * 180 * 7 /22; 

float calculatedAngle; 

if(pos1.y - pos2.y > 0) 
{ 
    if(pos1.x - pos2.x < 0) 
    { 
     calculatedAngle = (-90-theta); 
    } 
    else if(pos1.x - pos2.x > 0) 
    { 
     calculatedAngle = (90-theta); 
    }  
} 
else if(pos1.y - pos2.y < 0) 
{ 
    if(pos1.x - pos2.x < 0) 
    { 
     calculatedAngle = (270-theta); 
    } 
    else if(pos1.x - pos2.x > 0) 
    { 
     calculatedAngle = (90-theta); 
    } 
} 

使用此calculatedAngle運行中的動作..希望這會有所幫助... :)

4

一下添加到Nikhil的回答結束,以避免得到負角度時,觸摸位置是底部精靈的權利。

if (calculatedAngle < 0) 
{ 
    calculatedAngle+=360; 
}