一个人受伤后很少有敌人眨眼

few enemies blinks after one gets demage

问题

当子弹大部分时间与敌人相撞时,少数其他敌人会隐形 0.05 秒(闪烁)。好吧,我知道为什么会这样,但我不知道如何解决它。

代码

这是我的敌人伤害代码:

    for e in range(len(enemy.x)):
        angle = math.atan2(player.y - enemy.y[e], player.x - enemy.x[e])
        enemy.vel[e] = [math.cos(angle) * 2, math.sin(angle) * 2]
        enemy.x[e] += enemy.vel[e][0]
        enemy.y[e] += enemy.vel[e][1]
        rect = pygame.draw.rect(win, (255, 0, 0), (enemy.x[e], enemy.y[e], 40, 40))
        if rect.collidelistall(bullet.rect):
            enemy.healt[e] -= 1
            if enemy.healt[e] <= 0:
                del enemy.x[e]
                del enemy.y[e]
                del enemy.t[e]
                del enemy.vel[e]
                del enemy.healt[e]
            del bullet.x[rect.collidelistall(bullet.rect)[0]]
            del bullet.y[rect.collidelistall(bullet.rect)[0]]
            del bullet.vel[rect.collidelistall(bullet.rect)[0]]
            del bullet.dmg[rect.collidelistall(bullet.rect)[0]]
            break

为什么敌人会眨眼

敌人闪烁是因为当一个敌人受到攻击时,它需要跳出循环,即使还有几个敌人要 blit。

为什么我需要跳出循环

好吧,如果不这样做,当敌人被摧毁时,我会得到 Index 错误。发生这种情况是因为当敌人被摧毁时,整个列表会变小。

感谢您的帮助!

How to remove items from a list while iterating?

在你的情况下,问题很难解决,因为你没有只有一个列表,每个坐标和每个速度都有单独的列表。使用具有坐标和速度属性的敌人对象可以很容易地处理这个问题。所以你会有一个敌人列表,而不是多个坐标和速度列表。

无论如何,解决您的问题的一个简单技巧是以相反的顺序遍历列表:

for e in range(len(enemy.x)):

for e in range(len(enemy.x)-1, -1, -1):

所以你可以去掉那个 break 语句。