2013-10-08 112 views
7

使用Sprite Kit我試圖設置一個SKPhysicsBody根據給定的角度移動,例如,如果您希望精靈向右移動,您將指定1.571弧度。要將指定的角度轉換爲速度,我使用下面的方法將弧度轉換爲CGVector。我從內存中實現的ORIGINAL版本具有將所有角度偏移90度的奇怪效果。 (即,如果0度使用精靈向右移動(就像它會如果指定90度)將弧度角度轉換爲CGVector

問:

我已經通過交換dxdy分配在新版本中修復了這個我的問題是爲什麼會發生這種情況,難道我又理解錯了原來的(有似乎是別人做它在網絡上這種方式),或者是有根據所使用的特定的座標系統的一些原因。

// ORIGINAL 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dx = cos(radians) * 10; 
    vector.dy = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 


// NEW, SWAPPED DX & DY 
- (CGVector)convertAngleToVector:(CGFloat)radians { 
    CGVector vector; 
    vector.dy = cos(radians) * 10; 
    vector.dx = sin(radians) * 10; 
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy); 
    return vector; 
} 

注意:也在Sprite Kit時鐘中明智的旋轉是負的,到目前爲止convertAngleToVector正在進行正向順時針旋轉(即, 1.571弧度是正確的,在那裏它應該被留下)我可以做cos(radians*-1)sin(radians*-1),但是可能有一些基於我交換dx和dy的潛在原因。

雪碧套件(SKView座標):

enter image description here

回答

2

Sprite Kit Programming Guide(強調):

雪碧套件也有一個標準的旋轉約定。圖4-2顯示了極座標慣例。 0弧度的角度指定正x軸。正角度是逆時針方向。

在此座標系中,指向右邊的零弧度角是正確的。如果你想使用一個零度角向上的系統(沿着正y軸)並順時針增加,你需要在轉換角度之前轉換它們的矢量。

+0

啊我明白了,原來的執行是正確的嗎? – fuzzygoat

3

是的,SpriteKit默認爲正確。物理碰撞示例項目通過實施該方法解決了這個:

- (CGFloat)shipOrientation 
{ 
    // The ship art is oriented so that it faces the top of the scene, but Sprite Kit's rotation default is to the right. 
    // This method calculates the ship orientation for use in other calculations. 
    return self.zRotation + M_PI_2; 
} 

然後,您可以只通過調用像獲取現有定位:

CGFloat shipDirection = [self shipOrientation]; 

然後從那裏調整zRotation財產。