Вот весь соответствующий код.
Это запускается, когда снаряд инициализируется:
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, снаряд ускоряется ближе. Я попытаюсь объяснить это визуально. Если я стреляю вправо или влево от своего персонажа, пуля движется с требуемой скоростью. Однако, если я стреляю выше или ниже персонажа, он стреляет очень быстро. Может ли кто-нибудь сказать мне способ исправить этот или лучший способ кодировать все это? Благодарю.
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;
if (norm != 0)
. Гораздо безопаснее проверить это следующим образом: if (norm > 1.e-6)
(или что-то в этом роде).
t0
и пересчитыватьxPos
,yPos
на основе текущего времени относительноt0
. Т.е. использовать один абсолютный расчет, а не серию приращений.