0

こんにちは、私はPythonにかなり慣れていません(数か月間使用しています)。リストから衝突を高速化するにはどうすればよいか疑問に思っていました。オブジェクトを含む単純な 2D 配列であるマップがあり、Rect オブジェクトのいずれかが衝突したかどうかをチェックするカメラ Rectangle があり、プレイヤーの動きに対して同じことをしようとしていましたが、小さな 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 配列に格納して、指定された 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
于 2013-03-18T00:54:49.980 に答える