Pygame mit Python: Wie verhindere ich dass meine Spielfigur sich außerhalb des Bildschirms bewegt?

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.

MrAmazing2  25.06.2021, 16:05
else:
  player.x = window.width-1

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:

player.x = max(0, min(window.width-1, newPosition))

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))

1

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.



Woher ich das weiß:Hobby