1

我想问将鼠标 X,Y 位置转换为玩家位置的 16 个方向之一的最佳公式是什么。

我在 c++ ,sfml 1.6 中工作,所以我很容易获得每个位置,但我不知道如何根据玩家位置或其他东西的角度来转换它们。(我从来都不擅长数学,超过 4 个方向的if陈述看起来太复杂了)。

我还想将它发送到服务器,将方向转换回增量 X,Y,这样他就可以执行以下操作:

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

2 回答 2

0

“最简单”的方法是将您的两组坐标(一组用于当前玩家位置,一组用于当前鼠标位置)转换为相对于玩家位置的角度,其中角度 0 是直线前面的直线玩家(或北,取决于你的游戏如何运作)。然后,您的 16 个方向中的每一个都将转换为给定的 22.5 度间隔。

但是,既然你说你数学不好,我想你正在寻找比这更具体的东西。

于 2011-07-04T14:48:03.757 回答
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(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);
于 2011-07-04T14:52:40.787 回答