Wir haben uns in dem Informatik-Kurs der QIIb von Herrn Buhk einem anspruchsvollen Projekt gewidmet: Mit der Programmiersprache Python haben wir das Spiel „TEJT-Run“ programmiert, ein sogenanntes Jump-and-Run Spiel in Anlehnung an Mario Kart. Wie wir dabei in einzelnen, aufwendigen Schritten vorgegangen sind, und wie wichtig Teamarbeit dabei war, dokumentiert der folgende Bericht.
Im Fach Informatik bezeichnet ein Projekt ein einmalig durchzuführendes Vorhaben mit einer zeitlichen Begrenzung, einem festen Budget, einer besonderen Komplexität und einer interdisziplinären Aufgabenstellung.
Angefangen wird das Projekt mit einer Voranalyse. In dieser werden Dinge, wie Ziele, Machbarkeit, eine grobe Beschreibung des Systems, einer Zeitplanung und dem Budget, definiert. Diese Themen werden in einem Lastenheft zusammengefasst.
Anschließend geht es um die Analyse, in der eine Beschreibung aus fachlicher Sicht folgt, und das Design, mit einer Beschreibung aus EDV-Technischer Sicht.
Nachdem man all die Vorbereitungen beendet hat, geht es in die Praxis, dem Programmieren. Bei diesem Schritt spielt nicht nur das Programmieren allein eine Rolle. Das Projekt sollte ebenfalls dokumentiert werden – sowohl für den Anwender als auch für den Programmierer. Hierfür benötigen wir das bereits genannte Lastenheft, ein Anwender-Handbuch, in dem alles steht, was der Anwender wissen muss, um das Programm bedienen zu können. Außerdem muss in dem Programmcode eine Inline-Dokumentation vorhanden sein, welche die einzelnen Programmstellen erklären kann, und es muss ein Testplan mit Testfällen existieren, wo das Programm auf alle Funktionen überprüft wird.
Nachdem das Programm die Testphase bestanden hat, gibt es eine technische Installation, das bedeutet, dass das Programm auf alle notwendigen Geräte gespielt wird, und alle Anwender werden geschult.
Die Idee hinter unserem Projekt:
Die Idee hinter unserem Projekt war es, ein 2D „Jump and Run“–Spiel zu machen, welches an einem Mario Spiel angelehnt ist. Uns war dabei wichtig, dass wir dieses nicht nur kopieren, sondern auch eigene Elemente in das Spiel mit einfließen lassen.
Unser Anspruch war es, ein Spiel zu gestalten, welches eine ansprechende Grafik hat. Wir hatten uns vorgenommen, dass unsere Grafik nicht verpixelt sein darf und zeitgemäß ist. Des Weiteren wollten wir eine abwechslungsreiche Weltgestaltung und nicht einfach jedes Level gleich designen. Dazu war unser Ziel, vier unterschiedliche Biome (Welten) zu entwickeln. Weitere Ziele unsererseits waren eine ansprechende Grafik für unseren Kurs, eine mitlaufende Kameraansicht und durchgehend fließende Bewegungen des Bildes.
Bei der Level-Gestaltung war uns wichtig, dass die Level abwechslungsreich sind. Sie sollten Variationen in dem Schwierigkeitsgrad haben und es sollte geheime „Welten“ geben, die man benötigt, um das jeweilige Level zu beenden aber die nicht direkt als geheime Welt zu finden sind. Es sollten Hindernisse vorhanden sein die sich bewegen, diese sind in unserem Fall Gegner, welche man besiegen kann. Allerdings kann man auch von den Gegnern besiegt werden. Im Laufe der Level sollte man Münzen sammeln können. Die Münzen können ab bestimmter Anzahl gegen weitere Leben eingetauscht werden, denn davon gibt es nur eine bestimme Anzahl. Wenn man also keine Leben mehr übrig hat, dann hat man verloren. Einige Level sollten eine Art Superkraft enthalten. Diese Superkraft hilft einem, bestimmte Hindernisse zu überwinden. Dennoch hat man die Superkraft nur auf bestimmte Zeit, also kann man sich keinen weiteren Vorteil von diesen erschaffen.
Zu guter Letzt wollten wir eine Charakterauswahl am Anfang des Spiels haben. Die Charaktere haben nicht nur ein anderes Aussehen, sie haben auch unterschiedliche Fähigkeiten. Es sollte aber alle Charaktere einen Vorteil erhalten, somit haben die Charaktere unterschiedliche Fähigkeiten, diese bewirken allerdings das gleiche.
Grafik:
Die Erstellung der Grafik ist ein wichtiger Teil in unserer Projektarbeit gewesen. Wir wollten ein ansprechendes und schönes Design für unser Spiel verwenden. Wie erstellt man nun eine solche Grafik?
Zunächst lässt sich sagen, dass für diejenigen, die nur an der reinen Programmierung interessiert sind und ein Spiel ausschließlich zur Übung programmieren, es genügend Open Sources gibt, aus denen sich etliche Grafik-Objekte runterladen lassen. Qualitativ sind diese meist nicht so anspruchsvoll, allerdings erfüllen sie ihren Zweck.
Wir hingegen hatten hohe Ansprüche an unsere Grafik und brauchten teilweise auch sehr spezifische Grafikelemente. Die Grafik als solches besteht aus den Hintergründen, den Figuren, den Bauelementen wie den Plattformen, auf denen der Avatar läuft und den levelspezifischen Items wie Münzen oder besondere Superkräfte.
Jedes dieser Grafikelemente lässt sich als einzelne Grafikdateien einfügen oder zusammen auf einen sogenannten Sprite-Sheet zusammenlegen. Vorteile solcher Sprite-Sheets ist die Dateigröße. Es nimmt viel weniger Speicherplatz ein, wenn ihr eine Grafik mit allen gewünschten Bildelementen einfügt, statt jedes einzelne Bildelement separat einzufügen. Bei den Sprite-Sheets müsst ihr aber ein paar Regeln beachten. Je nach Programm und/oder dem Zweck der Grafik müssen bestimmte Reihenfolgen, Abstände und Dateigrößen bedacht werden. Es kommt auch auf die Programmiersprache an, ob die separaten Grafikdateien gefragt sind oder die Sprite-Sheets verwendet werden müssen. Also ein Tipp an dieser Stelle: Fragt eure Programmierer im Voraus, womit sie arbeiten können. Unsere Programmiersprache – Python – war mit beidem kompatibel. So haben wir für die Bauelemente, Items und Hintergründe jeweils einzelne Grafikdateien verwendet und bei der Animation der Figuren brauchten wir Sprites. Um eine Figur animieren zu können braucht man viele einzelne Bilder, die nacheinander abgespielt werden. Auf den unteren Bildern seht ihr zwei Beispiele für solche Spritedateien. Der obere Sprite zeigt die einzelnen Standbilder der Laufbewegung unserer weihnachtlichen Spielfigur. In dem unteren Bild seht ihr die Bewegung des Befehls „Jump“.
Bei der Erstellung der Hintergründe gibt es auch eine Technik, die den Grafikern enorm die Arbeit erleichtern kann. Statt einfach loszumalen, um dann festzustellen, dass die Berge oder die Sonne verschoben werden müssen, sollte man vorher gut planen und mit sogenannten „Layers“ arbeiten. Hier seht ihr ein Beispiel für die „Layer“. Wenn jetzt eine Bergfront neu eingefärbt oder verschoben werden muss, dann könnt ihr dies problemlos machen, ohne dass ihr den Rest der Grafik zerstören müsst.
Hier ein kleiner Einblick in unsere Grafik. Die Hintergründe habe ich mit schon vordesignten Elementen selbst zusammengestellt. Ich habe die Layers von einer Open Source verwendet. Die Bausteine als auch die Figuren sind nicht selbst erstellt. Das wäre zu aufwendig in der kurzen Zeit, die uns zur Verfügung stand. Zudem sind wir alle keine Künstler im Kurs…
Programmierung:
Unser Programm „TEJT-Run“ ist ein sogenanntes Jump-and-Run Spiel. Für die Spielentwicklung haben wir uns für die Programmiersprache Python entschieden, da diese ein einfacheren Einstieg in die Programmierung ermöglicht als andere Sprachen und trotzdem eine moderne und stark verbreitete Programmiersprache ist. So setzen z.B. die Internetgiganten Google und Facebook Python ein. Für unser Projekt mussten wir uns erst einmal mit Python und der Pygame-Bibliothek vertraut machen. Die Pygame Bibliothek ist eine Erweiterung von Python, die speziell für die Spielentwicklung notwendig ist. Sie enthält spezielle Befehle, wie z.B. Einbinden von Grafiken und Sound, Abfragen von Tastatureingaben oder Bewegungen, wie z.B. das Springen.
Zu Projektbeginn mussten wir als erstes Python und die Bibliothek Pygame aus dem Internet heruntergeladen und installieren (was auf den Schulrechnern auch schon eine kleine Herausforderung war). Auch wenn man mit Python sehr gut Spiele programmieren kann, sollte man allerdings erwähnen, dass es sehr anspruchsvoll ist, so eine neue und komplexe Programmiersprache zu lernen.
Den kompletten Programmcode vorzustellen, würde hier zu weit führen, da das Programm mittlerweile aus ca. 900 Zeilen Code besteht.
Um euch einen kleinen Eindruck zu geben, seht ihr im Folgenden zwei Ausschnitte aus dem Programm, um zu zeigen, wie wir programmiert haben. Das obere Codesegment zeigt, wie wir das initiale Fenster des Spiels geöffnet haben. Dafür legen wir mit einem Befehl aus der Pygame-Bibliothek das Fenster mit den vorher definierten Größen (die Variablen W und H sind vorher festgelegt worden und geben die Breite und die Höhe des Fensters an) fest. Dies speichern wir in der Variablen „fenster“ für eine spätere weitere Verarbeitung (z.B. für das Einfügen eines Hintergrundbildes). Im unteren Codesegment sehen sie, wie wir die Spielerfigur geladen haben. Wir haben das Bild mit einem Pygame-Befehl hochgeladen und die Variable „spieler“ zur weiteren Verarbeitung geladen.
Reflektion:
Kurz vor den Weihnachtsferien mussten wir dann unser Projekt abgeben. Dazu gehörte eine abschließende Präsentation, in der wir unsere Arbeit dem Rest des Kurses vorgestellt haben. Hier, nach einem halben Jahr Arbeit, stellte sich dann die Frage, was wir geschafft haben. Tatsächlich ist es so, dass wir nicht alle unserer Zielsetzungen erreicht haben. Mit der Grafik sind wir fertig geworden, doch beim Programmieren hätten wir noch mehr Zeit gebraucht, um fertig zu werden. Hier müssen wir dann hinterfragen, warum dies passiert ist. Der Grund ist recht einfach: Es hat mehr Zeit in Anspruch genommen, eine neue Programmiersprache und neue Funktionalitäten zu erlernen, als gedacht. So haben wir die Grundlage geschaffen, es aber nicht geschafft unser Spiel mit weiteren Levels auszubauen und so unsere Zielsetzungen zu erreichen. Trotzdem sind wir in Gruppe zufrieden mit unserer Arbeit. Es zählt auch qualitatives Arbeiten und die Komplexität des Projekts, die bei uns auf jeden Fall hoch war. Hervorheben möchten wir zuletzt noch unsere gute Teamfähigkeit, die uns geholfen hat Probleme zu lösen und voranzukommen.
Vielleicht müsst ihr auch einmal ein Projekt in Informatik machen. Wir können euch nur den Tipp geben euch vorher gut zu überlegen was ihr macht und wie ihr es umsetzt. Es kann sehr viel Arbeit sein, neue Sachen zu erlernen. Auf der anderen Seite kann man aber auch viel dazulernen. Ein Projekt ist eine verbreitete Sache in der Arbeitswelt. Ihr könnt ja Mal eure Eltern danach fragen. Es hilft auf jeden Fall für eure Zukunft, so etwas schon einmal gemacht zu haben. Man arbeitet als Gruppe ein halbes Jahr fast eigenständig und selbst muss man viel Verantwortung für die anderen übernehmen. Das ist eine Herausforderung, kann aber auch Spaß machen.
Für euer Projekt wünschen wir euch viel Spaß und Erfolg!
Bericht von Thorben Buschke