Как создать единичный вектор от персонажа к цели без его масштабирования в зависимости от расстояния? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь вычислить направление выстрела пули, которая идет от моего персонажа к курсору мыши.

 unitvecx = (mousex-playerX)/np.sqrt((mousex**2 +playerX**2))
 unitvecy = (mousey-playerY)/np.sqrt((mousey**2 +playerY**2))

и когда я масштабирую постоянно обновляемое изменение положения пули с этим, чтобы вычислить Направление в моей игре l oop с

if bullet_state is 'fire':
        fire_bullet(bulletX, bulletY)
        bulletX += bulletX_speed*unitvecx
        bulletY += bulletY_speed*unitvecy

Я замечаю, что по мере того, как я перемещаю курсор ближе к позиции моего персонажа, скорость пули замедляется. Я постоянно распечатываю единичный вектор и вижу, что он действительно меняется. Для меня это не имеет смысла, потому что единичный вектор всегда должен иметь величину 1. Что я делаю не так?

1 Ответ

0 голосов
/ 06 августа 2020

Вы неправильно вычисляете единичный вектор. Для цели T и источника S вектор направления равен D = T - S. Единичный вектор: U = D / norm(D)

Таким образом, в 2 координатах

Dx = Tx - Sx;
Dy = Ty - Sy;

Ux = Dx / sqrt(Dx**2 + Dy**2) = Dx / sqrt((Tx - Sx)**2 + (Ty - Sy)**2)
Uy = Dy / sqrt(Dx**2 + Dy**2) = Dy / sqrt((Tx - Sx)**2 + (Ty - Sy)**2)

Ваш текущий код имеет

Ux = Dx / sqrt(Tx**2 + Sx**2)
Uy = Dy / sqrt(Ty**2 + Sy**2)

Поскольку вы уже используете numpy, почему бы не использовать его возможности?

player_loc = np.array([playerX, playerY])
mouse_loc = np.array([mouseX, mouseY])
uvec = mouse_loc - player_loc
uvec = uvec / np.norm(uvec)

if bullet_state is 'fire':
    fire_bullet(bullet_loc[0], bullet_loc[1])
    bullet_loc = bullet_loc + bullet_speed * uvec
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...