猿问

以正确的顺序错误地移除精灵组敌人

我有 2 个精灵组,一组用于敌人,一组用于玩家武器。我如何设置敌人 sprite 组的示例......(武器 sprite 组以相同的方式完成)


class Bat(pygame.sprite.Sprite):

    def __init__(self, bat_x, bat_y, bat_image, bat_health, bat_immune, const, dash_counter, dash, dash_time, fly_count, fly_time):

        pygame.sprite.Sprite.__init__(self)

        self.bat_health = bat_health

        self.bat_immune = bat_immune

        self.const = const

        self.dash_counter = dash_counter

        self.dash = dash

        self.dash_time = dash_time

        self.fly_count = fly_count

        self.fly_time = fly_time

        self.image = bat_image

        self.rect = self.image.get_rect()

        self.mask = pygame.mask.from_surface(self.image)

        self.rect.topleft = (bat_x, bat_y)

        self.bat_x = bat_x

        self.bat_y = bat_y

    def update(self):

        if pygame.sprite.groupcollide(all_bats, all_sword, False, True):

            self.bat_health -= 1 

        if self.bat_health == 0:

            self.kill()

        ... #Irrelevant

all_bats = pygame.sprite.Group()


def bat_create():

    bat_x = r_x*40

    bat_y = r_y*40

    bat_health = 5

    bat_immune = False

    const = 3

    dash_counter = 0

    dash = False

    dash_time = 0

    fly_count = 0

    fly_time = 0

    new_bat = Bat(bat_x, bat_y, bat_image, bat_health, bat_immune, const, dash_counter, dash, dash_time, fly_count, fly_time)

    all_bats.add(new_bat)

当玩家的武器击中蝙蝠时,无论击中的是哪只蝙蝠,在击中 5 次后第一只生成的蝙蝠将被杀死。我不知道为什么会这样。


墨色风雨
浏览 88回答 1
1回答

繁花如伊

看起来这是问题所在:def update(self):    if pygame.sprite.groupcollide(all_bats, all_sword, False, True):        self.bat_health -= 1 groupcollide返回碰撞列表。上面的代码正在检查all_bats,all_swords所以一切都 Vs 一切。并且if ( non-empty-list )总是返回True。所以如果发生任何蝙蝠+剑的碰撞,这个精灵的生命值就会减少。每次任何蝙蝠碰撞时,这可能都会减少每只蝙蝠的数量。因此,创建的第一个项目将首先达到零。self.bat_health您需要检查“这个精灵”是否是碰撞的一部分。这是一个相当简单的改变:def update(self):    hit_list = pygame.sprite.groupcollide(all_bats, all_sword, False, True):    if ( self in hit_list ):        self.bat_health -= 1 但是groupcollide在每只蝙蝠的update(). 也许将groupcollide调用移动到.update()函数之外的某个地方,并且只执行一次这些计算。将碰撞结果传递给 sprite-update 函数等。
随时随地看视频慕课网APP

相关分类

Python
我要回答