Python Tutorial
- jetzt Python programmieren lernen

Grafiken und Bilder in Python über Pygame anzeigen

Grafiken und Bilder in Python über Pygame anzeigen

Viele Spiele leben unter anderem von guter Grafik. Wobei Grafiken sowohl die eigene Spielerfigur wie die Gegner und die Hintergrundgrafiken sind. Mit Pygame ist es sehr einfach in Python Grafiken anzuwenden. Diese können eingebunden, bewegt und animiert werden. In diesem Kapitel werden alle Grundlagen über Grafiken gezeigt und wie (und wo) diese eingebunden werden. In den Folgekapiteln werden wir dann Spiele mit Grafiken aufpeppen.

Aber erst zu den Grundlagen.

Grundlagen Grafiken/Bilder

Bildformate

Bei Bildern gibt es verschiedene Bildformate. Uns stehen in Python die Bildformate „.jpg“, „.png“ und „.gif“ zur Verfügung.

Größenangaben und Ursprung bei Grafiken

Auch wenn es sich selbstverständlich anhört, schauen wir uns kurz die Größenangaben und den Ursprung bei Bildern an.

Der Nullpunkt ist immer oben links wie in der folgenden Grafik eingezeichnet. Von hier aus werden nach rechts die X-Werte und nach unten die y-Werte größer. Wichtig in diesem Zusammenhang ist die gesamte Breite und die Höhe. Hier kann man sich gleich die englischen Begriffe für Breite = width und Höhe = height einprägen.

Denn spätestens, wenn unsere Grafik am rechten Fensterrand nicht einfach verschwinden soll, sondern dort abprallen, benötigen wir die Breite für Berechnungen. Wir können über die Position unserer Grafik auf den Nullpunkt zugreifen aber erst mit Nullpunkt plus der Breite bzw. Höhe können wir berechnen, ob die Grafik den Fensterrand rechts bzw. unten berührt.

Ursprung und Größen bei Grafiken

Schauen wir uns dies im Quellcode an.

Im ersten Schritt wollen wir eine Grafik laden. Dabei wird die Grafik noch nicht im Fenster platziert, sprich sie ist noch nicht sichtbar. Diese muss erst erfolgreich geladen werden. Wir vergeben eine „Variable“, auf die wir dann zugreifen können.

spielerfigur = pygame.image.load("biene.png")

Die hier verwendete Grafik der Biene kann über die URL: https://www.python-lernen.de/bilder/biene.png zum Spielen und Testen heruntergeladen werden. Dazu einfach auf die Grafik mit der rechten Maustaste klicken und „speichern unter“ wählen.

Lasst man sich die „Variable“ über print(spielerfigur) ausgeben, erhalten wir als Rückgabe: <Surface(100x99x32 SW)>

WICHTIG! Unsere Grafik „biene.png“ befindet sich im gleichen Verzeichnis wie unser Python-Programm. Sonst kann Python die Grafik nicht finden. Wer mehr Ordnung halten möchte, kann auch alle Grafiken in ein Unterverzeichnis packen und dann darauf zugreifen. Dazu erstellen wir im Verzeichnis, in dem unser Python-Programm liegt das Unterverzeichnis „bilder“ und packen dort alle verwendeten Grafiken hinein. Dann ändert sich unser Python-Code entsprechend:

spielerfigur = pygame.image.load("bilder/biene.png")

Sollte das Bild sich nicht im Verzeichnis befinden oder ein Tippfehler im Dateinamen (Groß-Kleinschreibung ist wichtig, Dateiende ist wichtig!) sich eingeschlichen haben, erhalten wir eine Fehlermeldung in folgender Form:

pygame.error: Couldn't open bilder/biene.png

Jetzt kann es durchaus sein, dass uns die Bildgrößen der Grafiken nicht bekannt sind. Wir können mit Pygame die Größen ermitteln und ausgeben lassen. Um die Größen zu ermitteln, nutzen wir die Anweisung get_rect().

spielerfigur = pygame.image.load("bilder/biene.png")
bildgroessen = spielerfigur.get_rect()

Darüber haben wir nun Zugriff auf die Werte:

  • Breite über bildgroessen.width
  • Höhe über bildgroessen.height
  • die Mitte der Breite (was der Hälfte der Breite entspricht) über bildgroessen.center[0]
  • die Mitte der Höhe über bildgroessen.center[1]

Die Werte können wir uns einfach einmal zur Kontrolle ausgeben lassen:

spielerfigur = pygame.image.load("bilder/biene.png")
bildgroessen = spielerfigur.get_rect()
print(bildgroessen)
print(bildgroessen.center[0])
print(bildgroessen.center[1])
print(bildgroessen.width)
print(bildgroessen.height)

Alle Daten können jetzt entsprechend weiterverwendet werden.

Grafik im Fenster platzieren

Jetzt wollen wir unsere Grafik im Fenster platzieren und anzeigen lassen. Wir verwenden unser Grundgerüst für Pygame (siehe https://www.python-lernen.de/grundgeruest-fuer-pygame.htm ganz unten).

# Importieren u. initialisieren der Pygame-Bibliothek
import pygame
from pygame.locals import *
pygame.init()

# Variablen/KONSTANTEN setzen
W, H = 800, 600
FPS  = 60
SCHWARZ = ( 0, 0, 0)
WEISS   = ( 255, 255, 255)
spielaktiv = True

# Definieren und Öffnen eines neuen Fensters
fenster = pygame.display.set_mode((W, H))
pygame.display.set_caption("Grafiken nutzen")
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 or (event.type==KEYDOWN and event.key==K_ESCAPE):
            spielaktiv = False

    # Spiellogik

    # Spielfeld löschen
    fenster.fill(WEISS)

    # Spielfeld/figuren zeichnen

    # Fenster aktualisieren
    pygame.display.flip()
    clock.tick(FPS)

Unsere Grafik laden wir vor der Hauptschleife vor dem „# Definieren und Öffnen eines neuen Fensters“.

# Variablen/KONSTANTEN setzen
W, H = 800, 600
FPS  = 60
SCHWARZ = ( 0, 0, 0)
WEISS   = ( 255, 255, 255)
spielaktiv = True

spielerfigur = pygame.image.load("bilder/biene.png")
bildgroessen = spielerfigur.get_rect()
print(bildgroessen)
print(bildgroessen.center[0])
print(bildgroessen.center[1])
print(bildgroessen.width)
print(bildgroessen.height)

# Definieren und Öffnen eines neuen Fensters
fenster = pygame.display.set_mode((W, H))

Lassen wir unser Python-Programm ausführen, erhalten wir in der Console folgende Ausgabe für die Größen:

Axels-MacBook-Pro:Python-lernen.de axel$ python3 grafiken-verwenden.py
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
<rect(0, 0, 100, 99)>
50
49
100
99

Jetzt können wir in unserer Hauptroutine (Schleife Hauptprogramm) die Grafik ausgeben lassen.

    # Spielfeld/figuren zeichnen
    fenster.blit(spielerfigur, (200, 100))

Unsere Biene als Grafik erscheint nun an der Position x=200 und y=100 in unserem Fenster:

Grafik wird über blit() im Fenster platziert
Grafik wird über blit() im Fenster platziert

Klugscheißermodus zu blit(): wer sich über die merkwürdige Anweisung „blit()“ wundert. Diese kommt aus der Bezeichnung „Bit blit“ – auch als BITBLT „allgemein“ bekannt ;). Und das BLT steht dann für „BLock Transfer“. Es wird im Vorfeld alles auf einer Bitmap verrechnet bevor es auf einen Schlag angezeigt wird. Dadurch wird Rechenleistung gespart.

Wenn wir nun die Hintergrundfarbe des Fensters ändern, sehen wir die quadratische Struktur unseres Bildes:

# Variablen/KONSTANTEN setzen
W, H = 800, 600
FPS  = 60
SCHWARZ = ( 0, 0, 0)
WEISS   = ( 255, 255, 255)
GRAU    = ( 155, 155, 155)

Und in der Hauptroutine:

    # Spielfeld löschen
    fenster.fill(GRAU)

Wir wollen auf jeden Fall, dass die Hintergrundfarbe die Kontur der Biene „umfließt“:

Hintergrundfarbe soll Kontur der Grafik umfließen
Hintergrundfarbe soll Kontur der Grafik umfließen

Dazu ist wichtig zu wissen, dass wir bei den Grafikformaten PNG und GIF einen transparenten Bereich definieren können. Hier spricht man vom Alphakanal.

Transparenter Bereich bei Grafiken über Alphakanal

Und nun müssen wir beim Laden der Grafik noch mitgeben, dass dieser Alphakanal genutzt werden soll.

Dies geschieht über die Erweiterung unserer Anweisung pygame.image.load() am Ende um pygame.image.load().convert_alpha()

Unser bisher entstandener kompletter Code:


# Importieren u. initialisieren der Pygame-Bibliothek
import pygame
from pygame.locals import *
pygame.init()

# Variablen/KONSTANTEN setzen
W, H = 800, 600
FPS  = 60
SCHWARZ = ( 0, 0, 0)
WEISS   = ( 255, 255, 255)
GRAU    = ( 155, 155, 155)
spielaktiv = True

spielerfigur = pygame.image.load("bilder/biene.png").convert_alpha()
bildgroessen = spielerfigur.get_rect()
print(bildgroessen)
print(bildgroessen.center[0])
print(bildgroessen.center[1])
print(bildgroessen.width)
print(bildgroessen.height)

# Definieren und Öffnen eines neuen Fensters
fenster = pygame.display.set_mode((W, H))
pygame.display.set_caption("Grafiken nutzen")
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 or (event.type==KEYDOWN and event.key==K_ESCAPE):
            spielaktiv = False

    # Spiellogik

    # Spielfeld löschen
    fenster.fill(GRAU)

    # Spielfeld/figuren zeichnen
    fenster.blit(spielerfigur, (200, 100))

    # Fenster aktualisieren
    pygame.display.flip()
    clock.tick(FPS)

In den folgenden Kapiteln schauen wir uns an, wie man Grafiken bewegen, rotieren, skalieren und Animieren kann.