Spiele programmieren lernen

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[unmarkierte Version][gesichtete Version]
(Die Wahl der Programmiersprache)
(SDL Dokulink korrigiert, da dieser zu einer nicht existenten Seite verbindet (dasselbe wie bei korrigierten Allegrolinks))
 
(157 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
+
Dieser Artikel soll dir dabei helfen einen ersten Überblick darüber zu gewinnen, was auf dich zukommt, wenn du Spiele programmieren lernen möchtest. Er richtet sich speziell an Anfänger, die noch keine Erfahrung mit der Programmierung haben. Bitte lies diesen Artikel sehr sorgfältig durch, und nimm die Tipps und Empfehlungen ernst. Sie sind nicht einfach aus der Luft gegriffen, sondern basieren auf langjähriger Erfahrung.
  
 
== Was braucht es, um Spieleprogrammierer zu werden? ==
 
== Was braucht es, um Spieleprogrammierer zu werden? ==
  
Du hast dir das Ziel gesetzt, eigene Spiele zu programmieren. Eines sollte dir von Anfang an klar sein: Der Weg bis zum ersten eigenen Spiel ist kein leichter. Zunächst einmal solltest du in der Lage sein, dir fremde Themenbereiche selbstständig zu erarbeiten. Du wirst sehr viel lesen müssen und nicht immer jemanden haben, der dir sagt, was du als nächstes tun sollst. Auch um englischsprachige Texte kommst du ab einem gewissen Punkt nicht mehr herum, also solltest du diese Sprache beherrschen. Wenn du noch nie programmiert hast, wird der Anfang schwierig werden. Darum ist es wichtig, dass du nicht aufgibst, auch wenn es nur in kleinen Schritten voran geht.
+
Du hast dir also ein Ziel gesetzt: Du möchtest eigene Spiele programmieren. Eines sollte dir von Anfang an klar sein: Der Weg bis zum ersten eigenen Spiel ist kein leichter. Zunächst einmal solltest du in der Lage sein, ''dir fremde Themenbereiche selbstständig zu erarbeiten''. Du wirst sehr viel lesen müssen und nicht immer jemanden haben, der dir sagt, was du als nächstes tun sollst. Auch um englischsprachige Texte kommst du ab einem gewissen Punkt nicht mehr herum, also solltest du diese Sprache so gut beherrschen, dass du technische Anleitungen/Handbücher lesen kannst. Wenn du noch nie programmiert hast, wird der Anfang schwierig werden. Darum ist es wichtig, dass du nicht aufgibst, auch wenn es nur in kleinen Schritten voran geht.
  
Wir haben alle einmal an dem Punkt angefangen, an dem du nun stehst. Jedoch hast du das große Glück, dass ein schneller und günstiger Internetzugang heute eine Selbstverständlichkeit ist. Dir steht mit dem Internet eine enorme Informationssammlung zur Verfügung, die dir auf fast jede nur denkbare Frage eine Antwort liefern kann. So zum Beispiel auch dieses Wiki. Natürlich kann es nicht alle Fragen beantworten und für alle Probleme eine Lösung parat haben. Aus diesem Grund solltest du wissen, wie man eine ''Suchmaschine'' richtig benutzt, um gezielt nach Informationen zu suchen. Die meisten Fragen lassen sich durch Suchen beantworten — man muss nur wissen, wonach man suchen muss.
+
Alle, die heute ihre eigenen Spiele programmieren, haben alle einmal an dem Punkt angefangen, an dem du nun stehst. Jedoch hast du das große Glück, dass ein schneller und günstiger Internetzugang heute eine Selbstverständlichkeit ist. Dir steht mit dem Internet eine enorme Informationssammlung zur Verfügung, die dir auf fast jede nur denkbare Frage eine Antwort liefern kann. So zum Beispiel auch dieses Wiki. Natürlich kann es nicht alle Fragen beantworten und für alle Probleme eine Lösung parat haben. Aus diesem Grund solltest du wissen, wie man eine ''Suchmaschine'' richtig benutzt, um gezielt nach Informationen zu suchen. Die meisten Fragen lassen sich durch Suchen beantworten man muss nur wissen, wonach man suchen muss.
  
Als Programmierer und insbesondere als Spieleprogrammierer sollte man mit der ''Mathematik'' nicht auf dem Kriegsfuß stehen. (3D-)Grafik, Physiksimulation und künstliche Intelligenz beinhalten fast ausschließlich rein mathematische Fragestellungen, und auch außerhalb dieser Themengebiete wirst du immer wieder einfachere Formeln aufstellen und berechnen müssen. Logisches Denken und Abstraktion sind weitere Fähigkeiten, die dir bei der Spieleprogrammierung sehr nützlich sein werden. Oft musst du ein großes Problem in kleinere Teilprobleme zerlegen, die für sich genommen einfacher zu lösen sind. Viele Probleme sind auf den ersten Blick unterschiedlich, aber wenn du sie genauer betrachtest, erkennst du vielleicht eine Ähnlichkeit zu einem anderen Problem, dessen Lösung du bereits kennst. Aber keine Sorge: solche Dinge lernst du mit der Zeit, wenn du genügend Erfahrung gesammelt hast.
+
Als Programmierer und insbesondere als Spieleprogrammierer sollte man mit der ''Mathematik'' nicht auf dem Kriegsfuß stehen. (3D-)Grafik, Physiksimulation und künstliche Intelligenz beinhalten fast ausschließlich rein mathematische (oft geometrische) Fragestellungen, und auch außerhalb dieser Themengebiete wirst du immer wieder einfachere Formeln aufstellen und berechnen müssen. Logisches Denken und Abstraktion sind weitere Fähigkeiten, die dir bei der Spieleprogrammierung sehr nützlich sein werden. Oft musst du ein großes Problem in kleinere Teilprobleme zerlegen, die für sich genommen einfacher zu lösen sind. Viele Probleme sind auf den ersten Blick unterschiedlich, aber wenn du sie genauer betrachtest, erkennst du vielleicht eine Ähnlichkeit zu einem anderen Problem, dessen Lösung du bereits kennst. Aber keine Sorge: solche Dinge lernst du mit der Zeit, wenn du genügend Erfahrung gesammelt hast.
  
 
Der nächste wichtige Punkt bei der Entwicklung eigener Spiele ist natürlich Kreativität. Niemand möchte den eintausendsten Tetris-Klon spielen. Hier hilft es, wenn du selbst möglichst viele verschiedene Arten von Spielen spielst (das heißt: ''nicht nur Ego-Shooter!''). Du solltest dabei mit der Zeit ein Gefühl dafür entwickeln, welche Elemente eines Spiels dazu beitragen, dass es Spaß macht. Wenn du solche Elemente in einer noch nicht zu oft gesehenen Art und Weise kombinierst und deinem Spiel etwas Persönliches gibst, was es von allen anderen Spielen abhebt und es einzigartig macht, dann hast du das Ziel erreicht. Nun bist du als Programmierer vielleicht nicht begabt im Zeichnen oder Musizieren, und trotzdem benötigt dein Spiel Grafiken, Soundeffekte und Musik. Hier bietet sich die Zusammenarbeit mit Grafikern und Musikern an, womit wir gleich beim nächsten Punkt angelangt wären: ''Teamfähigkeit''. Insbesondere bei größeren Projekten, wo auch die Programmierung von mehr als nur einer Person umgesetzt wird, muss das Team gut funktionieren, damit am Ende des Tages ein gutes Spiel produziert werden kann (aber um daran zu denken ist es noch zu früh).
 
Der nächste wichtige Punkt bei der Entwicklung eigener Spiele ist natürlich Kreativität. Niemand möchte den eintausendsten Tetris-Klon spielen. Hier hilft es, wenn du selbst möglichst viele verschiedene Arten von Spielen spielst (das heißt: ''nicht nur Ego-Shooter!''). Du solltest dabei mit der Zeit ein Gefühl dafür entwickeln, welche Elemente eines Spiels dazu beitragen, dass es Spaß macht. Wenn du solche Elemente in einer noch nicht zu oft gesehenen Art und Weise kombinierst und deinem Spiel etwas Persönliches gibst, was es von allen anderen Spielen abhebt und es einzigartig macht, dann hast du das Ziel erreicht. Nun bist du als Programmierer vielleicht nicht begabt im Zeichnen oder Musizieren, und trotzdem benötigt dein Spiel Grafiken, Soundeffekte und Musik. Hier bietet sich die Zusammenarbeit mit Grafikern und Musikern an, womit wir gleich beim nächsten Punkt angelangt wären: ''Teamfähigkeit''. Insbesondere bei größeren Projekten, wo auch die Programmierung von mehr als nur einer Person umgesetzt wird, muss das Team gut funktionieren, damit am Ende des Tages ein gutes Spiel produziert werden kann (aber um daran zu denken ist es noch zu früh).
  
Wir hoffen, dass dich diese Einführung nicht zu sehr entmutigt hat. Also, weiter geht's!
+
Wir hoffen, dass dich diese Einführung nicht zu sehr entmutigt hat und du immer noch deine eigenen Spiele programmieren möchtest. Also, weiter geht's!
  
 
== Was ist ein realistisches Ziel? ==
 
== Was ist ein realistisches Ziel? ==
  
Unsere eigenen Erfahrungen und auch zahlreiche Diskussionen im Forum haben uns gelehrt, dass Anfänger vor allem einen Fehler begehen: nämlich sich ''unrealistische Ziele'' zu setzen. Erstens in Bezug auf die Zeit, die man benötigt, um so viel zu lernen, dass man ein eigenes Spiel auf die Beine stellen kann. Zweitens in Bezug auf die Qualität und den Umfang der Spiele, die man erwartet programmieren zu können. Mit der Realität konfrontiert zu werden ist mit Frustration verbunden, die bei so manchem dazu führt, dass er völlig aufgibt. Darum möchten wir dich so früh wie möglich davor warnen. ''Bitte nimm diese Empfehlungen ernst.''
+
[[Datei:Screenshot Space is Key.png|thumb|right|Screenshot des Flash-Spiels [http://armorgames.com/play/10912/space-is-key "Space is Key" bei Armor Games], das nur mit der Leertaste gesteuert wird.]]
  
Du hast vielleicht schon eine konkrete Idee für dein Spiel. Erfahrungsgemäß ist diese erste Idee sehr aufwändig umzusetzen und übersteigt die Fähigkeiten eines Anfängers bei weitem. Typische Ideen für erste Spiele, die mit an Sicherheit grenzender Wahrscheinlichkeit ''fehlschlagen'', beinhalten atemberaubende 3D-Grafik, riesige dynamische Welten oder (Massively) Multiplayer. Wenn deine Idee auch in diese Kategorie fällt oder mit einem aktuellen Topseller-Titel vergleichbar ist, dann vergiss sie für die ersten Jahre. Wirklich. Solche Spiele werden von großen Teams professioneller Spieleentwickler umgesetzt, die jahrelange Erfahrung mitbringen und jeden Tag 8 Stunden oder mehr damit verbringen. Trotz eines großen Teams benötigen Spiele wie "World of Warcraft", "Half-Life 2" oder "GTA" mindestens ein Jahr Entwicklungszeit. Umgerechnet auf einen einzigen unerfahrenen Entwickler würde dieser sein ganzes Leben mit einem solchen Projekt verbringen. Und wer wird in 60 Jahren noch ein Spiel spielen, das für einen Computer aus der heutigen Zeit geschrieben wurde?
+
Unsere eigenen Erfahrungen und auch zahlreiche Diskussionen im Forum haben uns gelehrt, dass Anfänger vor allem einen Fehler begehen: nämlich sich ''unrealistische Ziele'' zu setzen. Erstens in Bezug auf die Zeit, die man benötigt, um so viel zu lernen, dass man ein eigenes Spiel auf die Beine stellen kann. Zweitens in Bezug auf die Qualität und den Umfang der Spiele, die man erwartet programmieren zu können. Dann mit der Realität konfrontiert zu werden ist mit Frustration verbunden, die dazu führen kann, dass man völlig aufgibt. Darum möchten wir dich so früh wie möglich davor warnen. ''Bitte nimm diese Empfehlungen ernst.''
  
Ein gutes Spiel muss gar nicht so aufwändig sein wie die zuvor genannten Spiele. Hast du nicht schon einmal Stunden mit kurzweiligen Flash-Spielen verbracht? Was du dir als erstes Zwischenziel vornehmen solltest, ist ein einfach gehaltenes kleines Spiel, das Spaß macht. Der Spaß am Spiel ist das Wichtigste, nicht die Grafik. Wenn du dich als einzelner Entwickler mit den großen Spielestudios messen willst, wirst du immer verlieren. Also setze dir ein Ziel, das du auch erreichen kannst.
+
Du hast vielleicht schon eine konkrete Idee für dein Spiel. Erfahrungsgemäß ist diese erste Idee sehr aufwändig umzusetzen und übersteigt die Fähigkeiten eines Anfängers bei weitem. Typische Ideen für erste Spiele, die mit an Sicherheit grenzender Wahrscheinlichkeit ''fehlschlagen'', beinhalten atemberaubende 3D-Grafik, riesige dynamische Welten oder (Massively) Multiplayer. Wenn deine Idee auch in diese Kategorie fällt oder du Spiele programmieren möchtest, die mit einem aktuellen Topseller-Titel vergleichbar sind, dann vergiss die Idee für die ersten Jahre. Wirklich. Solche Spiele werden von großen Teams professioneller Spieleentwickler umgesetzt, die jahrelange Erfahrung mitbringen und jeden Tag mindestens 8 Stunden mit der Entwicklung verbringen. Trotz eines großen Teams beanspruchen Spiele wie "World of Warcraft", "Half-Life 2" oder "GTA" etwa fünf Jahre Entwicklungszeit. Selbst Projekte mit kleineren Budgets sind oft zwei bis drei Jahre in Entwicklung. Umgerechnet auf einen einzigen unerfahrenen Entwickler würde dieser sein ganzes Leben an einem solchen Spiel programmieren. Und wer wird in 60 Jahren noch ein Spiel spielen, das für einen Computer aus der heutigen Zeit geschrieben wurde?
 +
 
 +
Also, einen Schritt zurück: Ein gutes Spiel muss gar nicht so aufwändig sein wie die zuvor genannten Spiele. Hast du nicht schon einmal Stunden mit kurzweiligen Flash-Spielen verbracht? Das Gute daran ist: Solche Spiele programmieren normalerweise nur sehr kleine Teams, vielleicht sogar nur ein einzelner Entwickler, und oft nur in der Freizeit. Was du dir also als erstes Zwischenziel vornehmen solltest, ist ein sehr einfach gehaltenes kleines Spiel zu programmieren, das vor allem Spaß macht. Der Spaß am Spiel ist das Wichtigste, nicht die Grafik. Wenn du dich als einzelner Entwickler mit den großen Spielestudios messen willst, wirst du immer verlieren. Also setze dir ein Ziel, das du auch erreichen kannst. Natürlich ist es jetzt schwer für dich zu beurteilen, was realistisch ist. Darum solltest du dir anschauen, wie die ersten Spielprojekte anderer Mitstreiter aussahen. Eine Suche nach ''"my first game"'' mit der Suchmaschine deiner Wahl sollte dir genügend Beispiele liefern, an denen du dich orientieren kannst. Eine weitere Möglichkeit für realistische Ziele sind Spiele, die bei Contests ("Programmierwettbewerben") mit beschränkter Zeit entstehen, wie z. B. dem Ludum Dare oder dem Devmania Overnight Contest. Geht die Entwicklung eines Spiels parallel zum Lernprozess eines Anfänger, sollte aber auch hier mit Entwicklungszeiten von mehreren Monaten gerechnet werden.
  
 
== Die Wahl der Programmiersprache ==
 
== Die Wahl der Programmiersprache ==
  
Um eigene Spiele programmieren zu können, musst du selbstverständlich zunächst ''Programmieren lernen''. Es gibt auch Programme, mit denen man ein Spiel ohne großen Programmieraufwand entwickeln kann. Auf diese wollen wir jedoch hier nicht näher eingehen, da sie den Entwickler meist stark einschränken. Wer sein Spiel wirklich selbst programmiert, hat maximale Freiheit bei der Umsetzung seiner Ideen (was aber auch mit mehr Arbeit verbunden ist).
+
Um eigene Spiele programmieren zu können, musst du selbstverständlich zunächst ''Programmieren lernen''. Es gibt zwar auch Programme, mit denen man ein Spiel ohne großen Programmieraufwand entwickeln kann. Auf diese wollen wir jedoch hier nicht näher eingehen, da sie den Entwickler meist stark einschränken. Wer sein Spiel wirklich selbst programmiert, hat maximale Freiheit bei der Umsetzung seiner Ideen (was aber auch mit mehr Arbeit verbunden ist).
  
Wer sich vornimmt Programmieren zu lernen, der muss sich zuerst für eine ''Programmiersprache'' entscheiden. In dieser Sprache werden die Programme vom Programmierer geschrieben (''Quellcode''), bevor sie in eine für den Computer ausführbare Form übersetzt werden. Heute existiert eine schier unüberschaubare Anzahl von Programmiersprachen, und sie unterscheiden sich teilweise sehr stark voneinander. Für uns als Spieleprogrammierer ist jedoch glücklicherweise nur eine relativ kleine Gruppe von Sprachen interessant.
+
Wer sich vornimmt Programmieren zu lernen, der muss sich zuerst für eine ''Programmiersprache'' entscheiden. In dieser Sprache werden die Programme vom Programmierer geschrieben (''Quellcode''), bevor sie in eine für den Computer ausführbare Form übersetzt werden. Heute existiert eine schier unüberschaubare Anzahl von Programmiersprachen, und sie unterscheiden sich teilweise sehr stark voneinander. Für uns als Spieleprogrammierer ist jedoch glücklicherweise nur eine relativ kleine Gruppe von Sprachen interessant, denn nicht mit allen Programmiersprachen ist es sinnvoll (oder überhaupt möglich), Spiele zu programmieren.
  
Wir wollen uns die unserer Meinung nach wichtigsten dieser in Frage kommenden Sprachen etwas näher ansehen, und zwar unter folgenden Aspekten:
+
Wir wollen uns die unserer Meinung nach wichtigsten dieser in Frage kommenden Sprachen etwas näher ansehen. Mit all diesen Sprachen kann man Spiele programmieren, aber alle haben ihre Eigenheiten. Damit du eine bessere Wahl treffen kannst, findest du zu jeder Sprache ein Stück Beispiel-Quellcode. Dies soll dir nur einen ersten Eindruck der jeweiligen Programmiersprache vermitteln. Es sollte dir jedoch klar sein, dass ein so kleiner Quellcode-Abschnitt nicht repräsentativ für eine ganze Sprache sein kann. Außerdem beleuchten wir jede Sprache unter folgenden Aspekten:
  
;Komfort und Einsteigerfreundlichkeit
+
; Komfort und Einsteigerfreundlichkeit
 
: Die Menge an Quellcode, die man in den verschiedenen Programmiersprachen tippen muss, um gewisse Berechnungen/Algorithmen auszuführen, variiert stark. Was in der einen Sprache mit 10 Zeilen Code erledigt ist, benötigt in der anderen Sprache möglicherweise 50 Zeilen Code. Auch bieten einige Sprachen bestimmte Komfortfunktionen, die andere nicht bieten. Komfortablere Programmiersprachen erleichtern dem Programmierer die Arbeit, was aber nicht selten auch zu langsameren Programmen führt. Der Prozess, der ein Stück Quellcode in ein ausführbares Programm verwandelt, ist auch von Sprache zu Sprache unterschiedlich kompliziert und fehleranfällig.
 
: Die Menge an Quellcode, die man in den verschiedenen Programmiersprachen tippen muss, um gewisse Berechnungen/Algorithmen auszuführen, variiert stark. Was in der einen Sprache mit 10 Zeilen Code erledigt ist, benötigt in der anderen Sprache möglicherweise 50 Zeilen Code. Auch bieten einige Sprachen bestimmte Komfortfunktionen, die andere nicht bieten. Komfortablere Programmiersprachen erleichtern dem Programmierer die Arbeit, was aber nicht selten auch zu langsameren Programmen führt. Der Prozess, der ein Stück Quellcode in ein ausführbares Programm verwandelt, ist auch von Sprache zu Sprache unterschiedlich kompliziert und fehleranfällig.
 
: Häufig sind die komfortableren Programmiersprachen für Einsteiger leichter zu erlernen, da mit ihnen viele "alltägliche" Aufgaben ohne viel Aufwand gelöst werden können und es weniger Fallstricke gibt, über die man stolpern kann.
 
: Häufig sind die komfortableren Programmiersprachen für Einsteiger leichter zu erlernen, da mit ihnen viele "alltägliche" Aufgaben ohne viel Aufwand gelöst werden können und es weniger Fallstricke gibt, über die man stolpern kann.
  
;Verfügbarkeit von Werkzeugen und Bibliotheken
+
; Verfügbarkeit von Werkzeugen und Bibliotheken
: Wer ein Spiel programmiert, der muss nicht das Rad neu erfinden. Für die wichtigsten Aufgabenbereiche wie 2D-/3D-Grafik, Audio, Netzwerk oder die Abfrage von Eingabegeräten wie Maus, Tastatur oder Joystick gibt es schon vorgefertigte ''Bibliotheken''. Diese Bibliotheken bindet man einfach in sein Programm ein und erspart sich damit eine Menge Arbeit. Die Wahl der Programmiersprache sollte auch das Angebot solcher Bibliotheken berücksichtigen. Glücklicherweise sind einige der besonders bekannten Bibliotheken auch für mehrere Sprachen verfügbar.
+
: Wer ein Spiel programmiert, der muss nicht das Rad neu erfinden. Für die wichtigsten Aufgabenbereiche wie 2D-/3D-Grafik, Audio, Netzwerk oder die Abfrage von Eingabegeräten wie Maus, Tastatur oder Joystick gibt es schon vorgefertigte ''Bibliotheken''. Diese Bibliotheken bindet man einfach in sein Programm ein und erspart sich damit eine Menge Arbeit. Die Wahl der Programmiersprache sollte auch das Angebot solcher Bibliotheken berücksichtigen. Glücklicherweise sind einige der besonders bekannten Bibliotheken auch für mehrere Sprachen verfügbar. Auch wenn du am Anfang solche Bibliotheken noch nicht benötigen wirst, sollte dieser Aspekt nicht vernachlässigt werden. Es wäre ungünstig, würdest du eine Programmiersprache lernen und später feststellen, dass sie zur Spieleprogrammierung völlig ungeeignet ist.
: Neben Bibliotheken benötigt man zum Programmieren auch gute ''Werkzeuge/Tools''. Das wichtigste Werkzeug ist eine ''Entwicklungsumgebung''. Dabei handelt es sich im Prinzip um einen Text-Editor, der speziell für die Bearbeitung von Quellcode in der entsprechenden Sprache ausgelegt ist. Eine gute Entwicklungsumgebung unterstützt den Programmierer durch Autovervollständigung beim Tippen, Anzeigen von Informationen über Objekte im Quellcode, bei der Projektverwaltung und bei der Fehlersuche (Debugging).
+
: Neben Bibliotheken benötigt man zum Programmieren auch gute ''Werkzeuge/Tools''. Eines der wichtigsten Werkzeug ist die ''Entwicklungsumgebung''. Dabei handelt es sich im Prinzip um einen Text-Editor, der speziell für die Bearbeitung von Quellcode in der entsprechenden Sprache ausgelegt ist. Eine gute Entwicklungsumgebung unterstützt den Programmierer durch Autovervollständigung beim Tippen, Anzeigen von Informationen über Objekte im Quellcode, bei der Projektverwaltung und bei der Fehlersuche (Debugging).
  
;Effizienz
+
; Effizienz
: Eine schnelle Ausführung des Programms ist für viele Spiele sehr wichtig, da sie 3D-Grafik, Sound, Physik oder künstliche Intelligenz in Echtzeit berechnen müssen und dadurch einen Computer an die Grenzen seiner Leistungsfähigkeit bringen. Für Hobby-Spieleprogrammierer spielt dieser Aspekt normalerweise eine untergeordnete Rolle, da ihre Spiele tendenziell einfacher gehalten sind.
+
: Eine schnelle Ausführung des Programms ist für viele Spiele sehr wichtig, da sie 3D-Grafik, Sound, Physik oder künstliche Intelligenz in Echtzeit berechnen müssen und dadurch einen Computer an die Grenzen seiner Leistungsfähigkeit bringen können. Für Hobby-Spieleprogrammierer spielt dieser Aspekt normalerweise eine untergeordnete Rolle, da ihre Spiele tendenziell einfacher gehalten sind. Außerdem geht mit höherer Leistungsfähigkeit einer Sprache meistens auch eine Nähe zum zugrunde liegenden Computer-System einher. Die dadurch erhöhte Komplexität kann dafür sorgen, dass Programmierfehler leichter entstehen und schwieriger gefunden werden können. Als Spieleentwickler gilt es also eine für das Vorhaben angemessene Balance zwischen Effizienz und Produktivität zu finden.
 
+
Außerdem findest du zu jeder Programmiersprache ein kleines Stück Quellcode als Beispiel. Dies soll dir nur einen ersten Eindruck der jeweiligen Programmiersprache vermitteln. Es sollte dir jedoch klar sein, dass ein so kleiner Quellcode-Abschnitt nicht repräsentativ für eine ganze Sprache sein kann.
+
  
 
=== C++ ===
 
=== C++ ===
  
In der Programmiersprache C++ (ausgesprochen "C Plus Plus") werden fast alle professionellen/kommerziellen Spiele programmiert. Der Grund dafür ist, dass C++ die Programmierung sehr schneller Programme auf einer niedrigen Ebene erlaubt. Letzteres bedeutet, dass es nicht viel "zwischen" dem Programm und der Hardware des Computers gibt. Entsprechend rudimentär und fehleranfällig ist diese Sprache in vielen Bereichen, was sie nicht zur am einfachsten zu erlernenden Programmiersprache macht. Da C++ in der Spieleprogrammierung sehr weit verbreitet ist, hat man hier jedoch die größte Auswahl an Bibliotheken. Weiterhin gibt es genügend Werkzeuge/Entwicklungsumgebungen.
+
[[Datei:Screenshot Visual Studio 2008 C++.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C++-Spielprojekt.]]
  
<sourcecode lang="cpp" tab="4">
+
In der Programmiersprache C++ (ausgesprochen "C Plus Plus") werden fast alle professionellen/kommerziellen Spiele programmiert. Der Grund dafür ist, dass C++ die Programmierung sehr schneller Programme auf einer niedrigen Ebene erlaubt. Letzteres bedeutet, dass es nicht viel "zwischen" dem Programm und der Hardware des Computers gibt. Entsprechend rudimentär und fehleranfällig ist diese Sprache in vielen Bereichen, was sie nicht gerade zur einsteigerfreundlichsten Programmiersprache macht. Mit "fehleranfällig" ist gemeint, dass man leicht etwas falsch machen kann, wenn man nicht gut aufpasst. Zurecht sagt man, dass es nur sehr wenige Menschen gibt, die diese Sprache in all ihren Details vollends verstehen und sie zu nutzen wissen. Da C++ in der Spieleprogrammierung sehr weit verbreitet ist, hat man hier jedoch die größte Auswahl an Bibliotheken. Weiterhin gibt es eine große Zahl an Werkzeugen/Entwicklungsumgebungen.
/************************************************
+
* Dies ist ein einfaches C++-Beispielprogramm. *
+
************************************************/
+
  
 +
<sourcecode lang="cpp" tab="4">
 
// Benötigte Bibliothek einbinden.
 
// Benötigte Bibliothek einbinden.
 
#include <iostream>
 
#include <iostream>
  
 
// Die folgende Funktion berechnet n!, die Fakultät von n.
 
// Die folgende Funktion berechnet n!, die Fakultät von n.
int fak(int n) {
+
int fakultaet(int n) {
 
// Signalisiere einen Fehler, wenn n negativ ist.
 
// Signalisiere einen Fehler, wenn n negativ ist.
 
if(n < 0) throw std::domain_error("Fakultät für negative Zahlen ist nicht definiert!");
 
if(n < 0) throw std::domain_error("Fakultät für negative Zahlen ist nicht definiert!");
 
 
 
if(n == 0) return 1; // 0! = 1
 
if(n == 0) return 1; // 0! = 1
else return n * fak(n - 1); // Rekursion: n! = n * (n - 1)!
+
else return n * fakultaet(n - 1); // Rekursion: n! = n * (n - 1)!
 
}
 
}
  
Zeile 79: Zeile 77:
 
try {
 
try {
 
// Fakultät der Zahl ausgeben.
 
// Fakultät der Zahl ausgeben.
std::cout << "Die Fakultät von " << zahl << " ist: " << fak(zahl) << std::endl;
+
std::cout << "Die Fakultät von " << zahl << " ist: " << fakultaet(zahl) << std::endl;
 
}
 
}
 
catch(const std::exception& e) {
 
catch(const std::exception& e) {
Zeile 92: Zeile 90:
 
=== C# ===
 
=== C# ===
  
C# (ausgesprochen "C Sharp") ist mit C++ verwandt und erlaubt ein komfortableres Programmieren. Das Angebot an Bibliotheken und Werkzeugen ist nicht so umfangreich wie das für C++, was auch daran liegt, dass die Sprache viel jünger ist. Die erreichbare Geschwindigkeit reicht zwar nicht an die von C++-Programmen heran, sollte jedoch auch für ambitioniertere Spieleprojekte kein Problem darstellen.
+
[[Datei:Screenshot Visual Studio 2008 CSharp.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C#-Projekt.]]
 +
 
 +
C# (ausgesprochen "C Sharp") ist mit C++ verwandt und erlaubt ein komfortableres Programmieren. Es handelt sich bei C# um eine ".NET-Sprache" (wenn du irgendwo etwas von .NET liest, dann ist damit unter Anderem auch C# gemeint). Das Angebot an Bibliotheken und Werkzeugen ist nicht so umfangreich wie das für C++, was auch daran liegt, dass die Sprache viel jünger ist. Die erreichbare Geschwindigkeit reicht zwar nicht an die von C++-Programmen heran, sollte jedoch auch für ambitioniertere Spieleprojekte kein Problem darstellen. Wenn du eine Xbox besitzt und für diese eigene Spiele programmieren möchtest, dann solltest du C# lernen. Zudem ist C# die Programmiersprache der Wahl für die Spieleentwicklungsumgebung ("Engine") [http://unity3d.com/ Unity], die man ambitionierten Anfängern oft empfiehlt.
 +
 
 +
<sourcecode lang="csharp">
 +
// Benötigte Bibliothek einbinden.
 +
using System;
 +
 
 +
namespace CSharpBeispielprogramm
 +
{
 +
    class Program
 +
    {
 +
        // Die Hauptfunktion "Main":
 +
        // Hier startet das eigentliche Programm.
 +
        static void Main(string[] args)
 +
        {
 +
            // Begrüßung
 +
            Console.WriteLine("Hallo Spieleprogrammierer!");
 +
            Console.Write("Gib eine Zahl ein! ");
 +
 
 +
            // Zahl einlesen
 +
            int zahl = int.Parse(Console.In.ReadLine());
 +
 
 +
            // Quadrat der Zahl ausgeben.
 +
            Console.WriteLine("Das Quadrat von {0} ist: {1}", zahl, zahl * zahl);
 +
 
 +
            try
 +
            {
 +
                // Fakultät der Zahl ausgeben.
 +
                Console.WriteLine("Die Fakultät von {0} ist: {1}", zahl, fakultät(zahl));
 +
            }
 +
            catch (Exception e)
 +
            {
 +
                // Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.
 +
                Console.WriteLine("Fehler: {0}", e);
 +
            }
 +
        }
 +
 
 +
        // Die folgende Funktion berechnet n!, die Fakultät von n.
 +
        private static int fakultät(int n)
 +
        {
 +
            // Signalisiere einen Fehler, wenn n negativ ist.
 +
            if (n < 0) throw new ArgumentOutOfRangeException("n", "Darf nicht negativ sein!");
 +
 
 +
            if (n == 0) return 1;              // 0! = 1
 +
            else return n * fakultät(n - 1);    // Rekursion: n! = n * (n - 1)!
 +
        }
 +
    }
 +
}
 +
</sourcecode>
  
 
=== Java ===
 
=== Java ===
  
Java ist C# sehr ähnlich. Für die Spieleprogrammierung auf dem PC ist diese Sprache jedoch nicht ganz so attraktiv, da es weniger Bibliotheken gibt. Möchtest du jedoch Spiele für Android-Smartphones entwickeln, so führt kein Weg an Java vorbei, da Android-Apps in dieser Sprache programmiert werden.
+
[[Datei:Screenshot Eclipse Java.png|thumb|right|Screenshot der Entwicklungsumgebung ''Eclipse'' mit einem Java-Projekt.]]
 +
 
 +
Die schon etwas ältere Programmiersprache Java hat C# maßgeblich beeinflusst. Die beiden Sprachen sind sich daher recht ähnlich. Während Java für die Entwicklung von betrieblichen Anwendungen sehr populär geworden ist, kann man die Sprache bezüglich Spieleentwicklung für den PC eher als Außenseiter bezeichnen. Möchtest du jedoch für Android-Smartphones deine eigenen Apps oder Spiele programmieren, dann führt kaum ein Weg an Java vorbei, da Android-Apps fast ausschließlich in dieser Sprache programmiert werden.
 +
 
 +
<sourcecode lang="java" tab="4">
 +
// Benötigte Bibliothek einbinden.
 +
import java.io.*;
 +
 
 +
public class JavaBeispielprogramm {
 +
// Die folgende Funktion berechnet n!, die Fakultät von n.
 +
private static int fakultät(int n) throws Exception {
 +
// Signalisiere einen Fehler, wenn n negativ ist.
 +
if(n < 0) throw new Exception("n darf nicht negativ sein!");
 +
 +
if(n == 0) return 1; // 0! = 1
 +
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!
 +
}
 +
 +
// Die Hauptfunktion "main":
 +
// Hier startet das eigentliche Programm.
 +
public static void main(String[] args) throws Exception {
 +
// Begrüßung
 +
System.out.println("Hallo Spieleprogrammierer!");
 +
System.out.print("Gib eine Zahl ein: ");
 +
 
 +
// Zahl einlesen.
 +
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 +
int zahl = Integer.parseInt(in.readLine());
 +
 +
// Quadrat der Zahl ausgeben.
 +
System.out.println("Das Quadrat von " + zahl + " ist: " + (zahl * zahl));
 +
 +
try {
 +
// Fakultät der Zahl ausgeben.
 +
System.out.println("Die Fakultät von " + zahl + " ist: " + fakultät(zahl));
 +
}
 +
catch(Exception e) {
 +
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.
 +
System.out.println("Fehler: " + e.toString());
 +
}
 +
}
 +
}
 +
</sourcecode>
  
 
=== Python ===
 
=== Python ===
 +
 +
[[Datei:Screenshot Aptana Studio 3 Python.png|thumb|right|Screenshot der Entwicklungsumgebung ''Aptana Studio 3'' mit einem Python-Projekt.]]
 +
 +
[[Datei:Screenshot IDLE.png|thumb|right|Screenshot der minimalistischen Entwicklungsumgebung ''IDLE'' für Python.]]
 +
 +
Python unterscheidet sich nicht nur äußerlich stark von den bisher gezeigten Sprachen. Ein großer Unterschied besteht darin, dass Python [http://de.wikipedia.org/wiki/Dynamische_Typisierung dynamische Typisierung] und [http://de.wikipedia.org/wiki/Duck-Typing Duck-Typing] verwendet. Insbesondere durch die dynamische Typisierung sind Python-Programme tendenziell langsamer als solche, die in C++, C# oder Java geschrieben sind (vermutlich kannst du mit diesen technischen Details noch nicht viel anfangen, aber falls es dich interessiert, kannst du die oben verlinkten Seiten durchlesen). Python-Programme kommen dafür jedoch mit relativ wenig Quellcode aus. Aufgrund seiner Unkompliziertheit ist Python für Anfänger als erste Programmiersprache sehr attraktiv. Werkzeuge und Bibliotheken zur Spieleprogrammierung sind in genügender Menge verfügbar.
 +
 +
<sourcecode lang="python">
 +
# Die folgende Funktion berechnet n!, die Fakultät von n.
 +
 +
def fakultaet(n):
 +
    # Signalisiere einen Fehler, wenn n negativ ist.
 +
    if n < 0: raise ValueError("n darf nicht negativ sein!")
 +
    elif n == 0: return 1            # 0! = 1
 +
    else: return n * fakultaet(n - 1) # Rekursion: n! = n * (n - 1)!
 +
 +
# Hier startet das eigentliche Programm.
 +
print("Hallo Spieleprogrammierer!") # Begrüßung
 +
zahl = input("Gib eine Zahl ein: ") # Zahl einlesen.
 +
 +
# Quadrat der Zahl ausgeben.
 +
print("Das Quadrat von %d ist: %d" % (zahl, zahl * zahl))
 +
try:
 +
    # Fakultät der Zahl ausgeben.
 +
    print("Die Fakultät von %d ist: %d" % (zahl, fakultaet(zahl)))
 +
except Exception as e:
 +
    # Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.
 +
    print("Fehler: %s" % e)
 +
</sourcecode>
  
 
== Lernen einer Programmiersprache ==
 
== Lernen einer Programmiersprache ==
  
Stelle dir beim Lernen ''nicht'' ständig die Frage, wie du bestimmte Aspekte deines Spiels umsetzen kannst. Denke nicht zu zielgerichtet, sonst verlierst du möglicherweise den Blick für das Wesentliche. Gerade am Anfang wirst du sehr viele Dinge in kurzer Zeit lernen, und erst später wirst du merken, wofür sie eigentlich nützlich sind. Fingest du sofort damit an ein Spiel zu programmieren, so wärest du ständig damit beschäftigt wieder von vorne anzufangen, weil sich dein Wissen kontinuierlich erweitert. Also stelle deine Idee erst einmal zurück, während du dich noch durch die Grundlagen der Programmierung arbeitest. Dafür solltest du &mdash; je nach deinen Fähigkeiten und der Menge an Zeit, die du dafür aufbringen möchtest &mdash; mit bis zu einem Jahr rechnen.
+
Zugegeben: Eigentlich hast du noch nicht genügend Informationen, um dich zu diesem Zeitpunkt für eine der vorgestellten Sprachen zu entscheiden. Trotzdem musst du eine Wahl treffen. Wie bereits gesagt: Mit all diesen Sprachen kann man Spiele programmieren. Das schlimmste, was passieren kann, ist dass dir die ausgesuchte Sprache nicht gefällt. Dann versuchst du es mit einer anderen.
 +
 
 +
Wenn du dich für eine Sprache entschieden hast, ist es an der Zeit, dass du anfängst sie zu lernen. Dieses Wiki ist allerdings nicht für diesen Zweck gedacht. Es gibt genügend Tutorials und Bücher, die sich an Programmieranfänger richten. Du findest weiter unten für jede der kurz vorgestellten Sprachen einige Lektüreempfehlungen, aufgeteilt in ''Bücher'' und ''Online-Tutorials''. Ein Buch kostet zwar Geld, aber dafür hast du etwas Handfestes. Bei einem Buch kann man auch von einer gewissen Mindestqualität ausgehen. Außerdem könnte beim Lernen mit einem Buch die Gefahr geringer sein, dass du abbrichst, denn schließlich hast du Geld dafür bezahlt. Es liegt bei dir, ob du den Lektüreempfehlungen folgst oder dir lieber selbst etwas suchst. Aber bevor du anfängst, möchten wir dir noch ein paar Tipps mit auf den Weg geben:
 +
 
 +
* Versuche möglichst regelmäßig zu lernen. Nur so bleibst du am Ball.
 +
 
 +
* Plane genügend Zeit ein, und versuche deine Motivation aufrecht zu erhalten. Hetze dich nicht! Um das Programmieren zu erlernen, solltest du – je nach deinen schon vorhandenen Kenntnissen und der Menge an Zeit pro Tag, die du dafür aufbringen möchtest – mit bis zu einem Jahr rechnen.
 +
 
 +
* Stelle sicher, dass du die Inhalte eines Kapitels wirklich verstanden hast. Oft liest man etwas, was einem logisch und sinnvoll erscheint, aber man ist später nicht in der Lage, die Inhalte zu reproduzieren oder anzuwenden. Du solltest dich aber nicht auf ein Thema versteifen. Wenn du eine Nacht darüber geschlafen hast und immer noch Probleme hast, kannst du ruhig weiter lernen. Versuche später aber unbedingt nochmal es zu verstehen. Viele Themen erfordern Gefühl für das Programmieren, das du aber nur durch Übung bekommst. Zur Not helfen Erklärungen aus anderen Tutorials und Büchern. Oder du stellst eine Frage in einem Programmierforum (z.B. in einem [http://www.spieleprogrammierer.de/3-spieleentwicklung-und-programmierung/ dieser Foren]). Versuche nicht, ein Buch oder ein Tutorial einfach nur möglichst schnell von vorne bis hinten durchzulesen. Das bringt dir nichts.
 +
 
 +
* Bearbeite eventuell angebotene Übungsaufgaben, und vergleiche sie ggf. mit den vom Autor vorgeschlagenen Lösungen.
 +
 
 +
* Stelle dir beim Lernen ''nicht'' ständig die Frage, wie du bestimmte Aspekte deines Spiels programmieren kannst. Denke nicht zu zielgerichtet, sonst entgehen dir vielleicht wichtige Konzepte, für die du dir keine unmittelbare Anwendung in deinem Spiel vorstellen kannst. Denke also nicht, dass du dieses oder jenes nicht benötigen wirst und deshalb nicht verstehen musst, denn das kannst du zu diesem Zeitpunkt kaum beurteilen. Fast jedes Feature oder Konzept einer Programmiersprache lässt sich auf die eine oder andere Weise in der Spieleprogrammierung sinnvoll einsetzen. Gerade am Anfang wirst du sehr viele Dinge in kurzer Zeit lernen, und erst später wirst du merken, wofür sie eigentlich nützlich sind. Sicherlich gibt es Ausnahmen. So wird in vielen Tutorials oder Büchern beispielsweise das Thema Datenbanken behandelt. Datenbanken sind für größere Spiele sicherlich eine interessante Sache und werden dort auch eingesetzt, aber für kleine Hobbyprojekte sind sie in der Regel verzichtbar.
 +
 
 +
* Fange bitte nicht sofort damit an ein Spiel zu programmieren, noch während du Programmieren lernst. Anderenfalls bist du ständig damit beschäftigt wieder von vorne anzufangen, weil sich dein Wissen kontinuierlich erweitert und du immer wieder bessere Methoden für die Lösung von Problemen kennenlernst. Also stelle deine Idee erst einmal zurück, während du dich noch durch die Grundlagen der Programmierung arbeitest. Schreibe zur Übung lieber kleine einfache Programme, die sich auf die jeweils neu gelernten Dinge fokussieren.
 +
 
 +
=== Lektüre für C++ ===
 +
 
 +
<xh4>C++-Bücher</xh4>
 +
 
 +
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}: Dieses Buch vermittelt die wichtigsten Grundlagen der Programmiersprache C++ und richtet sich dabei speziell an angehende Spieleprogrammierer. Im Buch wird nach der Vermittlung der C++-Grundlagen ein einfaches 2D-Spiel Schritt für Schritt entwickelt. Am Ende erhält der Leser noch einige Tipps, wie er nach der Lektüre dieses Buches weitermachen sollte, und wie er die Angebote des Internets wie Communitys/Foren richtig nutzen kann.
 +
 
 +
<xh4>C++-Tutorials</xh4>
 +
 
 +
* [http://www.cpp-tutor.de/cpp/hinweise.html C++-Kurs von Wolfgang Schröder]: Eine ausführliche Einführung in C++ mit vielen Übungen am Ende der jeweiligen Kapitel (inklusive Lösungsvorschläge).
 +
 
 +
* [http://de.wikibooks.org/wiki/C%2B%2B-Programmierung Wikibook "C++-Programmierung"]: Ein Online-Buch, das in die Programmierung mit C++ einführt. Es enthält ebenfalls Übungsaufgaben und Lösungsvorschläge. Derzeit (28. September 2011) ist es jedoch noch nicht komplett fertiggestellt. Die Grundlagenkapitel sind aber vollständig.
 +
 
 +
* Weitere Tutorials findest du [http://www.c-plusplus.de/cms/modules.php?op=modload&name=Downloads&file=index&req=viewsdownload&sid=2 auf c++.de].
 +
 
 +
=== Lektüre für C# ===
 +
 
 +
<xh4>C#-Bücher</xh4>
 +
 
 +
* {{Amazon|3836228149|"Einstieg in Visual C# 2013: Ideal für Programmieranfänger geeignet" von Thomas Theis}}: Der Leser erlernt auf 580 Seiten den Umgang mit der Programmiersprache C# und der Windows Presentation Foundation (WPF), mit dem man grafische Windows-Anwendungen entwickeln kann.
 +
 
 +
<xh4>C#-Tutorials</xh4>
 +
 
 +
* [http://www.csharpme.de/ "Das etwas andere C#-Tutorial" von Mathias Hauser]: Ein Tutorial, das sich an absolute Programmieranfänger richtet, die mit C# ihre ersten Schritte machen wollen.
 +
 
 +
* [http://www.homeandlearn.co.uk/csharp/csharp.html "Visual C# .NET Programming" von Home and Learn]: Sehr umfangreiches englischsprachiges Tutorial, das bei den Grundlagen beginnt, später aber auch fortgeschrittene Themen wie Datenbanken, Benutzeroberflächen und Grafik behandelt.
 +
 
 +
=== Lektüre für Java ===
 +
 
 +
<xh4>Java-Bücher</xh4>
 +
 
 +
* {{Amazon|3836228629|"Programmieren lernen mit Java: Aktuell zu Java 8 - Keine Vorkenntnisse erforderlich" von Hans-Peter Habelitz}}: Dieses Buch richtet sich an Einsteiger ohne jegliche Programmiererfahrung. Im Buch gibt es viele Übungsaufgaben sowie Musterlösungen.
 +
 
 +
* [http://openbook.galileocomputing.de/javainsel/ "Java ist auch eine Insel" von Christian Ullenboom]: Ein populäres, auch kostenlos online lesbares Buch für Java-Einsteiger und Fortgeschrittene gleichermaßen. Neben der Behandlung der Sprache Java gibt es kompakte Einführungen in Spezialthemen.
 +
 
 +
<xh4>Java-Tutorials</xh4>
 +
 
 +
* [http://www.gailer-net.de/tutorials/java5/ "Bradley Kjells interaktives Java Tutorial" (übersetzt von Heinrich Gailer)]: Ein ausführliches Tutorial, das bei der Erklärung der grundlegenden Funktionsweise eines Computers/Prozessors beginnt und dann einen guten Einstieg in die Programmierung mit Java bietet. Zu jedem Kapitel gibt es ein Quiz, Programmieraufgaben oder einen Test.
 +
 
 +
* [http://www.programmierkurs-java.de/ "Programmierkurs Java" von Dr.-Ing. Dietrich Boles]: Ein kostenloser Online-Kurs für Java. Die Materialien stammen ursprünglich aus der Lehrveranstaltung "Programmierkurs Java", die seit vielen Jahren von Dr.-Ing. Dietrich Boles am Department für Informatik der Universität Oldenburg durchgeführt wird.
 +
 
 +
=== Lektüre für Python ===
 +
 
 +
<xh4>Python-Bücher</xh4>
 +
 
 +
* {{Amazon|3836228610|"Einstieg in Python: Ideal für Programmieranfänger geeignet" von Thomas Theis}}: Ein relativ kompaktes Buch für Einsteiger, das die Grundlagen, aber auch fortgeschrittene Themen wie Benutzeroberflächen und Datenbanken unter Python abdeckt.
 +
 
 +
<xh4>Python-Tutorials</xh4>
 +
 
 +
* [http://docs.python.org/tutorial/ "The Python Tutorial"]: Das offizielle, sehr umfangreiche Python-Tutorial.
 +
 
 +
* [https://py-tutorial-de.readthedocs.org/de/python-3.3/ "Das Python-Tutorial"]: Eine deutsche Übersetzung des offiziellen Python-Tutorials.
 +
 
 +
== Auswahl einer passenden Bibliothek ==
 +
 
 +
Hast du dir schon eine Programmiersprache ausgesucht und mindestens ein Buch oder Tutorial durchgearbeitet, die Inhalte ''vollständig verstanden'' und mit einigen einfachen Programmen erste ''Praxiserfahrungen gesammelt''? Dann kann es weitergehen.
 +
 
 +
Wenn du ein Spiel mit Grafik programmieren möchtest (und davon gehen wir einmal aus), dann kommst du um den Einsatz einer zusätzlichen Bibliothek in den meisten Fällen nicht herum. C++ und seine Standardbibliothek bieten beispielsweise von Haus aus keinerlei Möglichkeiten zur Darstellung von Grafik, zum Abfragen der Tastatur (nur sehr rudimentär) oder zum Abspielen von Sound und Musik. Bei den anderen Programmiersprachen sieht es schon ein wenig besser aus, allerdings empfiehlt es sich trotzem, eine Bibliothek einzusetzen, die speziell für die Entwicklung von Spielen (oder allgemein von Multimedia-Anwendungen) konzipiert ist.
 +
 
 +
=== Eine kleine Übersicht ===
 +
 
 +
Im Folgenden haben wir einige Empfehlungen zusammengestellt, welche Bibliotheken du dir anschauen solltest. Diese sind primär für 2D-Grafik ausgelegt. An 3D-Grafik solltest du erst später denken. Alle Bibliotheken sind kostenlos verfügbar, und viele von ihnen können mit mehr als nur einer Programmiersprache genutzt werden. Die meisten sind für verschiedene Betriebssysteme verfügbar, und man kann mit jeder dieser Bibliotheken Spiele programmieren. Sie unterscheiden sich jedoch in ihrer Architektur und ihrem Abstraktionsgrad. Manche Bibliotheken bieten nur sehr grundlegende Funktionalität an, während andere bereits einfache Klassen für Spielobjekte mitbringen, auf den man aufbauen kann.
 +
 
 +
{| class="wikitable"
 +
|-
 +
! Bibliothek !! Sprachen !! Kurzbeschreibung !! Weiterführende Links
 +
|-
 +
| [http://www.sfml-dev.org/ SFML] (Simple and Fast Multimedia Library) || C++, C#, Python || Eine moderne objektorientierte Multimedia-Bibliothek, die eine große Menge an Features bietet und einen schnellen Einstieg ermöglicht. ||
 +
* [http://www.sfml-dev.org/tutorials/ Tutorials]
 +
* [http://www.sfml-dev.org/documentation/ Dokumentation]
 +
* [https://www.spieleprogrammierer.de/wiki/SFML_Einsteiger-Tipps SFML Einsteiger-Tipps]
 +
|-
 +
| [http://www.libsdl.org/ SDL] (Simple DirectMedia Layer) || C++, C#, Java, Python || Eine Bibliothek, die grundlegende Funktionalität wie Grafikausgabe, Audio, Eingabe und Netzwerk bereitstellt. ||
 +
* [[SDL-Tutorial]]
 +
* [http://wiki.libsdl.org/moin.cgi/SDL1.2Tutorials Weitere Tutorials]
 +
* [http://wiki.libsdl.org/FrontPage Dokumentation]
 +
|-
 +
| [http://pygame.org/ Pygame] || Python || Pygame basiert auf SDL, bietet aber noch zusätzliche Funktionalität. ||
 +
* [[Pygame-Tutorial]]
 +
* [http://www.pygame.org/docs/ Dokumentation und weitere Tutorials]
 +
|-
 +
| [http://alleg.sourceforge.net/ Allegro] || C++, C#, Python || Eine robuste Bibliothek für die Spieleprogrammierung, die noch aus der MS-DOS-Zeit stammt, aber mittlerweile stark modernisiert wurde. ||
 +
* [https://liballeg.org/docs.html Tutorials]
 +
* [https://liballeg.org/a5docs/trunk/ Dokumentation]
 +
|-
 +
| [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] || C# || XNA ist eine umfangreiche Bibliothek für C#, mit der man sowohl PC- und Windows Phone 7- als auch Xbox-Spiele programmieren kann. ||
 +
* [http://msdn.microsoft.com/en-us/bb188199 Tutorials und Video-Tutorials]
 +
* [http://msdn.microsoft.com/en-us/library/bb200104.aspx Weitere Einführungen und Dokumentation]
 +
|-
 +
| [http://hge.relishgames.com/ HGE] || C++ || Eine Windows-spezifische Bibliothek, mit der man relativ schnell erste Ergebnisse erzielen kann. Sie bietet auch fortgeschrittene Features wie Partikelsysteme und kommt mit einigen Tools. Die Bibliothek wird zwar scheinbar nicht mehr weiter entwickelt, funktioniert aber auch heute noch hervorragend. ||
 +
* [http://hge.relishgames.com/doc/?tutorials__main.html Tutorials]
 +
* [http://hge.relishgames.com/doc/ Dokumentation]
 +
|-
 +
| [http://slick.cokeandcode.com/ Slick] || Java || Slick stellt eine einfache Schnittstelle für die Entwicklung von 2D-Spielen mit Java bereit. Slick bietet auch fortgeschrittene Features wie Partikelsysteme und kommt mit einigen Tools. ||
 +
* [http://slick.cokeandcode.com/wiki/doku.php Dokumentation und Tutorials]
 +
|-
 +
| [http://libgdx.badlogicgames.com/ LibGDX] || Java || LibGDX ist eine Spielentwicklungsbibliothek für Java, mit der Spiele sowohl für Desktop- als auch für Android-Systeme erstellt werden können. Die Entwicklung von 2D-Spielen wird dabei besonders unterstützt, 3D-Spieleentwicklung ist allerdings auch möglich. LibGDX bietet ebenfalls fortgeschrittene Features wie Partikelsysteme und kommt mit einigen Tools. ||
 +
* [http://code.google.com/p/libgdx/wiki/TableOfContents?tm=6 Dokumentation und Tutorials]
 +
|}
 +
 
 +
=== Erste Schritte mit einer Bibliothek zur Spieleprogrammierung ===
 +
 
 +
Nachdem du dich nun in eine Programmiersprache eingearbeitet und dich für eine Bibliothek entschieden hast, solltest du den Umgang mit dieser Bibliothek üben. In der Tabelle sind jeweils weitere Links angegeben. Dort findest du die Dokumentation der jeweiligen Bibliothek und Tutorials. Mit deren Hilfe solltest du relativ schnell in der Lage sein, einfache Grafiken anzuzeigen, Eingabegeräte wie Maus, Tastatur, Joystick und Game-Controller abzufragen und Sound/Musik abzuspielen. Wenn du diese Grundlagen beherrschst, dann steht dir (technisch gesehen) nichts mehr im Weg, eigene Spiele zu programmieren.
 +
 
 +
== Spiele programmieren ==
 +
 
 +
Wenn du es bis hier hin geschafft hast, hast du schon einen langen Weg hinter dir. Nun, da du Programmiererfahrungen gesammelt und du eine unterstützende Bibliothek an deiner Seite hast, kann der eigentliche Spaß beginnen.
 +
 
 +
=== Ein simples Spiel zum Aufwärmen ===
 +
 
 +
Noch solltest du nicht versuchen, deine ursprüngliche Spielidee umzusetzen (es sei denn, sie war wirklich sehr unkompliziert). Versuche dir stattdessen Schritt für Schritt Vorgehensweisen und Methoden anzueignen, die dir bei der Spieleprogrammierung helfen. Fange beispielsweise damit an, eine einfache Spielfigur mit der Tastatur oder der Maus über den Bildschirm zu bewegen. Wenn du es etwas anspruchsvoller willst, dann sorge dafür, dass die Bewegung sanft abklingt, nachdem die entsprechende Taste losgelassen wurde. Als Nächstes könntest du Gegner einbauen, die irgendwo erscheinen und sich durch das Spielfeld bewegen. Nun, da es mehr als nur ein Spielobjekt gibt, wirst du dir Gedanken darüber machen müssen, wie du diese Objekte in deinem Programm repräsentieren und verwalten kannst (beispielsweise mit einer Klasse für Spielobjekte und davon abgeleiteten Klassen für die verschiedenen Arten von Objekten sowie einer Liste aller vorhandenen Spielobjekte). Auch wirst du feststellen wollen, ob der Spieler von einem Gegner berührt wird, und schon kommst du mit dem Thema Kollisionserkennung in Berührung. Danach soll der Spieler vielleicht eine Waffe bekommen, um die Gegner zu beseitigen. Dazu integrierst du noch ein paar passende Sounds und einen Punktezähler, und schon ist ein erstes spielbares Spiel fertig. Über Features wie eine Bestenliste, Power-Ups, verschiedene Arten von Gegnern und Waffen könnte man ebenfalls noch nachdenken.
 +
 
 +
Solch ein Projekt (oder etwas Vergleichbares) ist zwar nicht besonders innovativ, aber als erstes eigenes kleines Spiel eignet es sich hervorragend. Der technische Anspruch ist gering, und am Ende wirst du mit Sicherheit sehr stolz auf dich und dein Spiel sein. Jeder Spieleprogrammierer erinnert sich sicherlich noch an sein erstes Spiel und an das damit verbundene gute Gefühl, etwas eigenes erschaffen zu haben. Auch wenn so ein erstes Spiel andere Spieler vermutlich "nicht gerade vom Hocker reißt" – lass dich davon nicht verunsichern. Jeder hat einmal klein angefangen, und der gewöhnliche Spieler hat gar keine Vorstellung davon, wie viel Aufwand es bedeutet, ein Spiel zu programmieren.
 +
 
 +
Eine gute Idee ist es, dein erstes Spiel der Spieleprogrammierer-Community ([https://www.spieleprogrammierer.de/12-projektvorstellungen-und-stellenangebote/ Forum zur Projektvorstellung]) vorzustellen. Die Community-Mitglieder sind sowohl Spieler als auch Programmierer/Entwickler. Sie können dir daher sehr wertvolles Feedback geben: einerseits zum Spiel an sich (Gameplay, Grafik, Sound, Steuerung, Schwierigkeitsgrad, ...), andererseits zur programmiertechnischen Umsetzung. Damit Letzteres möglich ist, solltest du auch den Quellcode veröffentlichen. Hier solltest du dich ''kritikfähig'' zeigen, denn es ist nicht unwahrscheinlich, dass buchstäblich jede Zeile deines Codes auseinander genommen wird. Das ist jedoch völlig normal, denn Programmieren ist hauptsächlich eine Erfahrungssache. Je mehr du programmierst, desto mehr wirst du erkennen, wie du gewisse Dinge schöner, kürzer, schneller und eleganter lösen kannst. Die erfahreneren Programmierer werden darum sehr viele Stellen in deinem Code erkennen, die du besser machen könntest, und dich darauf hinweisen. Es ist wichtig, dass du diese Kritik nicht persönlich nimmst, sondern versuchst daraus etwas zu lernen, so dass du es im nächsten Spiel besser machen kannst.
 +
 
 +
=== Kritischer Rückblick und die nächsten Spiele ===
 +
 
 +
Nach dem ersten Spiel kommt das zweite. Versuche diesmal technisch etwas anspruchsvolleres umzusetzen und aus den Fehlern und Schwächen des ersten Spiels zu lernen. Schau dir dazu dein erstes Spiel und seinen Quellcode noch einmal genau an, und lies noch einmal die Kommentare, die du dazu erhalten hast.
 +
 
 +
* Welche Aspekte des Spiels haben Spaß gemacht, welche nicht? Woran könnte das gelegen haben?
 +
* War das Spiel zu schwer oder zu leicht?
 +
* War die Steuerung intuitiv?
 +
* Wusste man immer, was man zu tun hat?
 +
* Findest du Stellen im Code, an denen du dich wiederholst? Das ist eigentlich immer ein Zeichen dafür, dass hier etwas nicht optimal ist ([http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself DRY-Prinzip]).
 +
 
 +
Nachdem du eine Reihe kleinerer Spiele entwickelt hast, die im Optimalfall jeweils komplexer, spaßiger und besser umgesetzt sind als ihre Vorgänger, kannst du noch einmal darüber nachdenken, was eigentlich dein "Traumprojekt" ist, und ob du schon bereit dafür bist, es in Angriff zu nehmen. Je mehr kleinere Spiele du entwickelst, desto besser kannst du den Arbeitsaufwand abschätzen.
 +
 
 +
=== Wie geht es weiter? ===
 +
 
 +
Nun ist der Punkt erreicht, wo dieser Artikel endet. Es ist schwierig, hier noch allgemeine nützliche Hinweise zu geben. Du solltest das Wiki und das Forum benutzen, um dich über speziellere Themen zu informieren: Wie plant man ein größeres Projekt? Wie findet man weitere Programmierer, Grafiker, Audiodesigner, Musiker, ...? Wie organisiert man sich als Team? Wie kann man einen bestimmten grafischen Effekt am besten umsetzen?
 +
 
 +
''Viel Erfolg!''
 +
 
 +
[[Kategorie:Tutorial]]
 +
[[Kategorie:Für Einsteiger]]
 +
[[Kategorie:C++]]
 +
[[Kategorie:C-Sharp]]
 +
[[Kategorie:Java]]
 +
[[Kategorie:Python]]

Aktuelle Version vom 3. März 2019, 20:19 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge