我想問一下將鼠標X,Y位置從玩家位置轉換爲16個方向之一的最佳公式。我工作在c + +,sfml 1.6,所以我很容易得到每個位置,但我不知道如何根據角色從玩家位置或其他東西轉換它們。 (我從來沒有好的數學和4個以上的方向if
陳述看起來太複雜)。將鼠標位置轉換爲方向並返回
此外,我想將它發送到哪個方向轉換回三角洲X服務器的,所以他可以這樣做:
player.Move(deltaX * speed * GetElapsedTime(), ...Y);
我想問一下將鼠標X,Y位置從玩家位置轉換爲16個方向之一的最佳公式。我工作在c + +,sfml 1.6,所以我很容易得到每個位置,但我不知道如何根據角色從玩家位置或其他東西轉換它們。 (我從來沒有好的數學和4個以上的方向if
陳述看起來太複雜)。將鼠標位置轉換爲方向並返回
此外,我想將它發送到哪個方向轉換回三角洲X服務器的,所以他可以這樣做:
player.Move(deltaX * speed * GetElapsedTime(), ...Y);
的「最簡單」的方法是將你的兩套共同的轉換(其中一個用於當前玩家位置,一個用於當前鼠標位置)轉換爲相對於玩家位置的角度,其中角度0是玩家直線前方(或北方,取決於遊戲的工作方式)。然後,您的每個十六個方向將轉換爲給定的22.5度間隔。
但是,既然你說你數學不好,我想你正在尋找比這更具體的東西。
你可以使用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);
感謝,回覆這裏的作品相當快:) – Reiv
我發誓,這個功能是純粹的魔法。 – Lalaland