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を超えるMobを持っており(完成品ではさらに多くのことを望んでいます)、衝突をチェックすると再生できなくなります。速度を落とさずに特定の距離内のスプライトのみをチェックする方法はありますか?
編集:
私はグーグルの周りを読んで、同じ衝突をするのに多くの速度が費やされていることを知りました。つまり、sprite1はsprite2でチェックされ、sprite2はsprite1でチェックされました。そこで、衝突チェック機能にいくつかの変更を加えました。これで、実行速度は速くなりますが、それでも20fps未満です。
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)
これにより、衝突したオブジェクトのリストのリストが返されます(これが正しい用語かどうかはわかりません)。私はまだそれを「ifcollided:」タイプのステートメントに変換する方法に取り組んでいますが、進歩しています。誰かが同じような状況にあるなら、私はラビットを使うことをお勧めします。