Конвертировать Pos мышью в направлении и обратно - PullRequest
1 голос
/ 04 июля 2011

Я хочу спросить, какова была бы лучшая формула для преобразования позиции мыши X, Y в одно из 16 направлений от позиции игрока.

Я работаю в c ++, sfml 1.6, так что я легко получаю каждую позицию, но я не знаю, как конвертировать их в зависимости от угла позиции игрока или чего-то еще. (Я никогда не был хорош в математике, и для более чем 4 направлений if утверждения выглядят слишком сложными).

Также я хочу отправить его на сервер, который преобразует направление обратно в дельта X, Y, чтобы он мог сделать что-то вроде:

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Вы можете использовать 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 направлений»,то есть, в зависимости от того, какое значение вы хотите присвоить какому дискретному направлению.

Учитывая угол, получить единичный вектор для представления дельты X / Y тоже довольно просто:

float dx = std::cos(angle);
float dy = std::sin(angle);
0 голосов
/ 04 июля 2011

«Самый простой» способ - преобразовать два набора координат (один для текущей позиции игрока, один для текущей позиции мыши) в угол относительно позиции игрока, где угол 0 - прямая линиявпереди игрока (или на север, в зависимости от того, как работает ваша игра).Тогда каждое из ваших шестнадцати направлений будет переводиться в заданный интервал в 22,5 градуса.

Однако, так как вы сказали, что плохо разбираетесь в математике, я думаю, вы ищете что-то более конкретное, чем это.

...