0

嗨,我对 python 相当陌生(现在已经使用了几个月),我想知道如何从列表中获得更快的碰撞。我有一个地图,它是一个带有对象的简单 2D 数组,并且有一个相机 Rectangle 来检查是否有任何 Rect 对象发生碰撞,我试图对玩家的移动做同样的事情,但即使在一个小的 120 by 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)))
4

1 回答 1

1

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

以下是 PyGame Wiki 的示例实现:http://www.pygame.org/wiki/QuadTree 您必须撤消示例代码中引用的 HTML 实体)

或者,您可以加入其他人编写的物理引擎。你知道,编写一个物理引擎是一项巨大的工作。即使是简单的 2D 游戏,您也可能会感到惊讶。

如果您将切片用于级别数据,您也可以将切片存储在 2D 数组中,并检查给定矩形中的非零切片。就像是:

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
于 2013-03-18T00:54:49.980 回答