PyGame 2022
1. Setup
PyGame installieren
Installiere PyGame. Achtung: In der Vergangenheit habe ich die Erfahrung gemacht, dass PyGame manchmal nicht mit der neusten Versionen von Python läuft. Die neuste Version, mit der ich es getestet habe, ist Python 3.9.0, wahrscheinlich läuft es aber auch mit neueren Versionen. Es ist aber kein Problem, mehrere Python-Installationen parallel zu haben.
Siehe dazu die Seite Python Setup
PyGame Links
Offizielle Dokumentation: https://www.pygame.org/docs/
Git & GitHub
Siehe dazu die Seite Git & GitHub
ALLE Übungen und Aufträge, die du hier erledigst, werden mit Git verwaltet und auf GitHub gestellt werden. Die Repos werden mit der Lehrperson (Andreas Schärer: anschae) geteilt. Commit und pushe immer, nachdem du an einer Übung gearbeitet hast. Mache dies unaufgefordert!
Konventionen
Für unterschiedliche Programmiersprachen gibt es unterschiedliche Konventionen dazu, wie man Variablen, Klassen usw. benennt. Zum Beispiel sollten Klassen im UpperCamelCase
Stil und Funktionen & Variablen im snake_case
Stil notiert werden. Hier findest du mehr Infos zu den Programmier-Konventionen.
Pfade in Python
Pfade von Ordner und Dokumente werden in Windows (myfolder\\myfile.txt
) anders angegeben als in MacOS (myfolder/myfile.txt
). Damit dein Code auf sämtlichen Plattformen funktioniert, musst du also solche Pfadangaben vermeiden. Stattdessen sollst du das os Modul verwenden:
import os.path # KORREKT: path = os.path.join("myfolder", "myfile.txt") # falsch 1: path = "myfolder/myfile.txt") # falsch 2: path = "myfolder\\myfile.txt")
2. Projekt 1: Endless Runner I
Ziele
- Grundbausteine eines Games verstehen
- PyGame kennenlernen
- Einfache Physik (Gravitation) implementieren
Auftrag in Kürze
Ziel ist es, mit PyGame ein eigenes Endless Runner Game zu programmieren. Bekannte Spiele in diesem Stil sind:
- Dino Game von Google (https://trex-runner.com)
- Flappy Bird (https://flappybird.io)
Solche Spiele sind ziemlich einfach, können aber sehr fesselnd sein. Zum Beispiel wurde Flappy Bird ursprünglich für iOS und Android entwickelt und war sehr erfolgreich. Der Entwickler hat sich 2014 dafür entschieden, das Spiel wieder aus den App-Stores zu entfernen, da es süchtig mache, was seiner eigentlichen Absicht, Flappy Bird zu einem Gelegenheitsspiel zu machen, entgegenstünde.
Das Game wird in zwei Versionen entwickelt:
- Version I: Erste spielbare Version
- Version II: Verbesserte Programmierung im Vergl. zu Version I, mit OOP. Plus zusätzliche Features
Abgabe
- Deadline: 22.04.2022, @23.59 mit Nachricht and Lehrperson über Teams
- Auftrag bis dann komplett und eigenständig erledigt
- Aktuellste Version auf GitHub gepushed
- Es steht genügend Zeit für Auftrag zur Verfügung, es wird deshalb kein Aufschub gewährt.
Teil 1: Setup
Ziele: GitHub-Repo einrichten, Template zum Laufen bringen, Plan für Game machen
- Erstelle ein GitHub Repo
pygame_endless_runner
. Klone das Repo auf deinen Computer und arbeite für dieses Projekt in diesem Repo. - Lade das Template und das Bild in dein Repo. Ziel: Richte alles so ein, dass das Programm ausführbar ist.
- Überlege dir, was für ein Endless Runner Game du programmieren möchtest: Dino-Style, Flappy-Bird-Style, …?
Daten für Game:
Teil 2: Background
Ziele: Hintergrund bewegen
- Das Hintergrundbild soll mit konstanter Geschwindigkeit am Player vorbei ziehen.
- Implementiere dies für das vorgegebene Bild oder suche/erstelle dir selbst eins. Tipp: Am einfachsten machst du dir das Leben, wenn das Bild mind. doppelt so breit ist, wie der Screen des Games. Du kannst ein schmaleres Bild auch mit Photoshop verbreitern, in dem du es nebeneinander duplizierst, verdreifachen, …
Teil 3: Jump
Ziele: Bewegung des Spielers physikalisch realistisch implementieren
- Implementiere die Bewegung des Spielers.
- In einem Endless-Runner-Game ist diese nur vertikal (y-Richtung).
- Hängt vom Game-Typ (z.B. Dino-Style oder Flappy-Bird-Style) ab.
- Muss physikalisch korrekt sein, Gravitation muss also realistisch umgesetzt werden (siehe unten). Achte bei Dino-Style Games darauf, dass ein Jump nur möglich ist, wenn der Player auf dem Boden steht. Diese Regel kann in weiteren Versionen gebrochen - wenn es bewusst gemacht wird!
Teil 4: Gegner I
Ziele: Einen Gegner mit Bewegung und Collision Detection
- Erzeuge einen Gegner, der am anderen Ende des Bildschirms den Screen betritt und mit einer höheren Geschwindigkeit als der Hintergrund auf dich zu kommt.
- Berührt der Gegner den Player, soll GameOver sein. Dazu braucht es eine Collision Detection. Tipp: PyGame Manual!
Teil 5: Gegner II
Ziele: Mehrere (verschiedene) Gegner, werden random erzeugt
- Implementiere zuerst einen einzigen Typ Gegner, der immer wieder gespawned wird.
- Dies soll zufällig passieren, zwei Gegner sollen aber nicht zu nahe aufeinander folgen können.
- Der Code soll so geschrieben werden, dass problemlos eine beliebige Anzahl Gegner erzeugt werden kann.
- Tipp: Mache dir Gedanken, wie du die Gegner speichern möchtest.
enemy1 = ...., enemy2 = ..., enemy3 = ...
ist keine gute Idee, da zu unflexibel und zu viel Coderepetition. - Implementiere nun mehrere (mind. 3) Arten von Gegner. Schreibe deinen Code so, dass dieser problemlos um weitere Gegner erweitert werden kann.
Teil 6: Levels
Ziele: Versch. Levels/Schwierigkeitsgrade implementieren
- Das Spiel soll mit der Zeit schwieriger werden
- schnellere und mehr Gegner
- Auch möglich: neue, schwierigere Typen von Gegnern (z.B. grösser) kommen erst in späteren Levels hinzu
Teil 7: Bilder für Sprites
Ersetze die Rechtecke des Players und der Gegner durch passende Bilder.
Teil 8: Game-Balancing & Game-Testing
Ziel: Game testen, Feinschliff verpassen, Parameter so einstellen, dass Spass macht aber auch Herausforderung ist
Unter Game-Balancing versteht man die Gestaltung des Spiels, so dass das Spielen des Spiels Spass macht - auch über einen längeren Zeitraum. Ist das Spiel zu einfach, wird man schnell gelangweilt und stellt ab. Ist es gleich von Beginn an zu schwierig, so wird man frustriert und stellt auch ab. Es ist also wichtig, eine gute Balance zwischen 'gut spielbar' und 'doch noch eine Herausforderung' zu finden. Weiter sollte das Spiel eine gewisse Abwechslung bieten, so dass man das Spiel auch länger spielen möchte. Das Spiel sollte sich also verändern: Verschiedene Levels, Gegner, … und v.a. sollte der Schwierigkeitsgrad mit der Zeit etwas anziehen. Für ein Endless-Runner-Game ist besonders der letzte Punkt relevant.
Game-Testing: Wie der Schwierigkeitsgrad eines Spiels bewertet wird, hängt immer von der befragten Person ab: Ist es eine Profi-Gamerin oder eine Person, die unerfahren ist mit Games? Deshalb sollte man ein Spiel von verschiedenen Personen mit unterschiedlich viel Game-Erfahrung testen lassen.
- Game-Testing: Lasse verschiedene Personen das Spiel spielen (Kolleg:innen, Gamer, Papa, Oma, …). Hohle Feedback ein: zu schwierig/einfach? Abwechslungsreich genug? Hat es Spass gemacht, das Spiel über einen längeren Zeitpunkt zu spielen?
- Game-Balancing: Setze das von der Game-Testing-Phase eingeholte Feedback um, so dass dein Spiel möglichst balanciert ist.