Рассчитать вектор от позиции маркера до цели, используя pygame.math.Vector2
:
tragetPos = pygame.math.Vector2(bullet.MX, bullet.MY)
bulletPos = pygame.math.Vector2(bullet.X, bullet.Y)
bulletDir = tragetPos - bulletPos
Рассчитать длину вектора (pygame.math.length()
).Длина - это текущее расстояние от пули до цели:
distance = bulletDir.length()
Нормализовать вектор направления (pygame.math.normalize()
).Это означает, что вектор становится Единичным вектором с длиной 1:
bulletDir = bulletDir.normalize()
Пуля должна двигаться в направлении цели с минимумом скорости (bullet.speed
) ирасстояние до цели (пуля не должна выходить за пределы цели).Вычислите новую позицию пули:
bulletPos = bulletPos + bulletDir * min(distance, speed)
Наконец, можно установить атрибуты X
и Y
и пулю blit
.Функция может выглядеть так:
def Entities():
for bullet in gd.bulletList:
tragetPos = pygame.math.Vector2(bullet.MX, bullet.MY)
bulletPos = pygame.math.Vector2(bullet.X, bullet.Y)
bulletDir = tragetPos - bulletPos
distance = bulletDir.length()
if distance > 0:
bulletDir = bulletDir.normalize()
bulletPos = bulletPos + bulletDir * min(distance, speed)
bullet.X, bullet.Y = bulletPos
win.blit(spd.sprites['bullet'], (int(bullet.X), int(bullet.Y)))