Как заставить сущность двигаться в направлении?

11

У меня есть Entityэкземпляр, который обновляется каждый тик игры. Давайте просто предположим, что сущность постоянно движется вперед. Я хотел бы иметь возможность дать угол объекта функции, которая заставляет его двигаться в этом направлении:

moveForward(90);должен заставить их двигаться вправо. Если бы я объявил мое вращение как глобальные int, то делать

moveForward(rotation);
rotation++;

заставит его проследить маленький круг своим движением.

Как я могу это сделать? Я предполагаю, что это включает векторную математику; Я не знаю ничего, поэтому краткое объяснение было бы хорошо.

Шон Уайлд
источник

Ответы:

16

Ну, в простейшем смысле у вас есть что-то вроде этого.

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

Однако скорость движения врага высока, и вы можете определить, сколько они должны двигаться в направлении х и сколько они движутся в направлении у, взяв грех или cos угла и умножив на скорость. Потому что...

 sin(a) = x / speed

Так:

 x = speed * sin(a)

А также:

cos(a) = y / speed

Так:

y = speed * cos(a)

В вашем примере moveForward(90)выдаст speed * sin(90)или speed * 1в направлении х и speed * cos(90)или 0в направлении у (он должен двигаться вправо, как вы указали). Это должно начать вас в базовом смысле.

Делая это вообще:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}
Кевин ДиТраглия
источник
Ааа, это намного проще, чем я себе представлял, большое спасибо :)
Shaun Wild
Я уверен, что вам нужно поменять y и x. грех (альфа) = б / с.
Jcora
@Bane соответствует рисунку, который я сделал SOH-CAH-TOA, грех противоположен гипотенузе, которая на чертеже равна x / speed. Если бы угол находился с другой стороны треугольника, он был бы обратным (и если бы это было более практичным для целей игрового дизайна, я мог бы изменить его, но я чувствую, что все это произвольно).
Кевин ДиТраглия,
Я разговариваю по мобильному телефону, так что это было довольно сложно интерпретировать. Я просто просмотрел формулы ...
Jcora
Это действительно хороший треугольник у тебя там. +1
Брат Кевин Д.
3

Другой ответ на данный момент неверен, чтобы правильно перемещаться по плоскости на основе поворота, вы делаете следующее:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

Однако я бы порекомендовал сделать переменную для cos / sin, которую вы обновляете только при изменении поворота, чтобы вы не вычисляли ее 4 раза за такт.

StrafeSpeed ​​будет двигаться из стороны в сторону, forwardSpeed ​​для движения вперед вдоль вашего вращения.

редактировать: тесселоде делает то же самое, за исключением того, что у него нет движения из стороны в сторону.

teh8bits
источник
2

Вы сказали, что тики обновлений, так что я предполагаю, что у вас нет переменной частоты кадров. Если так:

х + = скорость * математика (угол)

у + = скорость * математика.син (угол)

Если вы используете переменную частоту кадров, вам нужно также умножить на дельта время.

tesselode
источник