Pygame, как найти ближайший спрайт в массиве и заблокировать его? - PullRequest
2 голосов
/ 08 апреля 2019

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

Я уже пробовал использовать циклы 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 Ответ

2 голосов
/ 08 апреля 2019

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