2017-06-30 4 views
1

Während ich an einem neuen Platformer arbeitete, stieß ich auf ein Kollisionsproblem, das auf einem schrägen Platform Sprite in meinem Spiel auftrat. Ich habe versucht, eine Kollisionsmaske auf das schräge Sprite zu implementieren, um diesem umständlichen Fehler hoffentlich entgegenzuwirken. Aber wenn ich das Programm ausführe, tritt dieser Jitter-Fehler auf, wo das Spieler-Sprite auf der geneigten Plattform auf und ab hüpft, und wenn ich versuche, dieses schräge Plattform-Sprite wie jede andere Plattform zu implementieren, wird der Spieler wie ein Rechteck über das Sprite laufen , wenn es wirklich ein dreieckiger Sprite ist. Ich hoffe, dass der obige Text seit, wenn es nicht gemacht wurde, werde ich mehr als glücklich sein, mehr zu erarbeiten, und irgendwelche Vorschläge werden geschätzt :)Pygame Collision Fehlfunktion mit schräger Plattform Sprite

Ich glaube, der Fehler ist in einem der folgenden Codesegmente. Wenn Sie mehr Code sehen möchten, wäre ich mehr als glücklich, mehr zu bieten.

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) 

Update Abschnitt meiner Spielklasse.

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 

Player Update Abschnitt, vielleicht ein Schwerkraftfehler?

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) 

Antwort

0

Ich bin nicht sehr vertraut mit Pygame Masken, aber ich werde es versuchen.

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

Tests Kollisionen die Maske Ihrer schrägen Plattform verwenden, aber Ihre Kollisionen Code verarbeitet wird mit seiner rect:

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

Das Flackern von hier kommt. Ihr Player geht den ganzen Weg zur Maske, wird aber nach der Kollisionsverarbeitung, die höher als die Maske ist, zurückgeschickt.