2011-07-04 23 views
1

我想問一下將鼠標X,Y位置從玩家位置轉換爲16個方向之一的最佳公式。我工作在c + +,sfml 1.6,所以我很容易得到每個位置,但我不知道如何根據角色從玩家位置或其他東西轉換它們。 (我從來沒有好的數學和4個以上的方向if陳述看起來太複雜)。將鼠標位置轉換爲方向並返回

此外,我想將它發送到哪個方向轉換回三角洲X服務器的,所以他可以這樣做:

player.Move(deltaX * speed * GetElapsedTime(), ...Y); 

回答

0

的「最簡單」的方法是將你的兩套共同的轉換(其中一個用於當前玩家位置,一個用於當前鼠標位置)轉換爲相對於玩家位置的角度,其中角度0是玩家直線前方(或北方,取決於遊戲的工作方式)。然後,您的每個十六個方向將轉換爲給定的22.5度間隔。

但是,既然你說你數學不好,我想你正在尋找比這更具體的東西。

0

你可以使用atan2獲得鼠標位置和正X軸之間的夾角:

#include <cmath> 

float player_x = ...; 
float player_y = ...; 
float mouse_x = ...; 
float mouse_y = ...; 

float angle = std::atan2(mouse_y - player_y, mouse_x - player_x); 

angle通過std::atan2()返回是-M_PI(不含)M_PI(含)之間的值:

-M_PI   Left (-180°) 
-0.5 * M_PI  Down (-90°) 
0    Right (0°) 
0.5 * M_PI  Up (90°) 
M_PI   Left (180°) 

您可以根據您希望映射到「16個方向之一」的方式來變換此值,即根據要分配給哪個離散可怕值ction。

考慮的角度,得到一個單位向量代表X/Y三角洲是很容易的,太:

float dx = std::cos(angle); 
float dy = std::sin(angle); 
+0

感謝,回覆這裏的作品相當快:) – Reiv

+0

我發誓,這個功能是純粹的魔法。 – Lalaland