我想问将鼠标 X,Y 位置转换为玩家位置的 16 个方向之一的最佳公式是什么。
我在 c++ ,sfml 1.6 中工作,所以我很容易获得每个位置,但我不知道如何根据玩家位置或其他东西的角度来转换它们。(我从来都不擅长数学,超过 4 个方向的if
陈述看起来太复杂了)。
我还想将它发送到服务器,将方向转换回增量 X,Y,这样他就可以执行以下操作:
player.Move(deltaX * speed * GetElapsedTime(), ...Y);
“最简单”的方法是将您的两组坐标(一组用于当前玩家位置,一组用于当前鼠标位置)转换为相对于玩家位置的角度,其中角度 0 是直线前面的直线玩家(或北,取决于你的游戏如何运作)。然后,您的 16 个方向中的每一个都将转换为给定的 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
(exclusive) 和M_PI
(inclusive) 之间的值:
-M_PI Left (-180°)
-0.5 * M_PI Down (-90°)
0 Right (0°)
0.5 * M_PI Up (90°)
M_PI Left (180°)
您可以根据您希望映射到“16 个方向之一”的方式来转换此值,即取决于您要分配给哪个离散方向的值。
给定角度,获得一个表示 X/Y 增量的单位向量也很容易:
float dx = std::cos(angle);
float dy = std::sin(angle);