#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))