我在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。
有一個谷歌和閱讀有關四叉樹** **和**二進制空間分割** – Aesthete
好,謝謝,我會看看 – user1237200
他們看起來相當複雜:/我想也許一個網格可能工作,但我不知道如何做到這一點 – user1237200