为什么我的代码有时只注意到冲突?

2024-09-27 07:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这个游戏是一个太空射击游戏,我遇到了一个奇怪的问题,我的激光只是偶尔击中敌人,而其他时候正好通过

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

我有激光和入侵者的课程,AmtLaser是一个列表,存储屏幕上的激光,直到它们被删除。我没有将其设置为在接触时摧毁敌人,因此我能够注意到,如果我继续射击敌人,同一个敌人有时会被击中,而其他时候不会被击中。为什么会发生这种情况?我如何修复它

这里有一个编辑: 激光只击中最近繁殖的敌人,我想我知道为什么

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)

当一个新的敌人诞生时,入侵者.x和入侵者.y会跟踪这个特定的敌人,而不会跟踪其他敌人,因为这个类同时在屏幕上有多个敌人。我如何分别追踪每个敌人


Tags: self游戏indexifcolpopcolor入侵者
1条回答
网友
1楼 · 发布于 2024-09-27 07:26:25

你将需要测试,看看是否有任何激光击中任何敌人。使用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?

我建议使用^{}对象和^{}进行碰撞测试:

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

相关问题 更多 >

    热门问题