Понедельник, 11.05.2026, 19:38
TagumPlay 

 
Главная Регистрация Вход

Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Код плавного перемещения по карте
PINEgrosebeakДата: Воскресенье, 27.02.2011, 23:37 | Сообщение # 1
Администратор-программист
Группа: Администраторы
Сообщений: 88
Статус: Offline
Доброго времени суток,

В любой стратегической игре нужна формула передвижения юнитов. После нескольких проб и ошибок я таки написал подходящий для этого код.


    Лично я пишу на 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, иначе юнит достиг конечной точки назначения.
Так как увеличение координаты происходит единожды, то требуется помещать эту функцию в таймер.

Надеюсь я вам помог, всего хорошего.


 
  • Страница 1 из 1
  • 1
Поиск:


We are working for the future.