Заставить пулю следовать за движущимся объектом с определенной скоростью, используя Pygame? - PullRequest
1 голос
/ 13 апреля 2019

в основном. Я пытаюсь создать игру защиты башни, и мне нужны башни, чтобы стрелять по врагу и чтобы пуля следовала за этим врагом с определенной скоростью, пока он не поразит его. Я уже написал весь код, однако я по какой-то причине не могу заставить метод «отслеживания» работать для пули. Я думал, что мог бы сделать это, просто используя полярное преобразование в декартово, однако я должен был что-то переоценить, поскольку пуля не приближается к цели.

Вот что у меня есть:

def follow(self):
    dx = (self.rect.x + 4) - (self.target.rect.x + 15)
    dy = (self.rect.y + 4) - (self.target.rect.y + 15)
    angle = math.atan2(dy, dx)
    x = self.speed * math.cos(angle)
    y = self.speed * math.sin(angle)
    self.rect.x += x
    self.rect.y += y

1 Ответ

1 голос
/ 13 апреля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...