Перемещение между координатами, алгоритмы Java - PullRequest
3 голосов
/ 16 февраля 2010

Хорошо, этот вопрос будет немного абстрактным.

У меня есть значок, движущийся вдоль линии, которая представлена ​​серией координат, хранящихся в векторе, и я перебираю их. Расстояние между координатами является переменным. Поэтому иногда значок будет перемещаться медленно и плавно, а иногда он будет прыгать на несколько сотен пикселей за раз.

У меня возникают проблемы при разработке алгоритма для разделения каждого набора координат, между которыми он должен перемещаться, на набор относительных координат, где число основано на размере, так что переход будет плавным независимо от того, сколько координат на одной строке.

Любые идеи будут высоко оценены. Спасибо:)

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010

Посмотрите на это обсуждение Основной игровой цикл .

А вот цитата с этой страницы:

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

Вам нужно знать 3 вещи:

  • сколько времени прошло с момента последнего обновления позиции вашего объекта?
  • какова скорость движения вашего объекта?
  • В каком направлении (обычно представлен как Луч) ваш объект движется?

Из них вы можете рассчитать текущую позицию объекта.

1 голос
/ 16 февраля 2010

Если вы хотите, чтобы объект двигался с постоянной скоростью, я бы предложил модель, основанную на времени, где ваш объект на самом деле движется со скоростью (в пикселях в секунду). Вы все еще можете заставить его попадать в каждую точку, если вы сплайнируете вдоль кривой (например, кривой catmull-rom ).

0 голосов
/ 16 февраля 2010

То есть вы хотите перейти от начальной точки (x0 / y0) к конечной точке (x1 / y1) вдоль линии на переменное количество шагов, но с максимальным расстоянием для каждого шага?

Это может быть сделано примерно так:

int stepdist = 10; // max pixels per step
double xdiff = x1 - x0;
double ydiff = y1 - y0;
double dist = sqrt( xdiff * xdiff + ydiff * ydiff );
int steps = (int) ( ( dist - 1 ) / stepdist );
if( steps > 0 )
{
   xdiff /= steps;
   ydiff /= steps;
   while( --steps >= 0 )
   {
       x0 += xdiff;
       y0 += ydiff;
       moveTo( (int) x0, (int) y0 );
   }
}
moveTo( (int) x1, (int) y1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...