Platformer Bodencollision

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Gertodunk
User
Beiträge: 11
Registriert: Freitag 8. Februar 2013, 17:41

Ich möchte gerne mit pygame einen simplen Platformer im Mario Stil machen, doch hab dabei immer ein Problem mit der Kollision mit dem Boden. Momentan benutze ich die colliderect funktion, weshalb die Figur bei Kollision immer schon ein bisschen im Boden drin ist.
Ich hätte gerne, dass die Figur einfach auf einen Blcok draufspringen kann und dann genau einen pixel über dem block bleibt, nicht ihn hereinrutscht. Hat jemand einen Tipp für mich?
Ich würde mich sehr über eine Antwort freuen :)
danke im Vorraus !
BlackJack

@Gertodunk: Wenn Du eine Kollision mit dem Boden feststellst (und weisst, dass die Figur von oben kam) müsstest Du doch das `Rect` der Figur einfach nur so platzieren, dass dessen Unterkante einen Pixel über der Oberkante des `Rect` vom Bodenblock platziert wird. Diese Referenzpunkte kann man bei `Rect`-Objekten abfragen und setzen.
Gertodunk
User
Beiträge: 11
Registriert: Freitag 8. Februar 2013, 17:41

Danke für die schnelle, simple Antwort !
ich hab das schonmal so ausprobiert, doch dabei wir mir jetzt auffällt einen dummen fehler gemacht, weshalb die figur dann quasi immer von dem eien pixel über dem block wieder in den block reingefallen ist und dann wieder hoch gesetzt wurde, so ist sie dann quasi die ganze zeit auf dem block nach oben und unten vibriert :D
ich werde das gleich noch einmal richtig versuchen

vielen dank !
Gertodunk
User
Beiträge: 11
Registriert: Freitag 8. Februar 2013, 17:41

Ist es denn generell vorteilhafter, bei einer geschwindigkeit von über 1, das zu bewegende rechteck komplett um die gesammte geschwindigkeit zu verschieben und dann die collision zu überprüfen, oder es immer schnell um 1 zu verschieben und die collision zu überprüfen ?
würde mich über eine antwort freuen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das hängt von der Genauigkeit ab, welche du erreichen möchtest. Oft reicht es schon aus, wenn du die Box für die Kollision einfach vergrößerst. Angenommen, dein Objekt ist drei Meter lang und hat sich in dem Zeitschritt um einen Meter bewegt. Dann vergrößerst du die Box einfach auf vier Meter und testest auf eine Kollision. Im Prinzip legst do also eine Boundingbox um das Objekt an der alten Position und das Objekt an der neuen Position. Wenn du dann eine Kollision feststellst, dann kannst du immer noch genauer testen.
Das Leben ist wie ein Tennisball.
BlackJack

@Gertodunk: Die Frage ist ob die Geschwindigkeit jemals so hoch werden kann, dass eine Figur durch ein Hindernissobjekt hindurch fallen kann, weil es nach der Bewegung nicht „in” dem Objekt landen würde, sondern darunter oder dahinter. Wenn das nicht passieren kann, reicht eine Kollisionsprüfung. Sonst muss man sich etwas anderes einfallen lassen. Zum Beispiel keine einfache Kollisionsprüfung über die `Rect`\s sondern ein Test ob der Weg der Spielfigur das Hindernis schneiden würde, beziehungsweise wo das der Fall ist.
Gertodunk
User
Beiträge: 11
Registriert: Freitag 8. Februar 2013, 17:41

danke für die Antworten !
stimmt, die geschwindigkeit ist bei mir nie so groß, dass sich ein problem ergeben sollte.
Es funktioniert bis jetzt auch shcon ganz gut, ein problem hab ich nur bei den ecken, wenn man genau au fder ecke aufkommt , wo wird dann das rechteck zurückgesetzt... und wie überprüft man in diesem fall, woher es kommt ?
oder fällt jemandem generell eine elegantere lösung für die überprüfung der richtung, aus der das object kommt, ein ?

danke !
Antworten