2017-06-30 9 views
1

最近のプラットフォームで作業している間、私はゲームで使用されている斜めのプラットフォームのスプライトで発生する衝突の問題に遭遇しました。私は斜めのスプライトに衝突マスクを実装しようとしました。うまくいけば、この面倒なエラーに対処します。しかし、私がプログラムを実行すると、このジッタのエラーが発生します。プレーヤーのスプライトが傾斜したプラットフォーム上で上下にバウンスします。他のプラットフォームのように傾斜したプラットフォームスプライトを実装しようとすると、プレーヤはスプライトを矩形本当に三角形のスプライトであるとき。私は上記のテキストがそれ以来作られていない場合、私はもっと詳しく説明してくれることを喜んでお待ちしております。どんな提案も高く評価されています:)斜めのプラットフォームスプライトでのPygameの衝突の不具合

私はこのエラーが次のコードセグメントのいずれかであると考えています。より多くのコードを参照する必要があると感じる場合は、より多くのコードを提供することができます。

class Platform(pygame.sprite.Sprite): 
    def __init__(self, id, x, y): 
     pygame.sprite.Sprite.__init__(self) 
     self.tile_images = [] 
     self.get_images() 

     self.id = int(id) 
     self.image = self.tile_images[self.id] 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

     if self.id == 5 or self.id == 4: #4 and 5 are the slanted platform sprites 
      self.mask = pygame.mask.from_surface(self.image) 

私のゲームクラスの更新セクション。

def update(self): 
    self.player_sprite.update() 

    if self.player.rect.x <= 0: 
     self.player.direction = "R" 
     self.player.rect.x = 0 

    if self.player.vel.y > 0: 
     hits = pygame.sprite.spritecollide(self.player, self.platform_list, False) 
     if hits: 
      lowest = hits[0] 
      for hit in hits: 
       if hit.rect.bottom > lowest.rect.bottom: 
        lowest = hit 
      if self.player.rect.y < lowest.rect.centery: 
       self.player.pos.y = lowest.rect.top + 1 
       self.player.vel.y = 0 
       self.player.jumped = False 

重力エラーですか?

def update(self): 
    self.animate() 

    self.acc.x += self.vel.x * PLAYER_FRICTION 
    self.vel += self.acc 
    if abs(self.vel.x) < 0.1: 
     self.vel.x = 0 
    self.pos += self.vel + 0.5 * self.acc 
    self.rect.midbottom = self.pos 
    self.acc = vec(0, PLAYER_GRAV) 

答えて

0

私は非常にpygameマスクでfamilliarではありませんが、私は試してみましょう。ジッタはここから来て

self.player.pos.y = lowest.rect.top + 1 

を使用して衝突があなたの傾斜プラットフォームのをマスクするが、あなたの衝突がコードを処理

hits = pygame.sprite.spritecollide(self.player, self.platform_list, False) 

テストは、そのRECTを使用しています。あなたのプレイヤーはマスクまでずっと進んでいますが、マスクよりも高い衝突処理後に矩形に戻されます。