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

2024-03-28 16:55:18 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我是python的新手(已经使用了几个月了),我想知道如何从列表中获得更快的碰撞。我有一个简单的二维物体阵列的地图和一个相机矩形,检查是否有任何矩形物体发生碰撞,我试图做同样的球员运动,但它落后于地狱,即使在一个小的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)))

Tags: in列表for地图rangecpugrid物体
1条回答
网友
1楼 · 发布于 2024-03-28 16:55:18

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

下面是pygamewiki的一个示例实现:http://www.pygame.org/wiki/QuadTree(您必须撤消示例代码中的HTML实体引用)

或者,你可以加入一个别人写的物理引擎。你知道,写一个物理引擎需要大量的工作。即使是简单的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

相关问题 更多 >