Python 如何从列表中获得更快的碰撞?

Python 如何从列表中获得更快的碰撞?,python,python-2.7,pygame,Python,Python 2.7,Pygame,嗨,我是python的新手(已经使用了几个月了),我想知道如何从列表中获得更快的碰撞速度。我有一张地图,它是一个带有对象的简单2D数组,还有一个相机矩形,用来检查是否有任何矩形对象发生碰撞,我也试图对玩家的移动进行同样的检查,但即使是在一张120×90的小地图上,它也落后于地狱 那么,我如何通过使用CPU来加快速度呢 for x in range(gridLength): for y in range(gridHeight): if cameraRect.collider

嗨,我是python的新手(已经使用了几个月了),我想知道如何从列表中获得更快的碰撞速度。我有一张地图,它是一个带有对象的简单2D数组,还有一个相机矩形,用来检查是否有任何矩形对象发生碰撞,我也试图对玩家的移动进行同样的检查,但即使是在一张120×90的小地图上,它也落后于地狱 那么,我如何通过使用CPU来加快速度呢

for x in range(gridLength):
    for y in range(gridHeight):
        if cameraRect.colliderect(grid[x][y].Rect):
            grid[x][y].draw(screen,((x * 16 + (WINDOWWIDTH / 2 - 16)) - playerRect.left),((y * 16) - playerRect.top + (WINDOWHEIGHT / 2 - 16)))

使用空间索引,例如四叉树。这使您能够高效地查询哪些对象与给定的AABB(轴对齐边界框)碰撞,然后如果对象不等于其AABB(例如,如果它们是圆),您可以在之后进行更复杂的测试

下面是PyGame Wiki的一个示例实现:(您必须撤消示例代码中的HTML实体引用)

或者,你也可以加入其他人编写的物理引擎。你知道,编写一个物理引擎需要大量的工作。你可能会惊讶,即使是简单的2D游戏,它的工作量也是如此之大

如果将平铺用于标高数据,还可以将平铺存储在二维数组中,并检查给定rect中的非零平铺。比如:

def hit_test(x, y, xsize, ysize):
    xmin = (x - xsize//2) // tile_size
    xmax = (x + xsize//2) // tile_size
    ymin = (y - ysize//2) // tile_size
    ymax = (y + ysize//2) // tile_size
    for xtile in range(xmin, xmax):
        for ytile in range(xmin, xmax):
            if tiles[xtile][ytile] != 0:
                COLLISION