Spielerfigur bewegen – Steuerung über Tastatur
Im Gegensatz zu Space Invaders, das von oben nach unten sich bewegt, kommen unsere Gegner von rechts und unsere Bewegungsrichtung läuft horizontal. Die Spielerfigur hat als Bewegungsmöglichkeit hoch und runter.
Wir wollen unsere Spielerfigur nach oben und unten bewegen können. Dazu legen wir eine weitere Variable fest, in der die aktuelle Position der Spielerfigur hinterlegt ist. Auch diese Variable kommt vor unsere Hauptschleife:
spielerposY = 300
Jetzt müssen wir die Tastatur abfragen und entsprechend auf einen Tastendruck des Spielers reagieren. Wer in aller Ausführlichkeit über Tastaturabfragen lesen mag, kann das im Kapitel https://www.python-lernen.de/pygame-tastatur-abfragen.htm tun.
Für uns ist wichtig, dass wir im Bereich event
die entsprechende Abfrage der „Pfeil nach oben“ bzw. „nach unten“-Taste einbauen:
# Schleife Hauptprogramm
while spielaktiv:
# Überprüfen, ob Nutzer eine Aktion durchgeführt hat
for event in pygame.event.get():
# Beenden bei [ESC] oder [X]
if event.type==QUIT:
spielaktiv = False
if event.type == KEYDOWN:
# print("Spieler hat Taste gedrückt")
# Taste für Spieler 1
if event.key == K_UP:
print("Spieler hat Pfeiltaste hoch gedrückt")
elif event.key == K_DOWN:
print("Spieler hat Pfeiltaste runter gedrückt")
elif event.key == K_ESCAPE:
spielaktiv = False
Somit fragen wir die Tasten ab und bekomme ein Feedback in der Konsole. Jetzt soll sich unsere Spielerfigur auch bewegen. Wir benötigen eine weitere Variable, in der die Bewegungsrichtung hinterlegt ist: spielerbewegung
. Diese müssen wir im Vorfeld bei den Variablen auf 0 setzen und dann je nach Taste entsprechend ändern:
spielerbewegung = 0
Und bei der Tastaturabfrage wird die Variable entsprechend gesetzt – bei einer Bewegung nach unten mit „+6“ und nach oben mit „-6“:
# Taste für Spieler 1
if event.key == K_UP:
# print("Spieler hat Pfeiltaste hoch gedrückt")
spielerbewegung = -6
elif event.key == K_DOWN:
# print("Spieler hat Pfeiltaste runter gedrückt")
spielerbewegung = 6
elif event.key == K_ESCAPE:
spielaktiv = False
In der Spiellogik wird nun die Bewegung berechnet:
# Spiellogik
if spielerbewegung != 0:
spielerposY += spielerbewegung
Die Berechnung über „+=“ wirkt sich korrekt auf das Ergebnis aus, denn wenn als Wert der Spielerbewegung eine negative Zahl angeliefert wird, wird diese von der aktuellen Spielerposition abgezogen.
Damit sich aber unsere Figur überhaupt bewegt, müssen wir bei blit()
die entsprechende Variable auch einsetzen:
fenster.blit(spieler, (100, spielerposY), bereich[animbereich ])
Unser kompletter Code bisher:
# Importieren u. initialisieren der Pygame-Bibliothek
import pygame
from pygame.locals import *
pygame.init()
# Variablen/KONSTANTEN setzen
W, H = 800, 600
FPS = 30
SCHWARZ = ( 0, 0, 0)
WEISS = ( 255, 255, 255)
spielaktiv = True
spieler = pygame.image.load("bilder/biene-sprite-sheet.png")
bereich = ['','','','','','']
bereich[0] = (0,0,100,100)
bereich[1] = (101,0,100,100)
bereich[2] = (202,0,100,100)
bereich[3] = (303,0,100,100)
bereich[4] = (404,0,100,100)
bereich[5] = (505,0,100,100)
animbereich = 0
spielerposY = 300
spielerbewegung = 0
# Definieren und Öffnen eines neuen Fensters
fenster = pygame.display.set_mode((W, H))
pygame.display.set_caption("Varroa Invaders")
clock = pygame.time.Clock()
# Schleife Hauptprogramm
while spielaktiv:
# Überprüfen, ob Nutzer eine Aktion durchgeführt hat
for event in pygame.event.get():
# Beenden bei [ESC] oder [X]
if event.type==QUIT:
spielaktiv = False
if event.type == KEYDOWN:
# print("Spieler hat Taste gedrückt")
# Taste für Spieler 1
if event.key == K_UP:
# print("Spieler hat Pfeiltaste hoch gedrückt")
spielerbewegung = -6
elif event.key == K_DOWN:
# print("Spieler hat Pfeiltaste runter gedrückt")
spielerbewegung = 6
elif event.key == K_ESCAPE:
spielaktiv = False
# Spiellogik
if spielerbewegung != 0:
spielerposY += spielerbewegung
# Spielfeld löschen
fenster.fill(WEISS)
# Spielfeld/figuren zeichnen
animbereich += 1
if animbereich > 5:
animbereich = 0
fenster.blit(spieler, (100, spielerposY), bereich[animbereich ])
# Fenster aktualisieren
pygame.display.flip()
clock.tick(FPS)
Wenn wir die Bewegung stoppen wollen, wenn die Taste nicht mehr gedrückt ist, fragen wir einfach das „loslassen“ der Taste ab und setzen dann den Wert der Variablen spielerbewegung
auf 0. Man könnte noch zusätzlich abfragen, ob die Pfeil-hoch- bzw. Pfeil-unten-Taste losgelassen wurde.
if event.type == KEYDOWN:
# print("Spieler hat Taste gedrückt")
# Taste für Spieler 1
if event.key == K_UP:
# print("Spieler hat Pfeiltaste hoch gedrückt")
spielerbewegung = -6
elif event.key == K_DOWN:
# print("Spieler hat Pfeiltaste runter gedrückt")
spielerbewegung = 6
elif event.key == K_ESCAPE:
spielaktiv = False
if event.type == KEYUP:
print("Spieler stoppt bewegung")
spielerbewegung = 0
Wir können uns allerdings nicht unendlich in eine Richtung bewegen, sonst sind wir als Spielerfigur weg vom Fenster (wir haben uns dann in den unsichtbaren Bereich bewegt, was wenig hilfreich ist). Im folgenden Kapitel begrenzen wir die Bewegungsmöglichkeit.