2011-05-16 60 views
0

我不擅長數學(我從來沒有),我有一個問題:我試圖讓精靈始終旋轉到鼠標光標。這是我有:角度的方向

// mx is mouse X and my is mouse y 
double rotate = (atan2(my, mx) * PI); 

// Set rotation takes rotation in degrees 
ship.SetRotation(rad2deg(rotate)); 

哪裏deg2rad功能是:

double rad2deg(double rad) 
{ 
    double deg = 0; 
    deg = rad * (180/M_PI); 
    return deg; 
} 

遺憾的是它不工作。這艘船旋轉很怪異(很難定義)。我不知道要解決這個問題。

我正在研究SFML,SetRotation需要度數。

在此先感謝。

+2

你爲什麼要拋出浮動並分配給雙? – 2011-05-16 11:54:10

+2

您確定SetRotation期望程度而不是弧度? – AProgrammer 2011-05-16 11:54:27

+0

哪個框架具有接受度數的setRotation?呸。 MX和我的相對於船的位置?您可能需要手動檢查他們的標誌,以便在他們都是負面的情況下處理這種情況 - 當他們都返回正面時,您會計算角度。 – Rup 2011-05-16 11:55:12

回答

5

您需要定義相對於某點的旋轉。目前,您正在相對於屏幕的角落進行操作,該屏幕只會提供90度,並且可能不是您想要的。您可能需要相對於精靈的位置或相對於屏幕中心的旋轉,例如,

// define centre of screen 
const int Y0 = SCREEN_HEIGHT/2; 
const int X0 = SCREEN_WIDTH/2; 

// get rotation angle of mouse location relative to centre of screen 
double rotate = (float) (atan2(Y0 - my), ((mx - X0)); 

[正如其他人已經指出的,例如, @duffymo,你也可能有atan2轉置的參數,所以我也做了這個改變。]

+1

很好的答案 - 從我+1。 – duffymo 2011-05-16 11:57:26

2

看起來你有錯誤的參數順序atan2。並且您傳遞給atan2的值應該是鼠標相對於對象的相對位置。所以如果對象位置是ox,oy,那麼你應該使用atan2(my-oy, mx-ox)

2

不知你是否有反轉的參數atan2。典型的順序是y,然後是x。你確定你知道你傳遞給該方法嗎?

「不工作」和「怪異」不能幫助我們理解問題所在,因此很難幫助您。