Zum Inhalt

Pygame Sprites (Klassen und Objekte)

Lernziele

  • Sprites (Klassen, Baupläne)
    • Sprites/Objekte erstellen
    • Attribute/Eigenschaften
  • Gruppen

Das Sprite

Ein Pygame-Sprite ist etwas ganz Neues für dich. Ein Sprite ist ein Grafikobjekt, das von der Grafikhardware über das Hintergrundbild bzw. den restlichen Inhalt der Bildschirmanzeige eingeblendet wird. Die Positionierung wird dabei komplett von der Grafikhardware erledigt. Sprites kann man einfach bewegen, animieren und das Programmieren von Kollisionen mit anderen Objekten ist auch sehr vereinfacht. Sprites werden in sogenannten Klassen (Baupläne) programmiert.

Klassen: Beispielerklärung

Eine Klasse kannst du dir als LEGO-Bauanleitung vorstellen: Die Anleitung sagt dir, wie das Objekt aussieht und wie du es zusammensetzt. Es ist nur ein Bauplan für das Legomännchen. Vor allen Eigenschaften des Objekts steht ein self. Diese Eigenschaften werden auch Attribute genannt.

Lego Bauplan

Die Bauanleitung selbst bewirkt noch gar nichts. Wenn du ein Legomännchen in dein Programm einbauen möchtest, dann musst du es anfordern und in einer Variablen speichern. Dies geschieht meistens bei den «globalen Initialisierungen». Hier werden z.B. drei Objekte mit Hilfe von Variablen (player1, player2 und player3) definiert, die jeweils einem Legomännchen entsprechen.

player1 = Legomaennchen()
player2 = Legomaennchen()
player3 = Legomaennchen()

Klassen/Sprites in Python

Arbeite die folgenden Punkte durch.

  1. Lade die Datei "einf_pygame_02_sprite.zip" herunter und entpacke das ZIP-File.

  2. Starte das Programm. Wenn du das Programm startest, siehst du an irgendeiner Stelle des Fensters ein farbiges Rad.

  3. Schau dir den Bauplan der Klasse Player an. Welche Eigenschaften hat ein Objekt dieser Klasse im Programm? Zähle sie auf und erkläre für was sie stehen könnten?

    Lösung: klick me!

    Lösung

  4. class Player(py.sprite.Sprite) ist nur ein Bauplan für ein Grafikobjekt der Klasse Player. Wo im Programm wird die Bauanleitung für den Player aufgerufen? D.h., wo wird ein Objekt der Klasse Player erstellt? Wie heisst die Variable, die das erstellte Grafikobjekt repräsentiert?

Gruppen

Wenn man viele Sprites (Gegner, Schüsse, Hindernisse) hat, dann ist es hilfreich, wenn man sie gruppieren kann. Gruppen kann man sich wie Listen vorstellen.

  1. Wir arbeiten zuerst nur mit einer Gruppe, der wir alle Objekte hinzufügen. Die Gruppe heisst all_sprites und wird wie folgt definiert:

    all_sprites = py.sprite.Group().
    
    Sie soll, wie der Name schon sagt, alle zu zeichnenden Sprites enthalten. Ist die Gruppe einmal erstellt, können wir den Spieler player1 der Gruppe hinzufügen:
    all_sprites.add(player1) .
    

  2. Wir möchten nun alle Sprites, welche in der Gruppe all_sprites sind, zeichnen. Wo geschieht das im Programm-Code?

  3. Erstelle einen weiteren Spieler mit den Namen player2 und stelle ihn auf dem Bildschirm dar.

  4. Ändere das Bild von player2. Du musst also das Attribut image von player2 ändern (player2.image = ....). Du findest das Bild im Ordner "res" mit dem Dateiname "disco.png".

    Hinweis: Nach dem Ändern des Bildes, muss auch das Rechteck-Attribut des Objekts player2 aktualisiert werden (player2.rect = ...).

Weitere Aufgaben

  1. Bediene player1 und player2 mit den Tasten (z.B. player1 mit den Pfeiltasten und player2 mit den wsad-Tasten).

    Wichtig Änderung des Programmcodes:

    Die Abfrage der Tasten ist absichtlich in die Funktion key_handler() ausgelagert worden, damit die Hauptschleife übersichtlich bleibt. Sie wird in der Hauptschleife bei jedem Durchgang aufgerufen. Somit hat sich unser Programmaufbau folgdermassen verändert (siehe Bild):

    Ablauf

  2. Füge der Klasse Player, also dem Bauplan, eine zusätzliche Eigenschaft self.step_size hinzu. Sie soll eine Zufallszahl von 1 bis 10 sein. Der Spieler soll sich beim entsprechenden Tastendruck genau um die Anzahl Pixel bewegen, die in der Eigenschaft/dem Attribut step_size gespeichert ist.

  3. (s) Wir wollen nun ein komplett anderes Sprite Objekt erstellen. Gehe dazu die folgenden Punkte durch.

    • Erstelle eine neue Sprite-Klasse (Bauplan) mit dem Namen Bullet.
    • Ein Bullet Objekt soll wie in diesem BILD aussehen. Lade es herunter und füge es in der Klasse, das heisst bei der Bauanleitung, ein.
    • Ändere beim Bildladen den Befehl convert() zu convert_alpha() ab, um den Effekt der Transparenz sichtbar zu machen.
    • Erstelle ein Objekt der Klasse Bullet, nenne es player3 (ich weiss, sehr unkreativ ;)) und füge es irgendwo auf dem Bildschirm ein.
  4. (s) Erweitere das Programm so, dass die Koordinaten von player3 immer der, der Maus entsprechen.

  5. (s) Sorge dafür, dass die Spieler nicht aus dem Fenster laufen können.

Mögliche Lösung

Download HIER.