Что не так с моей функцией обновления снаряда?

0

Вот весь соответствующий код.

Это запускается, когда снаряд инициализируется:

slope = (yTarget - yPos) / (xTarget - xPos);
if (xTarget >= xPos)
    xDir = 1;
else
    xDir = -1;
if (yTarget >= yPos)
    yDir = 1;
else
    yDir = -1;

И это запускается каждое обновление, которое происходит с каждым игроком:

xPos += t*speed*xDir;
yPos += t*speed*yDir * abs(slope);

XTarget и yTarget - это то, где должен идти снаряд, и xPos и yPos - вот где сейчас находится снаряд. Скорость равна 1, поэтому просто игнорируйте ее, а t - количество тиков (мс), прошедших с момента последнего обновления. (обычно 0-2 на моем компьютере) Все работает отлично, за исключением того, что скорость пули, по-видимому, зависит от расстояния (xTarget - xPos) до 0, снаряд ускоряется ближе. Я попытаюсь объяснить это визуально. Если я стреляю вправо или влево от своего персонажа, пуля движется с требуемой скоростью. Однако, если я стреляю выше или ниже персонажа, он стреляет очень быстро. Может ли кто-нибудь сказать мне способ исправить этот или лучший способ кодировать все это? Благодарю.

  • 1
    Не могу определить проблему. Однако другой подход заключается в том, чтобы отслеживать время срабатывания t0 и пересчитывать xPos , yPos на основе текущего времени относительно t0 . Т.е. использовать один абсолютный расчет, а не серию приращений.
  • 0
    Мне очень нравится эта идея. Я постараюсь реализовать это сейчас. РЕДАКТИРОВАТЬ: Ой, подождите, я только что понял, это не поможет. Я почти уверен, что проблема связана с уклоном, и мне все равно придется это использовать.
Показать ещё 3 комментария
Теги:
game-physics

1 ответ

1
Лучший ответ
dx = xTarget - xPos;
dy = yTarget - yPos;
norm = sqrt(dx*dx + dy*dy);
if (norm != 0) {
    dx /= norm;
    dy /= norm;
}

Позже:

xPos += t*speed*dx;
yPos += t*speed*dy;
  • 0
    Это не очень хорошая проверка: if (norm != 0) . Гораздо безопаснее проверить это следующим образом: if (norm > 1.e-6) (или что-то в этом роде).
  • 0
    Я не делаю никаких предположений относительно масштаба его данных. Что если перед нормализацией dx = 0 и dy = 1.e-7? С моим кодом он нормализуется до dx = 0, dy = 1. С вашим кодом dy остается на уровне 1.e-7. Теперь предположим, что скорость равна 1.e-8. То, что для достижения цели должно занять 10 единиц времени, теперь займет 100000000 единиц времени. Если норма мала, это означает, что dx и dy также были малы.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню