如何解决为什么我的代码有时会注意到冲突?
这个游戏是太空射击游戏,我遇到了一个奇怪的问题,我的激光有时会击中敌人,而其他时候会直接穿过。
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)
elif color == 2:
self.col = (0,225,0)
elif color == 3:
self.col = (0,115,255)
self.vel = randint(1,2)
当一个新的敌人产生时,ingressers.x 和ingressers.y 会跟踪那个特定的敌人而不是其他敌人,因为这个类同时在屏幕上有多个敌人。我将如何分别跟踪每个敌人?
解决方法
您需要测试一下是否有任何激光击中了任何敌人。使用 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
对象和 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。