2014-03-30 60 views
1

我想用SKAction旋轉方法圍繞z軸旋轉一個太空船,具體取決於觸摸座標。觸摸後,飛船的鼻子應該指向觸摸點。一致的旋轉速度,iOS Sprite Kit

CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors 

SKAction *rotation = [SKAction rotateToAngle: rad duration: ??? shortestUnitArc:YES]; 

如何調整持續時間,使轉動速度始終相同(不管轉動角度有多大)?

問題是弧度發生在從-pi到pi的間隔內(因爲atan2)。所以旋轉取決於所觸及的象限,速度也是如此。

enter image description here

回答

1
CGFloat factor = 5.0; //Adjust this to get your desired speed. 

CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors 

CGFloat diff = ABS(node.zRotation - rad); 

CGFloat time = diff/factor; 

SKAction *rotation = [SKAction rotateToAngle: rad duration: time shortestUnitArc:YES]; 
2

我現在明白了:

我翻譯了[-Pi,郫縣]弧度爲[0,二皮。

CGFloat prevRad = sprite.zRotation; // actual sprite rotation 
if (prevRad < 0) prevRad = (M_PI)+((M_PI)+prevRad); // atan2 from 0 to 2PI 

CGFloat rad = atan2f(touchLocation.y - sprite.position.y, touchLocation.x - sprite.position.x); // calc rad between vectors 
if (rad < 0) rad = (M_PI)+((M_PI)+rad); // atan2 from 0 to 2PI 

然後我用老的和新的弧度分頻因子之間的區別:

CGFloat factor = 4.0f; 
CGFloat diff = ABS(sprite.zRotation - rad); 
CGFloat time = diff/factor; 

SKAction *rotation = [SKAction rotateToAngle:rad duration: time shortestUnitArc:YES]; 
rotation.timingMode = SKActionTimingEaseInEaseOut; 
[sprite runAction:rotation];