一个人受伤后很少有敌人眨眼
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
语句。
问题
当子弹大部分时间与敌人相撞时,少数其他敌人会隐形 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
语句。