Python Tutorial
- jetzt Python programmieren lernen

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 der aktuellen Spielerposition abgezogen.

Damit sich aber unsere Figur überhaupt bewegt, müssen wir bei blit die 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. runter 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 (außer haben uns in den unsichtbaren Bereich bewegt, was wenig hilfreich ist. Im folgenden Kapitel begrenzen wir die Bewegungsmöglichkeit.