3

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:」タイプのステートメントに変換する方法に取り組んでいますが、進歩しています。誰かが同じような状況にあるなら、私はラビットを使うことをお勧めします。

4

2 に答える 2

4

この速度を向上させる簡単な方法は、平方根演算を削除することです。

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
于 2012-09-17T10:01:05.830 に答える
2

おそらくもう手遅れですが、まったく同じ問題がありました。次のように、表示されているオブジェクトに対してのみ衝突を計算することで、なんとか解決できました。

for object_ in objects:
    if not object_.visible: # pyglet.sprite.Sprite() provides this flag
        continue
    # rest of your collision detection
于 2015-01-19T13:34:15.667 に答える