Вычисление скорости с использованием постоянной скорости в базовом движке C++

Я пытаюсь добиться того, чтобы спрайт перемещался к другому спрайту в 2D-среде. Я начал с базовой сделки Mx = Ax - Bx. Но я заметил, что чем ближе к цели подбирается спрайт, тем больше он замедляется. Итак, я попытался создать процент / соотношение на основе скорости, тогда каждый x и y получает свой процент от допустимой скорости, однако это действует очень странно и, кажется, работает только в том случае, если Mx и My положительны. Вот фрагмент кода:

ballX = ball->GetX();
    ballY = ball->GetY();
    targX = target->GetX();
    targY = target->GetY();
    ballVx = (targX - ballX);
    ballVy = (targY - ballY);
    percentComp = (100 / (ballVx + ballVy));
    ballVx = (ballVx * percentComp)/10000;
    ballVy = (ballVy * percentComp)/10000;

/10000 для замедления движения спрайтов.


person Jamie Davenport    schedule 12.07.2016    source источник
comment
Вы можете использовать теорему Пифагора, чтобы установить длину ballV в определенное число.   -  person Guillaume Racicot    schedule 12.07.2016
comment
Я начал с базовой сделки Mx = Ax - Bx. Но я заметил, что чем ближе к цели подбирается спрайт, тем больше он замедляется. Похоже, что-то было не так с вашими входными или выходными данными в первую очередь. Вам нужно отладить это, а не корректировать формулу для учета вашей ошибки. Вы должны найти вектор до второй точки и масштабировать этот вектор по дельта-времени, чтобы найти новую позицию.   -  person Jonathan Mee    schedule 12.07.2016


Ответы (2)


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

#include <stdio.h>

int main(int, char **)
{
   float startX = 10.0f, startY = 20.0f;
   float endX = 35.0f, endY = -2.5f;
   int numSteps = 20;

   for (int i=0; i<numSteps; i++)
   {
      float percentDone = ((float)i)/(numSteps-1);
      float curX = (startX*(1.0f-percentDone)) + (endX*percentDone);
      float curY = (startY*(1.0f-percentDone)) + (endY*percentDone);

      printf("Step %i:  percentDone=%f curX=%f curY=%f\n", i, percentDone, curX, curY);
   }
   return 0;
}
person Jeremy Friesner    schedule 12.07.2016

Спасибо за ответы, теперь у меня все работает, но я нормализую векторы, а не весь процент, вот что у меня есть сейчас:

    ballX = ball->GetX();
    ballY = ball->GetY();
    targX = target->GetX();
    targY = target->GetY();
    ballVx = (targX - ballX);
    ballVy = (targY - ballY);
    vectLength = sqrt((ballVx*ballVx) + (ballVy*ballVy));
    ballVx = (ballVx / vectLength)/10;
    ballVy = (ballVy / vectLength)/10;  
person Jamie Davenport    schedule 12.07.2016
comment
Следите за делением на ноль, когда мяч находится в мишени (если вы еще не проверили это) - person Blindman67; 13.07.2016