Как сделать так, чтобы каждый спрайт в группе A преследовал ближайший спрайт в группе B?

avatar
taijifajin
16 сентября 2020 в 20:12
121
1
1

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

У меня есть код, в котором все спрайты в группе преследуют один спрайт из другой группы.

def chase(sprite, group):
    for entity in group:
        if math.hypot(entity.rect.centerx - sprite.rect.centerx, entity.rect.centery - sprite.rect.centery) < 1200:
            if entity.rect.left - sprite.rect.left < 0:
                entity.rect.left += 2
            else:
                entity.rect.left -= 2
            if entity.rect.top - sprite.rect.top < 0:
                entity.rect.top += 2
            else:
                entity.rect.top -= 2

Я также могу заставить все спрайты в преследуемой группе запускаться от одного спрайта в другой группе:

def run(sprite, group):
for entity in group:
    if math.hypot(entity.rect.centerx - sprite.rect.centerx, entity.rect.centery - sprite.rect.centery) < 65:
        if entity.rect.left - sprite.rect.left < 0:
            entity.rect.left -= 9
        else:
            entity.rect.left += 9
        if entity.rect.top - sprite.rect.top < 0:
            entity.rect.top -= 9
        else:
            entity.rect.top += 9

Я не могу понять, как сделать так, чтобы вся группа реагировала. То есть, конечно, вся группа будет преследовать, но только за 1 спрайтом. Я не могу всей группой преследовать всю другую группу. И я не могу сказать всей другой группе, что они должны бежать от ВСЕХ преследователей, а не только от одного.

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

enemy = min([e for e in chased], key=lambda e: pow(e.x-entity.x, 2) + pow(e.y-entity.y, 2)) 

Но мне сказали, что группа не является итерируемой.

Кто-нибудь может помочь мне с этими двумя вещами? Пусть вся группа преследователей просматривает всю другую группу преследователей, а затем движется к ближайшему?

Спасибо за помощь!

Источник

Ответы (1)

avatar
Rabbid76
16 сентября 2020 в 20:18
1

[...] группа не является итерируемой.

Если chased является pygame.sprite.Group объект, то вы можете получить список pygame.sprite.Sprite объекты по методу sprites():

enemy = min([e for e in chased.sprites()], 
            key=lambda e: pow(e.x-entity.x, 2) + pow(e.y-entity.y, 2))