2017-07-31 9 views
0

ここに私の衝突コードです。それは私のプレーヤースプライトは、部分的に私から入力側に応じて、壁の内側と外側で歩くことを可能にする以外どのようにして衝突を修正できますか?

def collide_with_walls(self, dir): 
      if dir == 'x': 
       hits = pg.sprite.spritecollide(self, self.game.walls, False) 
       if hits: 
        if self.vel.x > 0: 
         self.pos.x = hits[0].rect.left - self.rect.width 
        if self.vel.x < 0: 
         self.pos.x = hits[0].rect.right 
        self.vel.x = 0 
        self.rect.x = self.pos.x 
      if dir == 'y': 
       hits = pg.sprite.spritecollide(self, self.game.walls, False) 
       if hits: 
        if self.vel.y > 0: 
         self.pos.y = hits[0].rect.top 
        if self.vel.y < 0: 
         self.pos.y = hits[0].rect.bottom 
        self.vel.y = 0 
        self.rect.y = self.pos.y 

すべてが、うまく動作します。

Can walk partially inside wall Can't walk any further

画像1:部分的に壁に歩くことができます。 画像2:これ以上歩くことはできません。

答えて

2
あなたはおそらく、あなたが正のx方向でやったように、少し右にキャラクターのスプライトを移動する必要があります

:あなたも、あなたがしたい場合は、文字スプライトの半分にのみオフセットを変更することができます

​​

近くの壁に移動可能に:

if self.vel.x > 0: 
    self.pos.x = hits[0].rect.left - self.rect.width//2 
if self.vel.x < 0: 
    self.pos.x = hits[0].rect.right + self.rect.width//2 
1

をその様子からは、スプライトのヒットボックスとスプライト画像の位置のずれがあるようです。

ただし、スプライトオブジェクトの内部構造とスプライトコリジョン関数を知らなくても、それが起こっている理由を正確に特定するのはもう少し難しいです。

どちらの方向にも半分の長方形で計算をオフセットしてみましょう。