我想问的是,将鼠标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);
std::atan2()
返回的angle
介于-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个方向中的一个",也就是说,取决于你想给哪个离散的方向赋什么值。
给定角度,获得代表X/Y增量的单位向量也很容易:
float dx = std::cos(angle);
float dy = std::sin(angle);