转换鼠标位置为方向和返回



我想问的是,将鼠标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);

相关内容

最新更新