Menu
CoddyTech

Pygame Spickzettel

Zuletzt aktualisiert

Einrichtung und Spielschleife

Jedes pygame-Programm öffnet ein Fenster und wiederholt dann eine Schleife, bis der Spieler das Spiel beendet.

AufgabeCode
pygame-ce installierenpython3 -m pip install pygame-ce
pygame importieren und startenimport pygame pygame.init()
Ein Fenster öffnenscreen = pygame.display.set_mode((640, 480))
Fenstertitel setzenpygame.display.set_caption("My Game")
Eine Uhr erstellenclock = pygame.time.Clock()
Die Spielschleiferunning = 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 beendenpygame.quit()

Anzeige

Der Bildschirm ist eine Surface; nichts erscheint, bis du ihn mit flip anzeigst.

AufgabeCode
Fertigen Frame anzeigenpygame.display.flip()
Nur bestimmte Bereiche anzeigenpygame.display.update([rect1, rect2])
Bildschirm leerenscreen.fill((30, 30, 46))
Fenstergrößescreen.get_size(), screen.get_width()
Der Bildschirm als Rectscreen.get_rect()
Fenster mit änderbarer Größepygame.display.set_mode((640, 480), pygame.RESIZABLE)
Vollbild in Desktop-Größepygame.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.

AufgabeCode
Farbe als RGB(255, 140, 0)
Farbe per Name oder Hex"tomato", "#ff8c00", pygame.Color("gold")
Rechteckpygame.draw.rect(screen, "red", (x, y, w, h))
Umriss und abgerundete Eckenpygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Kreis (über seinen Mittelpunkt)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Liniepygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Polygonpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Ellipse in einem Rechteckpygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Ein Rect speichert Position und Größe als ganze Zahlen.

AufgabeCode
Ein Rect erstellenplayer = pygame.Rect(x, y, width, height)
Über einen beliebigen Punkt positionierenplayer.center = (320, 240), player.bottom = 400
Kanten und Eckenleft, right, top, bottom, topleft, midbottom
Direkt verschiebenplayer.move_ip(dx, dy)
Verschobene Kopiemoved = player.move(dx, dy)
Im Bildschirm haltenplayer.clamp_ip(screen.get_rect())
Um die Mitte vergrößernbigger = 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.

AufgabeCode
Bild mit Transparenz ladenimg = pygame.image.load("player.png").convert_alpha()
Bild ohne Transparenz ladenbg = pygame.image.load("sky.png").convert()
Ein Bild zeichnenscreen.blit(img, (x, y))
Zentriert zeichnenscreen.blit(img, img.get_rect(center=(320, 240)))
Neue leere Surfacepanel = pygame.Surface((200, 100))
Transparente Surfacelayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Ganze Surface halbtransparent machenimg.set_alpha(128)
Einzelbild aus einem Spritesheet schneidenframe = sheet.subsurface((0, 0, 32, 32))
Screenshot speichernpygame.image.save(screen, "shot.png")

Transformieren

Jede Funktion gibt eine neue Surface zurück; transformiere das Original, nicht das letzte Ergebnis.

AufgabeCode
Größe ändernpygame.transform.scale(img, (64, 64))
Um einen Faktor skalierenpygame.transform.scale_by(img, 2)
Weich skalierenpygame.transform.smoothscale(img, (64, 64))
Drehen (gegen den Uhrzeigersinn, in Grad)pygame.transform.rotate(img, 45)
Um die Mitte drehenrotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Horizontal spiegelnpygame.transform.flip(img, True, False)

Events und Tastatur

Nutze Events für einzelne Tastendrücke und get_pressed() für gehaltene Tasten.

AufgabeCode
Events dieses Frames lesenfor event in pygame.event.get():
Fenster geschlossenevent.type == pygame.QUIT
Eine Taste wurde gedrücktevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Eine Taste wurde losgelassenevent.type == pygame.KEYUP
Eingegebenes Zeichenevent.unicode
Gerade gehaltene Tastenkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
Richtung aus zwei Tastendx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
In diesem Frame gedrückte Tasten (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
TastenkonstantenK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Name einer Tastepygame.key.name(event.key)
Eigenes EventHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Maus

Maustasten: 1 links, 2 Mitte, 3 rechts.

AufgabeCode
Eine Maustaste wurde gedrücktevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Wo gedrückt wurdeevent.pos
Aktuelle Zeigerpositionx, y = pygame.mouse.get_pos()
Gerade gehaltene Maustastenleft, middle, right = pygame.mouse.get_pressed()
Maus bewegtevent.type == pygame.MOUSEMOTION, event.rel
Mausrad gedrehtevent.type == pygame.MOUSEWHEEL, event.y
Auf einen Button geklicktbutton_rect.collidepoint(event.pos)
Mauszeiger ausblendenpygame.mouse.set_visible(False)

Sprites und Gruppen

Ein Sprite hat ein image und ein rect; eine Gruppe aktualisiert und zeichnet viele davon.

AufgabeCode
Sprite-Klasseclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Eine Gruppe erstellencoins = pygame.sprite.Group()
Zu einer Gruppe hinzufügencoins.add(Coin((100, 50)))
Alle Sprites aktualisierencoins.update()
Alle Sprites zeichnencoins.draw(screen)
Sprite aus allen Gruppen entfernencoin.kill()
Gruppe mit genau einem Spriteplayer = pygame.sprite.GroupSingle(Player())

Kollisionen

Rects kollidieren, wenn sie sich überlappen; Kanten, die sich nur berühren, zählen nicht.

AufgabeCode
Zwei Rechteckea.colliderect(b)
Punkt innerhalbrect.collidepoint(x, y)
Erstes von vielenrect.collidelist(walls) # index or -1
Sprite gegen eine Gruppehits = pygame.sprite.spritecollide(player, coins, True)
Überhaupt ein Trefferpygame.sprite.spritecollideany(player, enemies)
Gruppe gegen Gruppepygame.sprite.groupcollide(bullets, enemies, True, True)
Pixelgenaupygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Kreisepygame.Vector2(a).distance_to(b) < r1 + r2

Text und Schriftarten

Rendere Text auf eine Surface und zeichne sie dann mit blit.

AufgabeCode
Standardschriftfont = pygame.font.Font(None, 36)
Systemschriftfont = pygame.font.SysFont("arial", 24)
Schriftdateifont = pygame.font.Font("pixel.ttf", 32)
Text renderntext = font.render("Score: 10", True, "white")
Zentriert zeichnenscreen.blit(text, text.get_rect(center=(320, 40)))
Langen Text umbrechen (pygame-ce)font.render(story, True, "white", None, 400)
Größe ohne Rendernfont.size("Hello")
Installierte Schriftartenpygame.font.get_fonts()

Sound und Musik

Lade Sounds einmal. Musik wird als ein einzelnes Stück direkt aus der Datei gestreamt.

AufgabeCode
Einen Sound ladenjump = pygame.mixer.Sound("jump.ogg")
Abspielenjump.play()
Sound-Lautstärkejump.set_volume(0.5)
Musik ladenpygame.mixer.music.load("theme.ogg")
Musik endlos wiederholenpygame.mixer.music.play(-1)
Pausieren und fortsetzenpygame.mixer.music.pause(), pygame.mixer.music.unpause()
Musik stoppenpygame.mixer.music.stop()

Zeit und Timer

Ticks werden in Millisekunden gezählt.

AufgabeCode
Framerate begrenzenclock.tick(60)
Deltazeit in Sekundendt = clock.tick(60) / 1000
Aktuelle Framerateclock.get_fps()
Millisekunden seit initpygame.time.get_ticks()
Wiederholendes Timer-EventSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Einmaliger Timerpygame.time.set_timer(SPAWN, 2000, loops=1)
Timer stoppenpygame.time.set_timer(SPAWN, 0)

Vector2

Kommazahlen für Positionen und Geschwindigkeiten.

AufgabeCode
Einen Vektor erstellenpos = pygame.Vector2(100, 200)
Um eine Geschwindigkeit bewegenpos += velocity * dt
Längevelocity.length()
Gleiche Geschwindigkeit diagonalif direction.length() > 0: direction = direction.normalize()
Abstand zwischen Punktenpos.distance_to(target)
Drehenvelocity.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?
Ja. Beide werden mit 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?
Die Spielschleife liest keine Events. Rufe 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?
Nimm ein 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.
Illustration der Programmiersprachen bei Coddy

Lerne Pygame mit Coddy

Los geht's