2012-09-17 121 views
2

我在2D遊戲中使用python和pyglet,但碰到檢測碰到問題。我的代碼來檢查碰撞是這樣的:高效的碰撞檢測

def distance(self,target): 
    return math.sqrt((self.x-target.x)**2 + (self.y-target.y)**2) 
def check_collision(self): 
    for i in list_of_mobs: 
     if self.distance(i) < (self.width/2 + i.width/2): 
      return True 

它檢查從每個精靈的距離與「目標」是另一種精靈。我不確定的是「我應該檢查所有精靈之間的碰撞嗎?」我有超過200個怪物(我希望在成品中有更多),並且在碰撞檢查時它變得無法玩。有沒有辦法在一定距離內檢查精靈而不會失去速度?

編輯:

我已經讀圍繞谷歌,並發現了很多的速度都花在做同樣的碰撞。即用sprite2檢查sprite1,用sprite1檢查sprite2。所以,我提出來檢查碰撞功能的一些變化,它現在快運行,但仍低於20 FPS

def check_collision(self): 
    global mobs_to_collide 
    if mobs_to_collide == []: 
     mobs_to_collide = list_of_mobs[:] 
    if self in mobs_to_collide: 
     mobs_to_collide.remove(self) 
    for i in mobs_to_collide: 
     if self.distance(i) < (self.width/2 + i.width/2): 
      return True 

(它可能包含一些低效的代碼/無用的東西。我被玩弄了一點)

EDIT2:

我決定使用rabbyt作爲精靈庫。碰撞快速而簡單。我換成上面^^的代碼:

rabbyt.collisions.collide(mobs_to_collide) 

這將返回列表與相撞的對象列表(我不知道這是正確的說法)。我仍在研究如何將其轉化爲「如果碰撞:」類型的陳述,但我正在取得進展。如果有人遇到類似的情況,我會推薦使用rabbyt。

+3

有一個谷歌和閱讀有關四叉樹** **和**二進制空間分割** – Aesthete

+0

好,謝謝,我會看看 – user1237200

+0

他們看起來相當複雜:/我想也許一個網格可能工作,但我不知道如何做到這一點 – user1237200

回答

1

大概已經太晚了,但我有完全相同的問題。我設法通過計算僅可見的物體的碰撞,這樣來解決它:

for object_ in objects: 
    if not object_.visible: # pyglet.sprite.Sprite() provides this flag 
     continue 
    # rest of your collision detection 
3

一個簡單的方法來提高這個速度,可能是刪除了平方根操作

def distancesq(self,target): 
    return (self.x-target.x)**2 + (self.y-target.y)**2 
def check_collision(self): 
    for i in list_of_mobs: 
    # Square this distance to compensate 
    if self.distancesq(i) < (self.width/2 + i.width/2)**2: 
     return True 
+0

謝謝你的回答,我會試試:) sqrt函數是否會減慢它的速度? – user1237200