如何检测所选对象与列表中其他对象之间的碰撞

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检测所选对象与列表中其他对象之间的碰撞相关的知识,希望对你有一定的参考价值。

我如何检测汽车和traffico中的其他元素之间是否发生碰撞?

Car.posAtt是汽车在地图上的实际位置

Car.visione是在汽车前面的矩形区域,可彼此之间形成距离

Car.ingombro是图像的矩形。

当car.visione检测到与另一辆car.ingombro碰撞时,这很奇怪

for car in traffico:
    if countTrafficLight == 1:
        if car.quadPart == 2:
            if car.posAtt[1] < 430 or car.posAtt[1] > 435:                   
                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 3:
            if car.posAtt[0] > 570 or car.posAtt[0] < 565:
                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 4:
            if car.posAtt[1] < 210 or car.posAtt[1] > 220:

                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 1:
            car.Move()
            pygame.draw.rect(schermoGioco, BLUE, car.visione)
            if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
答案

实现此目标的最佳方法是将car转换为PyGame Sprite对象。这将使代码可以使用SpriteGroup和强大的groupcollide函数。

代替这一点,应该可以简单地循环N x N次,检查每辆汽车是否与其他汽车相对。从您的问题中我不确定visione矩形到底代表什么,在代码下面假设它是汽车本身的边界矩形。

def carCollidesWith( test_car, traffic ):
    """Returns the car-in-traffic that test_car collies with, or None"""
    result = None   
    for car in traffic:
        if ( car is not test_car ):                               # don't collide with yourself
            if ( test_car.visione.colliderect( car.visione ) ):
                result = car
                break

    return result

但是还有许多其他方法可以更有效地执行此操作。看看pygame Rect库documentation

以上是关于如何检测所选对象与列表中其他对象之间的碰撞的主要内容,如果未能解决你的问题,请参考以下文章

检测数组中影片剪辑内的对象与另一个对象数组之间的碰撞

OpenGL顶点缓冲区对象,我可以访问顶点数据以用于其他用途,例如碰撞检测吗?

动画精灵与碰撞检测

如何检测对象来自哪个类? Qt

如何在 3D 中对导入的波前 OBJ 文件实现对象碰撞

用于二维碰撞检测的四叉树