Доброго времени суток, В любой стратегической игре нужна формула передвижения юнитов. После нескольких проб и ошибок я таки написал подходящий для этого код.
Лично я пишу на C#, код будет соответствующий.
Code
public void GoTo( Point MoveTo )
{
float dX , dY;
double C;
dX = Math.Abs(MoveTo.X - X);
dY = Math.Abs(MoveTo.Y - Y);
C = Math.Sqrt(dX * dX + dY * dY);
if (C >= 1 & Moveing == true)
{
if (X > MoveToX + Maps.ScrollMapX)
dX = -dX;
if (Y > MoveToY + Maps.ScrollMapY)
dY = -dY;
X = X + Speed * (dX / (float)C);
Y = Y + Speed * (dY / (float)C);
}
else
Moveing = false;
}
Теперь подробно всё опишу. X, Y - координаты нашего юнита по осям Х, Y соответственно.
dX, dY - расстояние по осям которое должен преодолеть юнит от его начальной координаты до конечной.
Замечу что X, Y, dX, dY должны быть типа float. Т.к. при (dX / (float)C) мы в любом случае получаем дробное число. Если использовать тип int то он будет округлять значение до 0 и прибавки к координатам не будет.
MoveTo - точка в которую мы посылаем юнита.
С - длина вектора из точки ( X, Y ) до точки MoveTo.
Speed - скорость вашего юнита.
if (X > MoveToX + Maps.ScrollMapX)
dX = -dX;
if (Y > MoveToY + Maps.ScrollMapY)
dY = -dY;
Эта часть кода определяет направление юнита ( вправо - влево, вверх - вниз ) сравнивая начальные координаты и координаты конечные.
X = X + Speed * (dX / (float)C);
Y = Y + Speed * (dY / (float)C);
Увеличивает или уменьшает текущие координаты в зависимости от направления.
C = Math.Sqrt(dX * dX + dY * dY);
Расстояние по вектору находим обычным уравнением по теореме Пифагора.
if (C >= 1 & Moveing == true)
Изменения происходят до тех пор пока расстояние по вектору до конечной точки будет больше 1, иначе юнит достиг конечной точки назначения.
Так как увеличение координаты происходит единожды, то требуется помещать эту функцию в таймер.
Надеюсь я вам помог, всего хорошего.