self.rect.x
и self.rect.y
являются интегральными значениями.Если вы добавите значение с плавающей запятой, которое меньше 1,0, то результат не изменится.
Я рекомендую использовать pygame.math.Vector2
для управления положением в координатах с плавающей запятой.Установите положение пули в конструкторе:
self.pos = pygame.math.Vector2(self.rect.center)
Рассчитайте вектор направления от пули к цели:
dir = pygame.math.Vector2(self.target.rect.center) - self.pos
Используйте .length()
длярассчитать расстояние до цели.Рассчитайте нормализованное направление от пули к цели, разделив на distance
.Нормализованным вектором является Единичный вектор длиной 1,0:
distance = dir.length()
if distance > 0:
dir = dir / distance
Обновите положение и прямоугольник.Убедитесь, что пуля не «проходит» цель, ограничивая движение пули расстоянием до цели (min(distance, self.speed)
):
self.pos += dir * min(distance, self.speed)
self.rect.center = self.pos
Код может выглядеть примерно так:
class Bullet:
def __init__(self, [...])
self.rect = [...]
self.pos = pygame.math.Vector2(self.rect.center)
def follow(self):
dir = pygame.math.Vector2(self.target.rect.center) - self.pos
distance = dir.length()
if distance > 0:
dir = dir / distance
self.pos += dir * min(distance, self.speed)
self.rect.center = self.pos