2017-01-08 2 views
0

Ich habe nur Informationen über Kollisionen mit Wänden hier gesehen, aber ich habe ein Problem damit, den Spieler seinen Kopf an der Decke "stoßen". Anstatt auf den Kopf zu treffen, wird die Geschwindigkeit auf 0 gesetzt und sie wird aufgrund der Schwerkraft wieder beschleunigt, und das Objekt wird oben auf der Plattform darüber abgesaugt. Warum funktioniert das nicht und wie kann ich es reparieren? Ich folge einem Tutorial und halte mich an meine eigene Anpassung und der Verfasser des Inhalts sagte, dass es schwer zu implementieren wäre. Anscheinend kann es auch einen Fehler geben, wenn Sie diagonal kollidieren? (entsprechend dem Ersteller des Inhalts)pygame Kollision mit der Decke?

Vielen Dank im Voraus, Lehrer will, dass ich etwas vor Leuten in nur ein paar Tagen ohne Erfahrung mit irgendeiner Art von Game-Engine zu präsentieren.

def update(self): 
    # Game Loop - Update 
    self.all_sprites.update() 
    # check if player hits a platform 
    hits = pygame.sprite.spritecollide(self.player,self.platforms , False) 
    if self.player.vel.y > 0: 
     if hits: 
      self.player.pos.y = hits[0].rect.top 
      self.player.vel.y = 0 
    if self.player.vel.y < 0: 
     if hits: 
      self.player.rect.top = hits[0].rect.bottom 
      self.player.vel.y = 0 
+0

http://gamedev.stackexchange.com/ könnte etwas Hilfe haben – depperm

+2

So tun Sie 'self.player.vel.y = 0 'in Ihrem wenn Aussagen, aber wird dieser Wert jemals anderswo verändert? Wenn dies nicht der Fall ist, wird keine Ihrer if-Aussagen wahr sein, so dass sich nichts ändert. – numbermaniac

+0

Ich habe eine Spieler-Klasse, die Dinge wie Geschwindigkeit und Beschleunigung hat, Bewegung funktioniert und ich kann ontop von Dingen landen (erste if-Anweisung funktioniert), ich kann es einfach nicht erreichen, um das Ende der Rechteck-Hitbox zu erreichen und zu stoppen. Das Problem besteht nicht in der Geschwindigkeit, sondern eher in der Platzierung des Players, sobald die Kollision passiert ist. Kann es immer noch nicht herausfinden. –

Antwort

0

Statt die Geschwindigkeit auf 0 setzen, können Sie die Geschwindigkeit auf -1 oder einen anderen negativen Wert zu zwingen Bewegung nach unten "aus der Randbedingung einzustellen. Sie könnten auch Beschleunigung hinzufügen, wenn in der gleichen Bedingung erwünscht:

if hits: 
     self.player.pos.y = hits[0].rect.top 
     self.player.vel.y = -1 # example velocity 
     self.player.acc.y = 2 # example acceleration 
+0

Excellent vielen Dank, das einzige Problem ist, dass der Spieler dann für etwa 2 Sekunden an der Decke hängen bleibt, ich nehme an, dass der Spieler immer noch nach oben geschoben wird, bis die Schwerkraft den Spieler zurück nach unten bewegt. Irgendwelche Lösungen? Es sieht so aus, als würde sich die Geschwindigkeit der Spieler nicht ändern? Entschuldigung, ich bin sehr neu zu diesem –

+0

Ich denke, es ist kein Problem mit der Beschleunigung, aber der Spieler denkt, es kollidiert wieder und stecken in einer Schleife. EDIT: vergiss, ich habe die Spielerposition auf Treffer [0] .rect.bottom - 30 geändert, so dass es keine Kollisionsfehler gibt, danke! –

+0

Ja, die Idee ist, dass Sie irgendwo in Ihrem Code aus Ihrer Randbedingung herauskommen müssen, damit Ihr Vorschlag von 'Spieler pos y to hits [0] .rect.bottom - 30' genau das tut. Hoffe meine Antwort half aber! – gom1