首页 > 解决方案 > 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 = []

我预计导弹会飞向最近的敌人。

标签: pythonarrayspython-3.xpygamedistance

解决方案


我建议使用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))计算参数epygame.math.Vector2对象的距离pos
min查找可迭代的最小元素。“最小”值由设置为key参数的函数给出。

pos由 的位置初始化Missileenemies计算距离的每个元素,并返回pos距离最近的敌人。 posmin


当然,这可以通过手动计算平方欧几里得距离来进一步简化:

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

推荐阅读