2013-03-18 145 views
0

您好我對python相當陌生(幾個月來一直使用它),我想知道如何從列表中獲得更快的碰撞。我有一個地圖,它是一個帶有對象的簡單二維數組,並且有一個相機矩形,用於檢查是否有任何Rect對象發生了碰撞,並且我正在嘗試爲玩家移動做同樣的事情,但即使在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))) 

回答

1

使用空間索引,例如四叉樹。這允許您高效地查詢哪些對象與給定的AABB(軸對齊的邊界框)相沖突,然後如果對象與AABB不相等,則可以進行更復雜的測試 - 例如,如果它們是圓形的。

這裏是從pygame的維基的範例: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