微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我的代码有时会注意到冲突?

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

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 举报,一经查实,本站将立刻删除。