Pygame как найти ближайший спрайт в массиве и заблокировать его?

#python #arrays #python-3.x #pygame #distance

#python #массивы #python-3.x #pygame #расстояние

Вопрос:

У меня есть ракетный спрайт, который, если я им выстрелю. Он должен попасть в ближайшего вражеского спрайта. Я не знаю, как продолжать в том же духе. Я полностью осознаю, что мы будем использовать некоторые формулы расстояния, но проблема не в этом. Проблема заключается в циклическом переборе врагов в списке и поиске врага, который находится ближе всего к ракете.

Я уже пробовал использовать циклы for, но это все, о чем я могу думать на данный момент. Я просмотрел другие сообщения, но ни в одном из них нет проблемы того же типа. Только для отдельных спрайтов, которых еще нет в списках.

Класс ракеты

 class Missile:
    missile = pygame.image.load("Missile-1.png")
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.yvel = 15
        self.xvel = 5
    def draw(self,win):
        win.blit(missile,(self.x,self.y))
    def chase(self):
        for enemy in enemies:
            #some code
  

Массивы:

 missiles = []
enemies = []
  

Я ожидаю, что ракета полетит в сторону ближайшего врага.

Ответ №1:

Я рекомендую использовать pygame.math.Vector2 и функцию .distance_to() для вычисления евклидова расстояния между 2 точками.

 def chase(self):
    pos = pygame.math.Vector2(self.x, self.y)
    enemy = min([e for e in enemies], key=lambda e: pos.distance_to(pygame.math.Vector2(e.x, e.y)))
  

Объяснение:

lambda e: pos.distance_to(pygame.math.Vector2(e.x, e.y)) вычисляет расстояние от аргумента e до pygame.math.Vector2 объекта pos .
min находит минимальный элемент в итерируемом. «Минимальное» значение задается функцией, для которой задан key аргумент.

pos инициализируется позицией Missile . Для каждого элемента enemies вычисляется расстояние до pos и возвращается враг, который находится ближе pos всего к min .


Конечно, это можно упростить, вручную вычисляя квадрат евклидова расстояния:

 def chase(self):
    enemy = min([e for e in enemies], key=lambda e: pow(e.x-self.x, 2)   pow(e.y-self.y, 2))