Pygame mit Python: Wie verhindere ich dass meine Spielfigur sich außerhalb des Bildschirms bewegt?
Hallo!
Ich hätte eine Frage die Python bzw. Pygame betrifft. Wir sind dabei ein Spiel zu programmieren, bei dem sich die Spielfigur auf- und abbewegen kann um den Gegner zu berühren/vernichten. Das Problem ist, dass sich die Spielfigur noch aus dem Spiel raus (also aus dem Bilschrim/ist nicht mehr sichtbar) bewegt. Das würden wir gerne verhindern. Wie mache ich das am besten?
Mit freundlichen Grüßen!
PS: Ich bin blutiger Anfänger
2 Antworten
Ich kenne pygame nicht wirklich, von daher ist meine Antwort mit Vorsicht zu genießen.
Vermutlich initialisierst du am Anfang ein Fenster, das eine gewisse Höhe und eine gewisse Breite hat. Sagen wir, du hast diese Werte in der Variablen window.height und window.width gespeichert.
Nun willst du die Spielfigur nach rechts bewegen, i.e. die x-Koordinate des Spielers erhöhen. Hierfür machst du inhaltlich etwas wie
player.x = player.x + horizontalSpeed
Statt das direkt durchzuführen, kannst du vorher abfragen, ob der Move überhaupt legal ist:
newPosition = player.x + horizontalSpeed
if newPosition < window.width:
player.x = newPosition
Analog für Bewegungen nach links, oben und unten.
Du brauchst erstmal 2 variablen für die Höhe und die Breite des Fenters, und 2 für die Höhe und Breite der Figur. Dann brauchst du in der Schleife einen Abbruf, der ungefähr so aussieht, wenn schon bewegt wurde:
#Bewegen der Figur
...
...
...
#Prüfen, ob sich die Figur in den grenzen befindet
if Figur.x < 0 :
Figur.x = 0
if Figur.x+Figur.Breite > Fensterbreite
Figur.x = Fensterbreite-Figur.Breite
if Figur.y < 0 :
Figur.y = 0
if Figur.y +Figur.Hoehe > Fensterhoehe :
figur.y = Fensterhoehe-Figur.Hoehe
Wenn aber der Funktionsauffruf beim Bewegen aufgerufen soll, dann sieht es so aus :
if Figur.x + Figur.bewegungsx + Figur.Hoehe <= Fensterbreite\ and Figur.x +Figur.bewegungsx >= 0 :
Figur.x += Figur.bewegungsx
if Figur.y+Figur.bewegungsy+Figur.Hoehe <= Fensterhoehe and ...
Wenn sich der Funktionsaufruf aber vor dem Bewegen sein soll:
if Figur.y+Figur.bewegungsy+Figur.Hoehe > Fensterhoehe :
Figur.y = Fensterhoehe-Figur.Hoehe-Figur.yschritt
if Figur.y+Figur.bewegungsy < 0 :
Figur.y = Figur.Bewegungsy
...#Die gleiche berrechnungen, nur mit x stadt y
...
...
...
#Bewegen der Figur
Figur.y += Figur.bewegungsy
Figur.x += bewegungsy
(Bei allen drei Varianten gilt, das man die Variablen Bewegungsx und Bewegungsy vor den varianten gemacht werden muss.
Würd ich noch machen. Sonst hatt man immer einen gewissen Mindest-Abstand vom Rand, was sich komisch/falsch anfühlt.
Kann man noch etwas verkürzen dann:
Dieser Code setzt die neue x-Koodinate und bewirkt, dass sie links (von 0) und rechts (von window.width-1) eingeschränkt ist.
UND, auch wichtig, die Breite der Spieler-Figur muss man noch berücksichtigen. Angenommen player.x ist in der Mitte der Figur, dann so:
player.x = max(player.width/2, min(window.width-1 - player.width/2, newPosition))