【问题标题】:How do I Get Faster Collisions From A List?如何从列表中获得更快的碰撞?
【发布时间】:2013-03-18 00:44:22
【问题描述】:

嗨,我对 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)))

【问题讨论】:

    标签: python python-2.7 pygame


    【解决方案1】:

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

    这是来自 PyGame Wiki 的示例实现: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多