Pygame Spickzettel
Zuletzt aktualisiert
Einrichtung und Spielschleife
Jedes pygame-Programm öffnet ein Fenster und wiederholt dann eine Schleife, bis der Spieler das Spiel beendet.
| Aufgabe | Code |
|---|---|
| pygame-ce installieren | python3 -m pip install pygame-ce |
| pygame importieren und starten | import pygame
pygame.init() |
| Ein Fenster öffnen | screen = pygame.display.set_mode((640, 480)) |
| Fenstertitel setzen | pygame.display.set_caption("My Game") |
| Eine Uhr erstellen | clock = pygame.time.Clock() |
| Die Spielschleife | running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("black")
pygame.display.flip()
clock.tick(60) |
| Nach der Schleife beenden | pygame.quit() |
Anzeige
Der Bildschirm ist eine Surface; nichts erscheint, bis du ihn mit flip anzeigst.
| Aufgabe | Code |
|---|---|
| Fertigen Frame anzeigen | pygame.display.flip() |
| Nur bestimmte Bereiche anzeigen | pygame.display.update([rect1, rect2]) |
| Bildschirm leeren | screen.fill((30, 30, 46)) |
| Fenstergröße | screen.get_size(), screen.get_width() |
| Der Bildschirm als Rect | screen.get_rect() |
| Fenster mit änderbarer Größe | pygame.display.set_mode((640, 480), pygame.RESIZABLE) |
| Vollbild in Desktop-Größe | pygame.display.set_mode((0, 0), pygame.FULLSCREEN) |
Farben und Zeichnen
Die Funktionen von pygame.draw erwarten eine Surface, eine Farbe und eine Position. width=0 füllt die Form.
| Aufgabe | Code |
|---|---|
| Farbe als RGB | (255, 140, 0) |
| Farbe per Name oder Hex | "tomato", "#ff8c00", pygame.Color("gold") |
| Rechteck | pygame.draw.rect(screen, "red", (x, y, w, h)) |
| Umriss und abgerundete Ecken | pygame.draw.rect(screen, "red", rect, width=2, border_radius=8) |
| Kreis (über seinen Mittelpunkt) | pygame.draw.circle(screen, "blue", (cx, cy), radius) |
| Linie | pygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3) |
| Polygon | pygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)]) |
| Ellipse in einem Rechteck | pygame.draw.ellipse(screen, "purple", (x, y, w, h)) |
Rect
Ein Rect speichert Position und Größe als ganze Zahlen.
| Aufgabe | Code |
|---|---|
| Ein Rect erstellen | player = pygame.Rect(x, y, width, height) |
| Über einen beliebigen Punkt positionieren | player.center = (320, 240), player.bottom = 400 |
| Kanten und Ecken | left, right, top, bottom, topleft, midbottom |
| Direkt verschieben | player.move_ip(dx, dy) |
| Verschobene Kopie | moved = player.move(dx, dy) |
| Im Bildschirm halten | player.clamp_ip(screen.get_rect()) |
| Um die Mitte vergrößern | bigger = player.inflate(20, 20) |
| Kommazahl-Positionen (pygame-ce) | pygame.FRect(10.5, 20.25, 40, 40) |
Bilder, Surfaces und blit
Lade Bilder einmal vor der Schleife und zeichne sie dann in jedem Frame mit blit.
| Aufgabe | Code |
|---|---|
| Bild mit Transparenz laden | img = pygame.image.load("player.png").convert_alpha() |
| Bild ohne Transparenz laden | bg = pygame.image.load("sky.png").convert() |
| Ein Bild zeichnen | screen.blit(img, (x, y)) |
| Zentriert zeichnen | screen.blit(img, img.get_rect(center=(320, 240))) |
| Neue leere Surface | panel = pygame.Surface((200, 100)) |
| Transparente Surface | layer = pygame.Surface((200, 100), pygame.SRCALPHA) |
| Ganze Surface halbtransparent machen | img.set_alpha(128) |
| Einzelbild aus einem Spritesheet schneiden | frame = sheet.subsurface((0, 0, 32, 32)) |
| Screenshot speichern | pygame.image.save(screen, "shot.png") |
Transformieren
Jede Funktion gibt eine neue Surface zurück; transformiere das Original, nicht das letzte Ergebnis.
| Aufgabe | Code |
|---|---|
| Größe ändern | pygame.transform.scale(img, (64, 64)) |
| Um einen Faktor skalieren | pygame.transform.scale_by(img, 2) |
| Weich skalieren | pygame.transform.smoothscale(img, (64, 64)) |
| Drehen (gegen den Uhrzeigersinn, in Grad) | pygame.transform.rotate(img, 45) |
| Um die Mitte drehen | rotated = pygame.transform.rotate(original, angle)
rect = rotated.get_rect(center=rect.center) |
| Horizontal spiegeln | pygame.transform.flip(img, True, False) |
Events und Tastatur
Nutze Events für einzelne Tastendrücke und get_pressed() für gehaltene Tasten.
| Aufgabe | Code |
|---|---|
| Events dieses Frames lesen | for event in pygame.event.get(): |
| Fenster geschlossen | event.type == pygame.QUIT |
| Eine Taste wurde gedrückt | event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE |
| Eine Taste wurde losgelassen | event.type == pygame.KEYUP |
| Eingegebenes Zeichen | event.unicode |
| Gerade gehaltene Tasten | keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= 5 |
| Richtung aus zwei Tasten | dx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] |
| In diesem Frame gedrückte Tasten (pygame-ce) | pygame.key.get_just_pressed()[pygame.K_SPACE] |
| Tastenkonstanten | K_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT |
| Name einer Taste | pygame.key.name(event.key) |
| Eigenes Event | HIT = pygame.event.custom_type()
pygame.event.post(pygame.event.Event(HIT)) |
Maus
Maustasten: 1 links, 2 Mitte, 3 rechts.
| Aufgabe | Code |
|---|---|
| Eine Maustaste wurde gedrückt | event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 |
| Wo gedrückt wurde | event.pos |
| Aktuelle Zeigerposition | x, y = pygame.mouse.get_pos() |
| Gerade gehaltene Maustasten | left, middle, right = pygame.mouse.get_pressed() |
| Maus bewegt | event.type == pygame.MOUSEMOTION, event.rel |
| Mausrad gedreht | event.type == pygame.MOUSEWHEEL, event.y |
| Auf einen Button geklickt | button_rect.collidepoint(event.pos) |
| Mauszeiger ausblenden | pygame.mouse.set_visible(False) |
Sprites und Gruppen
Ein Sprite hat ein image und ein rect; eine Gruppe aktualisiert und zeichnet viele davon.
| Aufgabe | Code |
|---|---|
| Sprite-Klasse | class Coin(pygame.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = coin_img
self.rect = self.image.get_rect(center=pos) |
| Eine Gruppe erstellen | coins = pygame.sprite.Group() |
| Zu einer Gruppe hinzufügen | coins.add(Coin((100, 50))) |
| Alle Sprites aktualisieren | coins.update() |
| Alle Sprites zeichnen | coins.draw(screen) |
| Sprite aus allen Gruppen entfernen | coin.kill() |
| Gruppe mit genau einem Sprite | player = pygame.sprite.GroupSingle(Player()) |
Kollisionen
Rects kollidieren, wenn sie sich überlappen; Kanten, die sich nur berühren, zählen nicht.
| Aufgabe | Code |
|---|---|
| Zwei Rechtecke | a.colliderect(b) |
| Punkt innerhalb | rect.collidepoint(x, y) |
| Erstes von vielen | rect.collidelist(walls) # index or -1 |
| Sprite gegen eine Gruppe | hits = pygame.sprite.spritecollide(player, coins, True) |
| Überhaupt ein Treffer | pygame.sprite.spritecollideany(player, enemies) |
| Gruppe gegen Gruppe | pygame.sprite.groupcollide(bullets, enemies, True, True) |
| Pixelgenau | pygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask) |
| Kreise | pygame.Vector2(a).distance_to(b) < r1 + r2 |
Text und Schriftarten
Rendere Text auf eine Surface und zeichne sie dann mit blit.
| Aufgabe | Code |
|---|---|
| Standardschrift | font = pygame.font.Font(None, 36) |
| Systemschrift | font = pygame.font.SysFont("arial", 24) |
| Schriftdatei | font = pygame.font.Font("pixel.ttf", 32) |
| Text rendern | text = font.render("Score: 10", True, "white") |
| Zentriert zeichnen | screen.blit(text, text.get_rect(center=(320, 40))) |
| Langen Text umbrechen (pygame-ce) | font.render(story, True, "white", None, 400) |
| Größe ohne Rendern | font.size("Hello") |
| Installierte Schriftarten | pygame.font.get_fonts() |
Sound und Musik
Lade Sounds einmal. Musik wird als ein einzelnes Stück direkt aus der Datei gestreamt.
| Aufgabe | Code |
|---|---|
| Einen Sound laden | jump = pygame.mixer.Sound("jump.ogg") |
| Abspielen | jump.play() |
| Sound-Lautstärke | jump.set_volume(0.5) |
| Musik laden | pygame.mixer.music.load("theme.ogg") |
| Musik endlos wiederholen | pygame.mixer.music.play(-1) |
| Pausieren und fortsetzen | pygame.mixer.music.pause(), pygame.mixer.music.unpause() |
| Musik stoppen | pygame.mixer.music.stop() |
Zeit und Timer
Ticks werden in Millisekunden gezählt.
| Aufgabe | Code |
|---|---|
| Framerate begrenzen | clock.tick(60) |
| Deltazeit in Sekunden | dt = clock.tick(60) / 1000 |
| Aktuelle Framerate | clock.get_fps() |
| Millisekunden seit init | pygame.time.get_ticks() |
| Wiederholendes Timer-Event | SPAWN = pygame.event.custom_type()
pygame.time.set_timer(SPAWN, 1000) |
| Einmaliger Timer | pygame.time.set_timer(SPAWN, 2000, loops=1) |
| Timer stoppen | pygame.time.set_timer(SPAWN, 0) |
Vector2
Kommazahlen für Positionen und Geschwindigkeiten.
| Aufgabe | Code |
|---|---|
| Einen Vektor erstellen | pos = pygame.Vector2(100, 200) |
| Um eine Geschwindigkeit bewegen | pos += velocity * dt |
| Länge | velocity.length() |
| Gleiche Geschwindigkeit diagonal | if direction.length() > 0:
direction = direction.normalize() |
| Abstand zwischen Punkten | pos.distance_to(target) |
| Drehen | velocity.rotate(90) |
| Schritt zu einem Punkt (pygame-ce) | pos.move_towards_ip(target, 5) |
Der pygame-Code, den du beim Bauen eines 2D-Spiels in Python immer wieder brauchst, nach Aufgaben sortiert: die Spielschleife, das Fenster, Farben und Zeichnen, Rect, Bilder und blit, Skalieren und Drehen, Eingaben über Tastatur und Maus, Sprites und Gruppen, Kollisionen, Text, Sound, Timer und Vector2. Jede Zeile ist ein kurzes Snippet zum Einfügen, daneben steht, was es tut.
Alles hier ist für pygame-ce 2.5 geschrieben, die Community-Edition von pygame, die du weiterhin mit import pygame importierst. Zeilen mit dem Hinweis pygame-ce nutzen deren Erweiterungen; alle anderen Zeilen funktionieren auch im ursprünglichen pygame. Probiere jedes Snippet im pygame-Playground aus, der pygame ohne Installation direkt im Browser ausführt. Neu bei Python selbst? Fang mit dem Python-Spickzettel an.
Häufige Fragen zum Pygame-Spickzettel
Ist dieser Pygame-Spickzettel kostenlos?
Ja. Er ist kostenlos und ohne Anmeldung. Setz ein Lesezeichen oder drucke ihn im Browser als PDF und komm zurück, wann immer du den genauen Aufruf für eine Sprite-Gruppe, einen Sound oder eine Kollisionsprüfung brauchst.
Funktioniert dieser Spickzettel mit pygame und pygame-ce?
import pygame importiert und teilen fast die gesamte API. Die mit pygame-ce markierten Zeilen (FRect, scale_by, get_just_pressed, Textumbruch und move_towards_ip) brauchen pygame-ce, alles andere läuft mit beiden.Warum reagiert mein pygame-Fenster nicht?
pygame.event.get() in jedem Frame einmal auf, auch wenn du die Events ignorierst, und beende jeden Frame mit pygame.display.flip() und clock.tick(60).Sollte ich für Eingaben Events oder key.get_pressed() verwenden?
KEYDOWN-Event für Aktionen, die pro Tastendruck einmal passieren, etwa Springen oder ein Menü öffnen. Nimm pygame.key.get_pressed() für Aktionen, die andauern, solange eine Taste gehalten wird, etwa Laufen.