Über meine Intention mit diesem Projekt habe ich eigentlich in den vorangehenden Beiträgen schon genug gesprochen, deswegen konzentriere ich mich jetzt auf die Tools, mit denen ich arbeiten werde.
1. Versionsmanagement
Wenn man schon mal an einem längeren Dokument gearbeitet hat, kennt man vielleicht das folgende Problem: Man hat vor Tagen / Wochen einen Abschnitt völlig umgeschrieben oder sogar gelöscht, nur um im Nachhinein zu der Ansicht zu kommen, die alte Version war im Vergleich zur neuen doch ganz gut.
Bei Software-Projekten verhält es sich nicht anders: oft spielt man so lange mit dem existierenden Code herum, bis nichts mehr funktioniert. Dass der Code auf dutzende Dateien verteilt und mehrere tausend Zeilen lang ist, macht es nicht besser.
Hier kommt das Versionsmanagement ins Spiel.
Mit Hilfe von Revisionen – so etwas wie Backups - ist es möglich, Dateien oder auch nur einzelne Codeausschnitte wieder auf eine alte Version zurückzusetzen, verschiedene Versionen zu vergleichen oder Versionen zusammenzufügen. Der Benutzer hat dabei volle Kontrolle, welche Dateien eines Projekts der Versionskontrolle unterliegen sollen und wie oft eine neue Revision erstellt werden soll.
Wenn man schon mal an einem größeren Projekt, vielleicht auch mit mehreren Leuten, gearbeitet hat, wird ein Programm zum Versionsmanagement schnell unverzichtbar.
Für mein Spieleprojekt habe ich mich für das Tool „Mercurial“ entschieden. Als Einzelkämpfer ist für mich die Art des Versionsmanagement-Tools mehr oder weniger egal, solange ich mich damit wohl fühle. Ich hätte genauso gut zu „Subversion“ oder „git“ greifen können.
2. Software-Entwurf
Man kann sich nicht einfach dazu entschließen, ein Software-Projekt zu starten, sich hinsetzen und anfangen Code zu schreiben. Das geht vielleicht noch bei ganz einfachen Programmen oder wenn man eine bestimmte Art von Programm schon öfter geschrieben hat und keine große Neuorganisation des Codes vorsieht.
Da ich aber nun mal bei null beginne und mich auch nicht mit x Jahren Erfahrung bei der Spieleprogrammierung brüsten kann, muss ich meinen Code sorgfältig planen.
Die Struktur, der man seinen Code unterwirft, wird maßgeblich vom Programmierparadigma bestimmt, dem man sich (auch mit der Wahl der Programmiersprache) verschreibt, etwa dem Paradigma der prozeduralen Programmierung, der aspektorientierten Programmierung oder der objektorientierten Programmierung, nach welchem ich arbeiten werde.
Ich werde auf das Thema Softwareentwurf in einem zukünftigen Beitrag noch näher eingehen, deswegen sei hier nur gesagt, dass die objektorientierte Programmierung verlangt, das Programm in mehrere, interagierende und kommunizierende Teile zu zerlegen. Würde man das in reiner Textform bewerkstelligen, verlöre man schnell den Überblick, da die Querverweise zahlreich und kompliziert sind. Deswegen gibt es eine Reihe von standardisierten Diagrammen, sogenannte UML-Diagramme, die einem das Leben erleichtern.
Da ich alleine Arbeite, habe ich freie Hand, wie viel Zeit und Arbeit ich in die Diagramme stecke. Bis zu einem gewissen Grad kann man sagen, dass die Implementierung umso schneller vonstattengeht, je mehr Zeit man mit der Planung verbringt. Ich möchte es bei einem vernünftigen Maß belassen und werde mich auf ein Klassendiagramm – dort sieht man die einzelnen Elemente des Programms und wie sie zusammenhängen- und einige Sequenzdiagramme – beschreibt die Kommunikation zwischen den Elementen anhand von Fallbeispielen - beschränken.
Ein ganz schönes Freeware-Tool, um diese Aufgabe zu bewältigen, ist StarUML. Das ist vergleichsweise komfortabel zu bedienen und die Diagramme sehen schön aus.
Viele UML-Programme bieten auch die Möglichkeit, aus dem Diagramm gleich ein Codegerüst zu erstellen. Ich bin jedoch aus mehreren Gründen kein Freund davon und werde davon nicht Gebrauch machen.
3. Programmiersprache
Die Wahl der Programmiersprache, ein leidiges Thema. Manchmal habe ich den Eindruck, die Frage nach der bevorzugten Programmiersprache ist die Gretchenfrage für Programmierer. Da wird von Dingen wie „Mächtigkeit“ einer Programmiersprache und ähnlichen sinnfreien Dingen gesprochen, vergleichbar mit dem teils absurd geführten Konsolenkrieg alter Tage.
Ich bin ein großer Freund von Programmiersprachen mit hohem Abstraktionsgrad, das heißt, ich will mich nicht mehr als nötig mit Hardware-Details, Speichermanagement oder Speicheradressierung herumschlagen müssen. Ich habe während des Studiums viel Java gelernt, eine Sprache die meiner Meinung nach schön strukturiert, für vieles gedacht, aber zu nichts zu gebrauchen ist.
C#, das von Microsoft entwickelte Konkurrenzprodukt, habe ich schon einmal für eine kleine Anwendung für ein Telekommunikationsunternehmen verwendet und war sehr angetan. Die Struktur ist gut wie bei Java, aber im Gegensatz zu Suns Sprache wissen auch die Endprodukte zu überzeugen. C# ist die Sprache meiner Wahl für dieses Projekt.
4. Entwicklungsumgebung
Die Wahl der Entwicklungsumgebung ist für so manchen ähnlich heikel wie die der Programmiersprache. Für jedermann ist etwas geboten: Die absoluten Nerds verwenden Texteditoren wie Emacs oder vi in Verbindung mit Kommandozeilen-Befehlen, andere hätten gerne eine leicht zu bedienende, übersichtliche Oberfläche und wieder andere möchten das volle Programm, eine mit allerlei Tools vollgestopfte Entwicklungs-Suite bei der schon die Flut an Buttons, Statusleisten, Kontextmenüs und Optionen ein leichtes Gefühl der Beschränktheit des menschlichen Geistes hervorrufen kann.
Ich persönlich bevorzuge die übersichtliche Variante mit Tendenz zur Suite. Emacs und vi sind ohne Zweifel fantastische Editoren, deren Bedienung aber monatelanges Training voraussetzt, worauf ich nicht wirklich Lust habe. Entwicklungs-Suiten sind andererseits meist sehr teuer, aufwändig zu konfigurieren oder für mich manchmal schlicht zu unübersichtlich, zumal ich auch von 90% der angebotenen Funktionen selten bis nie Gebrauch mache.
Ich werde deshalb vorerst mit Visual Studio Express 2010 arbeiten, welches ich in diesem Projekt auch zum ersten Mal benutze. Dort habe ich die für mich wichtigsten Funktionen vereint:
• Projekt-Browser. Zeigt die Dateien an, die zum Projekt gehören.
• schnelles Kompilieren. übersetzt den Programmcode in eine Ausführbare Datei.
• Syntax-Highlighting. Unterlegt bestimmte Teile des Codes farbig, um ihn besser lesbar zu machen.
• Auto-Vervollständigung. Ganz wichtig, wenn man nicht wirklich jede Funktion beim Namen kennen will.
• Debugger. Hilft beim Auffinden von Fehlern im Code.
Ich denke, damit bin ich gerüstet, um meinen Entwurf auch in Code umsetzen zu können. Zu meinen Zeiten als Student hatte ich noch Zugriff auf eine Vollversion von Visual Studio 2008. Das war eigentlich auch sehr schön, als Hobbyentwickler kann ich mir das aber jetzt nicht mehr leisten.
5. Libraries
Ich will mein Spiel selbst programmieren. Ich will keine Baukasten à la RPG Maker benutzen, sondern von Grund auf alles selber machen. Andererseits möchte ich mir das Leben auch nicht unnötig schwer machen. Um das zu vermeiden, greife ich, wie jeder andere Programmierer auch, auf existierende Bibliotheken und Frameworks zurück.
Dabei handelt es sich um Sammlungen von Funktionen, Datenstrukturen und Schnittstellen, für die sich schlaue Leute lange den Kopf zerbrochen haben, um Lösungen zu Problemen bereit zu stellen, vor denen Programmierer immer wieder stehen. Darunter fallen etwa Dinge wie die Kommunikation mit der Hardware, Netzwerkunterstützung, parallele Programmierung oder schnelle Arithmetik. Wollte man das alles selber schreiben, stünde man vor einer Lebensaufgabe und am Ende wäre das Ergebnis meist doch schlechter als wenn man gleich die vorhandenen Bibliotheken genutzt hätte.
Für dieses Projekt greife ich auf das .Net- und das XNA-Framework zurück.
Die .Net-Library ist sehr umfangreich und stellt sozusagen das grundlegende Arbeitsmaterial für alle Arten von Projekten bereit. Ob man nun mit Zeichenketten (also Text), Dateien oder Datenbanken zu tun hat, es ist immer toll, eine so gut sortierte und umfangreiche Library zur Verfügung zu haben.
Erweitert wird es durch das XNA-Framework, welches speziell auf die Entwicklung von Spielen zugeschnitten ist. Geboten sind hier unter anderem die Integration von sehr vielen Medien-Formaten, wie etwa JPG, PNG, WAV etc., Implementierungen von Operationen der Linearen Algebra (Matrix- und Vektor-Multiplikation) und weitere mathematische Hilfsmittel wie Kurveninterpolation.
6. Weitere Tools
Neben den eben beschriebenen Hilfsmitteln verwende ich Programme für speziellere Einsatzgebiete, wie etwa Mathematica, und auch noch Programme und Helferlein, die wohl fast jedem bekannt sind und deshalb keiner größeren Erklärung bedürfen, unter anderem: Paint, Word, Notepad, sowie Zettel und Stift.
Gerade ohne die beiden letztgenannten wäre mein Projekt tot, noch bevor es überhaupt geboren worden wäre.
So, das war also der erste Teil. Ich hoffe, es war für euch einigermaßen interessant zu lesen und freue mich über Verbesserungsvorschläge für zukünftige Einträge aber auch über Kommentare zum Gesagten.