Отримайте бали на лінії між двома точками


9

Я роблю просту космічну гру в JavaScript, але тепер я потрапив у стіну щодо векторів.

Перегляд гри зверху вниз на 2d сітці. Коли користувач натисне на сітку, космічний корабель полетить на це місце.

Отже, якщо у мене є два набори балів:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

Якщо ігровий цикл тикає зі швидкістю 60 ітерацій в секунду, а бажана швидкість корабля становить 0,05 бала за тик (3 бали в секунду), як я обчислюю новий набір координат для судна для кожного галочки ігрового циклу?

ps Я не хочу пояснювати інерцію чи кілька векторів, що впливають на корабель, я просто хочу, щоб корабель зупинив все, що він робить (тобто летить в один бік) і рухається до натиснутих координат зі статичною швидкістю.

Відповіді:


8

У псевдокоді:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

@ Тристан: Ти маєш на увазі goal_distсвій ifстан?
Nate W.

21

LERP - лінійна інтерполяція

Я відповів на подібну проблему кілька днів тому, але ось ми:

Лінійна інтерполяція - це функція, яка дає вам число між двома числами на основі прогресу. Насправді ви могли отримати точку між двома балами.


Велика формула - як її обчислити

Загальна формула Lerp даються pu = p0 + (p1 - p0) * u. Де:

  • pu: Номер результату
  • p0: Початкове число
  • p1: Кінцеве число
  • u: Прогрес. Він подається у відсотках, між 0 і 1.

Як отримати відсоток

Вам може бути цікаво: "Як я можу отримати цей відсоток!". Не хвилюйся. Це приблизно так: скільки часу знадобиться подорожі, щоб закінчити вектор запуску? Гаразд, розділіть його на час, який вже минув. Це дасть вам відсоток.

Подивіться, щось подібне: percentage = currentTime / finalTime;


Розрахунок векторів

Щоб отримати результуючий вектор, все, що вам потрібно зробити, це застосувати формулу два рази, один для X компонента і один для Y компонента. Щось на зразок цього:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

Обчислення змінного часу

Можливо, ви хочете, щоб ваші очки подорожували зі швидкістю 0,5 бала, так? Тож скажімо, більш довгу відстань буде проїхати за довший час.

Ви можете це зробити так:

  • Отримати довжину відстані Для цього вам знадобляться дві речі. Отримайте вектор відстані, а потім перетворіть його у значення довжини.

    distancevec = final - start;
    distance = distancevec.length();

Я сподіваюся, що ви знаєте математику векторів. Якщо цього немає, ви можете обчислити векторну довжину за цією формулою d = sqrt(pow(v.x, 2) + pow(v.y, 2));.

  • Отримайте час, який знадобиться, та оновіть підсумковий час. Це легко. Оскільки ви хочете, щоб кожна галочка отримувала 0,5 довжини, нам просто потрібно розділити і отримати скільки кліщів у нас.

    finalTime = distance / 0.5f;

Зроблено.

УВАГА: Можливо, це може бути не призначеною для вас швидкістю, але це правильно. тому у вас лінійний рух, навіть на діагональних ходах. Якщо ви хотіли зробити x + = 0,5f, y + = 0,5f, тоді прочитайте книгу з векторної математики та перевірте свої плани.


Що робити, якщо ви хочете залишити% до місця призначення зі своєї позиції? ЯКЩО ви не можете використовувати дельта-час, а скоріше x: y координати.
Дейв

Якщо ви обчислили, progressяк зазначено у цій відповіді, він повинен бути в 0..1діапазоні. Просто зробіть:progressLeft = 1.0 - progress;
Густаво Масіель

3

Це можна зробити, обчисливши нормаль напрямку і потім обчисливши поточне положення за допомогою параметричного рівняння

newPoint = startPoint + directionVector * velocity * t

Де t - час, що минув з моменту, коли судно почало подорожувати в потрібному напрямку. Ви також можете виконати це за оновлення через

newPoint = currentPoint + directionVector * velocity * timeDelta

І ви просто підраховуєте це на кожному кадрі / фізиці / тощо. оновлення, поки судно не досягне місця призначення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.