这个游戏是一个太空射击游戏,我有一个奇怪的问题,我的激光有时只击中敌人,而其他时候正好通过。
for lasers in amtLasers:
if lasers.y < invaders.y:
if lasers.x > invaders.x-56 and lasers.x < invaders.x+28:
amtLasers.pop(amtLasers.index(lasers))
amtInvaders.pop(amtInvaders.index(invaders))
score += 20我有激光和入侵者的类,amtLasers是一个列表,它存储屏幕上的激光,直到它们被删除。我没有设置为在接触时摧毁敌人,所以我能够注意到,如果我继续向敌人射击,同样的敌人有时会被击中,而其他时候不会被击中。为什么会发生这种情况?我如何修复它?
这里有一个编辑:激光只击中最近产生的敌人,我想我知道为什么
class invader(object):
def __init__(self):
self.x = randint(30, 1020)
self.y = 0
color = randint(1, 3)
if color == 1:
self.col = (225,0,0)
elif color == 2:
self.col = (0,225,0)
elif color == 3:
self.col = (0,115,255)
self.vel = randint(1, 2)当一个新的敌人产生时,invaders.x和invaders.y跟踪这个特定的敌人,而不跟踪其他敌人,因为这个类同时在屏幕上有多个敌人。我如何分别追踪每个敌人?
发布于 2021-03-14 15:52:39
您将需要测试,看看是否有任何激光击中任何敌人。使用2个嵌套循环来迭代敌人和激光:
for lasers in amtLasers[:]:
for invaders in amtInvaders[:]:
if lasers.y < invaders.y:
if lasers.x > invaders.x-56 and lasers.x < invaders.x+28:
amtLasers.pop(amtLasers.index(lasers))
amtInvaders.pop(amtInvaders.index(invaders))
score += 20请注意,您需要迭代列表的浅层副本。参见How to remove items from a list while iterating?。
我建议使用pygame.Rect objects和colliderect进行碰撞测试:
laser_rect = pygame.Rect(laser.x, laser.y, laser_width, laser_height)
invader_rect = pygame.Rect(invaders.x, invaders.y, invaders_width, invaders_height)
if laser_rect .colliderect(invader_rect):
amtLasers.pop(amtLasers.index(lasers))
amtInvaders.pop(amtInvaders.index(invaders))
score += 20参见How do I detect collision in pygame?和How to detect collisions between two rectangular objects or images in pygame。
https://stackoverflow.com/questions/66620138
复制相似问题