【问题标题】:Why does my code only sometimes notice collision?为什么我的代码有时只注意到冲突?
【发布时间】:2021-03-14 01:13:10
【问题描述】:

这款游戏是一款太空射击游戏,我遇到了一个奇怪的问题,我的激光有时只能击中敌人,而其他时候则直接穿过。

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)

当一个新的敌人被生成时,inviders.x 和inviders.y 会跟踪那个特定的敌人,而不会跟踪其他的,因为这个类同时在屏幕上显示了多个敌人。如何分别跟踪每个敌人?

【问题讨论】:

  • 没有足够的信息来回应。尝试添加更多信息。您可以在循环中打印您的lasers.x 和 linvaders.x 以查看这些值是否有意义。
  • 您的激光移动速度是否足够快,可以在两次更新之间一路穿过敌人?
  • 好的,我发现了一些重要的事情。它穿过屏幕上不是最高的任何敌人。这意味着当一个新的敌人在顶部生成时,激光将穿过除那个之外的所有敌人。

标签: python python-3.x pygame


【解决方案1】:

您需要测试一下是否有任何激光击中了任何敌人。使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多