https://www.spieleprogrammierer.de/w/index.php?title=Spezial:Beitr%C3%A4ge/David_Scherfgen&feed=atom&deletedOnly=&limit=50&target=David_Scherfgen&topOnly=&year=&month=Spieleprogrammierer-Wiki - Benutzerbeiträge [de]2024-03-28T10:55:17ZAus Spieleprogrammierer-WikiMediaWiki 1.17.5https://www.spieleprogrammierer.de/wiki/MediaWiki:Discord-chatMediaWiki:Discord-chat2023-09-22T09:28:11Z<p>David Scherfgen: </p>
<hr />
<div>Discord</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:SidebarMediaWiki:Sidebar2023-09-22T09:26:19Z<p>David Scherfgen: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage-description<br />
** forum-url|forum<br />
** discord-chat-url|discord-chat<br />
** Spezial:Alle Seiten|allarticles<br />
** Spezial:Kategorien|categories<br />
** SpproWiki:Wunschliste|Wunschliste<br />
** Link-Sammlung|Link-Sammlung<br />
** Kategorie:Tutorial|Tutorials<br />
** recentchanges-url|recentchanges<br />
** helppage|help<br />
* TOOLBOX</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2023-09-22T09:25:26Z<p>David Scherfgen: </p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://discord.gg/yqRX67X Discord]''': Der Discord-Server zur Website.<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2023-09-22T09:24:45Z<p>David Scherfgen: </p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://discord.gg/yqRX67X Discord-Chat]''': Der Discord-Server zur Website.<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2023-09-22T09:24:17Z<p>David Scherfgen: </p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://discord.gg/yqRX67X Discord-Chat]''': Der Discord-Server zur Website.<br />
* '''[https://www.spieleprogrammierer.de/index.php?page=MibbitChat IRC-Chat]''': Der IRC-Channel zur Website: <tt>#sppro</tt> auf [http://www.euirc.net/ euIRC].<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Link-SammlungLink-Sammlung2021-03-14T18:43:26Z<p>David Scherfgen: /* Frameworks für Multimedia und Spieleentwicklung */</p>
<hr />
<div>In diesem Artikel sollen Links gesammelt werden, die für die Spieleentwicklung nützlich sind.<br />
<br />
== Webseiten und Tutorials zur Spieleentwicklung ==<br />
<br />
* [http://www.gamedev.net/ GameDev.net] Große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gamasutra.com/ Gamasutra] Weitere große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gpwiki.org/ Game Programming Wiki] Englischsprachiges Wiki zum Thema Spieleentwicklung<br />
* [http://gafferongames.com/ Game Development + Game Programming Tutorials von Glenn Fiedler] Hochqualitative Reihe von Artikeln und Tutorials zu technischen Aspekten der Spieleprogrammierung<br />
* [http://www.ludism.org/gamedesign/ Game Design Wiki] ist ein nicht-technisches Wiki zum Thema Game-Design<br />
* [http://chrishecker.com/ Chris Hecker's Homepage] enthält viele technische Artikel<br />
* [http://en.wikibooks.org/wiki/OpenGL_Programming Wikibooks OpenGL] enthält viele moderne, englische Tutorials über OpenGL<br />
* [http://www.spieleprogrammierung.net/ Spieleprogrammierung.net] bietet deutschsprachige Tutorials zu OpenGL, OpenAL und OpenCL<br />
* [http://www.gamedevelop.eu/ Gamedevelop.eu] enthält deutschsprachige Artikel und Tutorials zur Spieleentwicklung<br />
* [http://www.makinggames.de/ Makinggames.de] enhält interessante Artikel zum thema Spieleentwicklung<br />
* [http://gameprogrammingpatterns.com/ GameProgrammingPatterns.com] enthält wenige, aber ausführliche Artikel zu Design Patterns in der Spieleentwicklung<br />
* [http://natureofcode.com/ The Nature of Code] ist ein frei verfügbares, aber auch kaufbares Buch über Grundkonzepte und fortgeschrittene Themen der Spieleentwicklung<br />
<br />
== Literatur zur Spieleentwicklung ==<br />
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}<br />
* {{Amazon|3446405968|"3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen}}<br />
* "Game Programming Gems"-Reihe<br />
** {{Amazon|1584500492|"Game Programming Gems 1"}} und {{Amazon|3826609239|die deutsche Übersetzung}}<br />
** {{Amazon|1584500549|"Game Programming Gems 2"}}<br />
** {{Amazon|1584502339|"Game Programming Gems 3"}}<br />
** {{Amazon|1584502959|"Game Programming Gems 4"}} und {{Amazon|3446229442|die deutsche Übersetzung}}<br />
** {{Amazon|1584503521|"Game Programming Gems 5"}}<br />
** {{Amazon|1584504501|"Game Programming Gems 6"}}<br />
** {{Amazon|1584505273|"Game Programming Gems 7"}}<br />
** {{Amazon|1584507020|"Game Programming Gems 8"}}<br />
* "GPU Gems"-Reihe<br />
** {{Amazon|0321228324|"GPU Gems 1"}} [http://http.developer.nvidia.com/GPUGems/gpugems_pref01.html (kostenlos online lesbar)]<br />
** {{Amazon|0321335597|"GPU Gems 2"}} [http://http.developer.nvidia.com/GPUGems2/gpugems2_frontmatter.html (kostenlos online lesbar)]<br />
** {{Amazon|0321515269|"GPU Gems 3"}} und {{Amazon|B000UZQH52|die Kindle-eBook-Version}} [http://http.developer.nvidia.com/GPUGems3/gpugems3_pref01.html (kostenlos online lesbar)]<br />
* [http://www.gdcvault.com/gdmag Game Developer Magazine (alle Ausgaben von 1994-2013 gratis)]<br />
<br />
=== Objektorientierte Analyse, Design und Programmierung ===<br />
<br />
* {{Amazon|3897214954|Objektorientierte Analyse und Design von Kopf bis Fuß}}<br />
* {{Amazon|3540412867|Objektorientierter Softwareentwurf: Integration mit UML}}<br />
* {{Amazon|393258838X|UML @ Work}}, {{Amazon|3898641945|UML @ Work (Taschenbuch)}}<br />
* {{Amazon|3898642615|UML @ Work - Objektorientierte Modellierung mit UML 2}}<br />
* {{Amazon|3486588559|Analyse und Design mit UML 2.3: Objektorientierte Softwareentwicklung}}<br />
* [http://www.oreilly.de/catalog/9780596007126/ Head First Design Patterns] und die deutsche Übersetzung {{Amazon|3897214210|Entwurfsmuster von Kopf bis Fuß}}<br />
* {{Amazon|3772364888|JavaScript: Objektorientierung und Entwurfsmuster: Stabilen und sicheren Code mit JavaScript entwickeln}}<br />
<br />
== Autorensysteme ==<br />
* [https://001gamecreator.com/ 001 Game Creator] {{Kostenpflichtig}}<br />
* [http://www.unity3d.com/ Unity] {{Bedingt kostenpflichtig}}<br />
* [https://www.unrealengine.com/en-US/blog Unreal Engine 4] {{Bedingt kostenpflichtig}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 1.4] {{Kostenfrei}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 2] {{Kostenpflichtig}}<br />
* [http://www.conitec.com/german/gstudio/ Gamestudio] {{Bedingt kostenpflichtig}}<br />
* [http://jmonkeyengine.com/ jMonkeyEngine]<br />
* [http://mycryengine.com/ CryENGINE] {{Bedingt kostenpflichtig}}<br />
* [http://www.neoaxis.com/ NeoAxis Game Engine] {{Bedingt kostenpflichtig}}<br />
* [http://www.garagegames.com/products/torque-3d/ Torque3D] {{Kostenfrei}} und [http://www.garagegames.com/products/torque-2d/ Torque2D] {{Kostenfrei}}<br />
* [http://source.valvesoftware.com/ Source SDK] {{Kostenpflichtig}}<br />
* [http://www.terathon.com/c4engine/ C4 Engine] {{Kostenpflichtig}}<br />
* [http://stencyl.com Stencyl] {{Bedingt kostenpflichtig}}<br />
* [http://www.scirra.com/construct-classic/ Construct Classic]<br />
* [http://www.scirra.com/construct2/ Construct 2] {{Bedingt kostenpflichtig}} (HTML5)<br />
* [http://www.clickteam.com/clickteam-fusion-2-5-free-edition/ Clickteam Fusion 2.5] {{Bedingt kostenpflichtig}}<br />
* [https://www.duality2d.net/ Duality2d] {{Kostenfrei}} (In Entwicklung)<br />
* [https://godotengine.org/ Godot Engine] {{Kostenfrei}} <br />
* [https://gdevelop-app.com/ GDevelop] {{Kostenfrei}}<br />
* [https://www.ambiera.com/coppercube/index.html Coppercube] {{Kostenpflichtig}}<br />
* [http://www.rpgmakerweb.com/ RPG Maker] {{Kostenpflichtig}}<br />
* [https://phasereditor2d.com/ Phaser Editor 2D] {{Kostenfrei}}<br />
* [https://ctjs.rocks/ ct.js] {{Kostenfrei}}<br />
* [https://www.appgamekit.com/ Appgamekit] {{Kostenpflichtig}}<br />
<br />
== Entwicklungsumgebungen, Compiler und Sprachen ==<br />
<br />
=== Entwicklungsumgebungen und Compiler ===<br />
* [http://www.microsoft.com/visualstudio/ Visual Studio] {{Kostenpflichtig}} und die kostenlosen [http://www.microsoft.com/germany/express/ Express Editions] (C++, C#, VB.NET)<br />
* [http://www.codeblocks.org/ Code::Blocks] (C++)<br />
* [http://www.eclipse.org/ Eclipse] (Java, C++, PHP, HTML, JavaScript, CSS, XML & Co.; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.netbeans.org/ Netbeans] (Java, C++, Fortran, PHP, Groovy, HTML, JavaScript, CSS, XML & Co.; siehe [http://netbeans.org/features/index.html Netbeans: Features]; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://developer.apple.com/technologies/tools/ Xcode] (C++, Objective-C, Assembler; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.flashdevelop.org/ FlashDevelop] (AS3, HaXe, XML, MXML, HTML)<br />
* [http://www.monodevelop.com/ MonoDevelop] (C#, VB.NET, C++, Vala)<br />
* [http://www.icsharpcode.net/OpenSource/SD/Default.aspx SharpDevelop] (C#, VB.NET)<br />
<br />
=== Sprachen für die Java VM ===<br />
Siehe auch [http://en.wikipedia.org/wiki/List_of_JVM_languages List of JVM languages]<br />
* [http://java.com Java]<br />
* [http://www.jython.org Jython]<br />
* [http://groovy.codehaus.org/ Groovy]<br />
* [http://clojure.org/ Clojure]<br />
* [http://www.scala-lang.org/ Scala]<br />
* [http://jruby.org/ JRuby]<br />
<br />
=== Sprachen für .NET/CLI ===<br />
Siehe auch [http://de.wikipedia.org/wiki/Liste_von_.NET-Sprachen Liste von .NET-Sprachen]<br />
* [http://msdn.microsoft.com/de-de/vcsharp/aa336706 C#]<br />
* [http://msdn.microsoft.com/de-de/vbasic/ms789056 Visual Basic]<br />
* [http://ironpython.net/ IronPython]<br />
* [http://msdn.microsoft.com/en-us/library/3bf5fs13.aspx JScript]<br />
* [http://msdn.microsoft.com/en-us/vstudio/hh388569 F#]<br />
<br />
== Softwarebibliotheken und Programmierschnittstellen ==<br />
<br />
=== Frameworks für Multimedia und Spieleentwicklung ===<br />
<br />
* [http://www.libsdl.org/ SDL (Simple DirectMedia Layer)] (C++, .NET, Java, Python u.a.)<br />
* [http://www.sfml-dev.org/ SFML (Simple and Fast Multimedia Library)] (C++, .NET, Python)<br />
* [http://www.allegro.cc/ Allegro] (C++)<br />
* [http://msdn.microsoft.com/directx/ DirectX] (C++), [http://slimdx.org/ SlimDX]{{Wrapper|wrapped=DirectX}} (.NET) und [http://code.google.com/p/sharpdx/ SharpDX]{{Wrapper|wrapped=DirectX}} (.NET)<br />
* [http://kvakvs.github.io/hge/ HGE (Haaf's Game Engine)] (C++)<br />
* [http://sourceforge.net/projects/popcapframework/ PopCap Games Framework] (C++)<br />
* [http://pygame.org/ Pygame] (Python)<br />
* [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] (.NET)<br />
* [http://slick.cokeandcode.com/ Slick] (Java)<br />
* [http://libgdx.badlogicgames.com/ LibGDX] (Java)<br />
* [http://flashpunk.net/ FlashPunk] (Flash)<br />
* [http://flixel.org/ Flixel] (Flash)<br />
* [http://love2d.org/ LÖVE] (Lua)<br />
* [http://alternativaplatform.com/ AlternativaPlatform] (Flash)<br />
* [http://www.crystalspace3d.org/ CrystalSpace3D] (C++)<br />
* [http://clanlib.org/ ClanLib] (C++)<br />
* [http://impactjs.com/ Impact] {{Kostenpflichtig}} (JavaScript)<br />
* [http://lwjgl.org/ Lightweight Java Game Library (LWJGL)]{{Wrapper}} (Java)<br />
* [http://ardor3d.com/ Ardor3D] (Java)<br />
* [http://www.panda3d.org/ Panda3D] (Python, C++)<br />
* [https://www.ursinaengine.org/ Ursina Engine] (Python, C++)<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.opengl.org/ OpenGL]<br />
* [http://www.ogre3d.org/ OGRE (Object-Oriented Graphics Rendering Engine)] Sehr ausgereifte objektorientierte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://irrlicht.sourceforge.net/ Irrlicht Engine] Kompakte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://openil.sourceforge.net/ DevIL] Bildverarbeitungsbibliothek (C++)<br />
* [http://opencv.willowgarage.com/ OpenCV] Computer Vision-Bibliothek (C++, .NET, Java, Python)<br />
* [http://www.starling-framework.org/ Starling Framework] GPU-beschleunigte 2D-Grafik (Flash)<br />
* [http://jogamp.org/ JOGL]{{Wrapper|wrapped=OpenGL}} (Java)<br />
* [http://www.opentk.com/ OpenTK]{{Wrapper}} (.NET)<br />
* [http://theora.org/ Theora] Freier Video-Codec<br />
* [http://assimp.sourceforge.net/ Open Asset Import Library] Bibliothek zum Laden, Optimieren und Speichern von 3D-Modellen in verschiedenen Formaten (C, C++)<br />
<br />
=== Audio ===<br />
<br />
* [http://www.fmod.org/ FMOD] {{Bedingt kostenpflichtig}} Portable Audio-Engine mit sehr großem Funktionsumfang (C++, .NET, Java, Python)<br />
* [http://www.un4seen.com/bass.html BASS] {{Bedingt kostenpflichtig}} (C++, .NET)<br />
* [http://connect.creativelabs.com/openal/ OpenAL]<br />
* [http://kcat.strangesoft.net/openal.html OpenAL Soft]<br />
* [http://jogamp.org/ JOAL]{{Wrapper|wrapped=OpenAL}} (Java)<br />
* [http://xiph.org/vorbis/ Vorbis] Freier Audio-Codec<br />
<br />
=== Physik ===<br />
<br />
Siehe auch [http://de.wikipedia.org/wiki/Physikengine#Physik-Engines ''Physikengine - Physik-Engines'' auf Wikipedia]<br />
<br />
* [http://www.bulletphysics.org/ Bullet] (C++), [http://code.google.com/p/bulletsharp/ BulletSharp]{{Wrapper}} (.NET) und [http://jbullet.advel.cz/ JBullet] (Java)<br />
* [http://developer.nvidia.com/physx PhysX] (C++) und [http://physxdotnet.codeplex.com/ PhysX.Net] (.NET)<br />
* [http://www.newtondynamics.com/ Newton Game Dynamics] (C++, .NET, Python, Pascal)<br />
* [http://opende.sourceforge.net/ ODE (Open Dynamics Engine)] (C++, .NET)<br />
* [http://www.havok.com/products/physics Havok Physics] (C++) {{Bedingt kostenpflichtig}}<br />
* [http://box2d.org/ Box2D] (C++), [http://jbox2d.org/ JBox2D] (Java), [http://code.google.com/p/box2dx/ Box2DX] (.NET), [http://box2dxna.codeplex.com/ Box2D.XNA] (.NET), [http://code.google.com/p/pybox2d/ pybox2d] (Python), [http://www.box2dflash.org/ Box2DFlash] (Flash) und [http://box2d-js.sourceforge.net/ Box2DJS] (JavaScript) - Leistungsstarke 2D-Physik-Engine, die von vielen Spielen genutzt wird<br />
<br />
=== Scripting ===<br />
<br />
* [http://www.lua.org/ Lua] und [http://sourceforge.net/projects/luabind/ Luabind] (C++-Schnittstelle)<br />
* [http://www.python.org/ Python] und [http://www.boost.org/doc/libs/release/libs/python/doc/index.html Boost.Python] (C++-Schnittstelle), [http://jepp.sourceforge.net/ JEPP], [http://jpype.sourceforge.net/ JPype], [http://pypi.python.org/pypi/JCC/ JCC]<br />
* [http://www.angelcode.com/angelscript/ AngelScript]<br />
* [http://squirrel-lang.org/ Squirrel]<br />
* [http://www.swig.org/ SWIG (Simplified Wrapper and Interface Generator)] vereinfacht die Integration einer Skriptsprache in ein Programm durch automatisches Generieren von Schnittstellen<br />
<br />
=== Netzwerk ===<br />
<br />
* [http://www.jenkinssoftware.com/ RakNet] (C++)<br />
* [http://think-async.com/Asio/ Asio C++ Library]<br />
* [http://syncsys.sourceforge.net/ SyncSys] (C++)<br />
* [http://code.google.com/p/kryonet/ kryonet] TCP- und UDP-Client/Server-Bibliothek inkl. Serialisierung. Speziell auf Spieleentwicklung ausgelegt. (Java)<br />
* [http://www.jboss.org/netty/ JBoss Netty] Ausgebaute komplexe Netzwerbibliothek mit Unterstützung von WebSocket und HTTP Tunneling. Besonders für MMO und Browsergames interessant. (Java)<br />
* [http://mina.apache.org/ Apache Mina] Alternative zu JBoss Netty. (Java)<br />
* [http://jersey.java.net/ Jersey] Referenzimplementierung des JAX-RS-Standards (JSR 311) zum Entwickeln von RESTful Web Services. Wenn ein Browsergame mit Flash oder JavaScript entwickelt wird, sollte man sich [http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e82 hier] mal anschauen wie bequem man Webservices entwickeln kann. (Java)<br />
* [http://code.google.com/p/lidgren-network-gen3/ Lidgren.Network] (.NET)<br />
* [http://www.zoidcom.com/ Zoidcom] (C++)<br />
<br />
=== GUI-Frameworks ===<br />
<br />
* [http://mygui.info/ MyGUI]<br />
* [http://www.cegui.org.uk/ CEGUI]<br />
* [http://www.cs.unc.edu/~rademach/glui/ GLUI]<br />
* [http://nifty-gui.lessvoid.com/ Nifty GUI] (Java)<br />
* [http://qt-project.org/ Qt] (C++)<br />
* [http://www.wxwidgets.org/ wxWidgets]<br />
* [http://www.gtk.org/ GTK+]<br />
* [http://developer.apple.com/cocoa/ Cocoa]<br />
* [http://fltk.org/ FLTK]<br />
* [http://code.google.com/p/gwen/ GWEN]<br />
* [http://sfgui.sfml-dev.de/ SFGUI]<br />
<br />
=== Daten ===<br />
<br />
* [http://www.grinninglizard.com/tinyxml/ TinyXml] und [http://code.google.com/p/ticpp/ ticpp] XML-Bibliothek zum Lesen und Schreiben von XML-Dateien<br />
* [http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx SharpZipLib] bietet Zugriff auf Archive im Format Zip, GZip, Tar und BZip<br />
* [http://icculus.org/physfs/ PhysicsFS] Virtuelles Dateisystem für Spiele, das auch Archive unterstützt (C++)<br />
* [http://zlib.net/ zlib] und [http://www.winimage.com/zLibDll/minizip.html Minizip] Bibliotheken zur Datenkompression und zum Lesen und Schreiben von Zip-Archiven<br />
* [http://www.jdom.org/ JDOM] (Java) Zugriff auf XML-Dateien<br />
* [http://www.sqlite.org/download.html SQLite] (C++, .NET) eingebettetes, relationales DBMS (der Python-Interpreter besitzt standardmäßig eine Implementierung)<br />
* [http://db.apache.org/derby/ Derby] (Java) eingebettetes, relationales DBMS<br />
<br />
=== Sonstige ===<br />
<br />
* [http://www.boost.org/ Boost C++ Libraries] Große Sammlung an C++-Bibliotheken für verschiedenste Zwecke (C++)<br />
* [http://pocoproject.org/ POCO] Weitere C++-Bibliothek für verschiedenste Zwecke (C++)<br />
* [http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx SharpUSBLib] bietet Low-Level Zugriff auf USB-Geräte (C#)<br />
* [http://sourceforge.net/projects/sharpcvslib/ SharpCvsLib] stellt einen CVS-Client dar (C#) ''(notwendig für Spieleprogrammierung?)''<br />
* [http://code.google.com/p/google-guice/ Google Guice] Leichtgewichtiges Dependency-Injection-Framework. Komplexere Anwendungen/Spiele können von [http://de.wikipedia.org/wiki/Dependency_Injection DI] profitieren. (Java)<br />
* [http://code.google.com/p/recastnavigation/ Recast+Detour] Navigation-Mesh- und Pathfinding-Toolset<br />
* [http://code.google.com/p/caliper/ Google Caliper] Microbenchmarking-Framework (Java)<br />
* [http://launch4j.sourceforge.net/ Launch4J] Werkzeug zum Wrappen von Java-Anwendungen in ausführbare Dateien für verschiedene Plattformen (Java)<br />
* [http://gamadu.com/artemis/ Artemis] Entity-System-Framework für Spiele (Java)<br />
* [http://www.grinninglizard.com/MicroPather/ MicroPather] A* Pathfinding für die Suche nach einem kürzesten und schnellsten Weg<br />
<br />
== Tools ==<br />
<br />
* [http://www.angelcode.com/products/bmfont/ Bitmap Font Generator] erzeugt Bitmap-Fonts mit vielfältigen Optionen<br />
* [http://code.google.com/p/fontbuilder/ Fontbuilder] erzeugt ebenfalls Bitmap-Fonts<br />
* [http://optipng.sourceforge.net/ OptiPNG] optimiert PNG-Dateien auf Größe durch Verbesserung der Kompression ohne Qualitätsverlust<br />
* [http://www.wholetomato.com/ Visual Assist X] bietet verbessertes Syntax-Highlighting und intelligente Codevervollständigung sowie Refactoring für Visual Studio<br />
* [http://www.codeandweb.com/texturepacker TexturePacker] vereinfacht das Erstellen von Spritesheets, direkter Export für viele Engines bereits enthalten<br />
<br />
=== Diagramm-Tools ===<br />
<br />
Eine Auflistung von UML-Tools ist unter [http://www.jeckle.de/umltools.html jeckle.de] zu finden.<br />
<br />
* [http://live.gnome.org/Dia Dia] Programm zum Erzeugen von (Klassen-)Diagrammen und Zeichnungen<br />
* [http://argouml.tigris.org/ ArgoUML] Programm zum Erzeugen von UML-Diagrammen<br />
* [http://www.microtool.de/objectif/de/index.asp ObjectiF] {{Kostenpflichtig}} Programm zum Erzeugen von UML-Diagrammen<br />
<br />
=== Versionsverwaltungssysteme ===<br />
<br />
* [http://subversion.tigris.org/ Subversion] Zentralisierte Versionsverwaltung<br />
* [http://git-scm.com/ Git] Verteilte Versionsverwaltung<br />
* [https://www.mercurial-scm.org/ Mercurial] Verteilte Versionsverwaltung<br />
<br />
=== Level-Editoren und -Generatoren ===<br />
<br />
* [http://tide.codeplex.com/ tIDE (Tilemap Integrated Development Environment)] Sehr flexibler 2D-Tilemap-Editor mit Plugin-Unterstützung<br />
* [http://ogmoeditor.com/ Ogmo Editor] 2D-Tilemap-Editor<br />
* [http://www.mapeditor.org/ Tiled] 2D-Tilemap-Editor<br />
* [http://www.bundysoft.com/L3DT/ L3DT (Large 3D Terrain Generator)] {{Bedingt kostenpflichtig}}<br />
* [http://www.davidwaltersdevelopment.com/tools/gridcart/ Grid Cartographer] {{Bedingt kostenpflichtig}}<br />
* [https://ldtk.io/ Tiled] 2D-Tilemap-Editor vom Dead Cells Mitentwickler<br />
<br />
=== Namensgeneratoren ===<br />
<br />
* [http://ebon.pyorre.net/ Everchanging Book of Names] {{Bedingt kostenpflichtig}}<br />
* [http://www.rinkworks.com/namegen/ Fantasy Name Generator]<br />
* [http://www.behindthename.com/random/ Behind the Name: Random Name Generator]<br />
* [http://www.dotomator.com/web20.html/ Dotomator: Web 2.0 Name Generator]<br />
<br />
== Software zur Content-Erstellung ==<br />
<br />
=== 3D-Modellierung ===<br />
<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?id=14642267&siteID=403786 3ds Max] {{Kostenpflichtig}}<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?siteID=403786&id=14657512 Maya] {{Kostenpflichtig}}<br />
* [http://www.blender.org/ Blender] {{Kostenfrei}}<br />
* [http://www.maxon.net/ CINEMA 4D] {{Kostenpflichtig}}<br />
* [http://nevercenter.com/silo/ Silo] {{Kostenpflichtig}}<br />
* [http://3d-coat.com/ 3D-Coat] {{Kostenpflichtig}}<br />
* [http://www.pixologic.com/sculptris/ Sculptris]<br />
* [http://www.daz3d.com/i/products/hexagon? Hexagon 2] {{Kostenpflichtig}}<br />
* [http://www.makehuman.org/ Makehuman] {{Kostenfrei}} ist ein Open Source-Projekt zur flexiblen Erstellung menschlicher 3D-Modelle<br />
* [http://www.anim8or.com/ Anim8or] ist ein beliebtes Modellierungsprogramm mit Animationsmöglichkeiten<br />
* [https://www.daz3d.com/get_studio DAZ Studio] {{Kostenfrei}}<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.adobe.com/de/products/photoshop.html Adobe Photoshop] {{Kostenpflichtig}}<br />
* [http://www.gimp.org/ GIMP (GNU Image Manipulation Program)]<br />
* [http://inkscape.org/ Inkscape]<br />
* [http://www.paint.net/ Paint.NET]<br />
* [http://www.cosmigo.com/promotion/ Cosmigo Pro Motion] {{Kostenpflichtig}}<br />
* [http://www.humanbalance.net/gale/us/ GraphicsGale] {{Kostenpflichtig}}<br />
* [http://www.aseprite.org/ Aseprite]<br />
* [http://www.piskelapp.com/ PiskelApp]<br />
* [http://renderhjs.net/shoebox/ ShoeBox]<br />
* [http://www.pickleeditor.com/ Pickle] {{Kostenpflichtig}}<br />
* [http://pyxeledit.com/ Pyxel Edit] {{Kostenpflichtig}}<br />
* [http://www.snakehillgames.com/spritelamp/ Sprite Lamp] {{Kostenpflichtig}}<br />
* [http://autotilegen.com/ AutoTileGen] {{Kostenpflichtig}}<br />
* [http://www.brashmonkey.com/spriter.htm Spriter] {{Kostenpflichtig}}<br />
* [http://hexraystudios.com/hexels/ Hexels]<br />
* [http://de.esotericsoftware.com/ Spine] {{Kostenpflichtig}}<br />
* [http://www.vitruality.com/tools/spartan/ Spartan]<br />
* [https://krita.org/ Krita]<br />
* [https://www.allegorithmic.com/ Allegorithmic Substance Designer / Painter] {{Kostenpflichtig}}<br />
* [http://icofx.ro/ IcoFX] {{Kostenpflichtig}}<br />
<br />
=== Audio ===<br />
<br />
* [http://audacity.sourceforge.net/ Audacity]<br />
* [http://lmms.sourceforge.net/ LMMS]<br />
* [http://flstudio.image-line.com/ FL Studio] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/products/audition.html Adobe Audition] {{Kostenpflichtig}}<br />
* [http://www.renoise.com/ Renoise] {{Kostenpflichtig}}<br />
* [http://www.drpetter.se/project_sfxr.html sfxr]<br />
* [http://goldwave.com/ GoldWave] {{Kostenpflichtig}}<br />
* [http://www.steinberg.net/de/products/cubase/start.html Cubase] {{Kostenpflichtig}}<br />
* [http://www.reaper.fm/ Reaper] {{Kostenpflichtig}}<br />
* [http://www.bitwig.com/en/bitwig-studio/overview.html Bitwig Studio] {{Kostenpflichtig}}<br />
* [http://famitracker.com/ Famitracker]<br />
* [http://boscaceoil.net/ Bosca Ceiol]<br />
<br />
=== Video ===<br />
<br />
==== Aufnahme ====<br />
<br />
* [http://www.mirillis.com/de Mirillis] {{Kostenpflichtig}}<br />
* [http://www.bandicam.com/de Bandicam] {{Bedingt kostenpflichtig}}<br />
* [http://exkode.com/dxtory-features-en.html Dxtory] {{Kostenpflichtig}}<br />
* [http://www.fraps.com Fraps] {{Kostenpflichtig}}<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.videolan.org/vlc/ VLC Media Player]<br />
* [http://camstudio.org/ CamStudio]<br />
* [http://www.playclaw.com/de/ PlayClaw] {{Kostenpflichtig}}<br />
* [https://obsproject.com/ Open Broadcast Software]<br />
<br />
==== Verarbeitung ====<br />
<br />
* [http://www.virtualdub.org/ VirtualDub]<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.sonycreativesoftware.com/vegassoftware Sony Vegas] {{Kostenpflichtig}}<br />
* [http://handbrake.fr Handbrake]<br />
* [http://www.lightworksbeta.com/ Lightworks]<br />
* [http://tmpgenc.pegasys-inc.com/de/product/tvmw5.html TMPGEnc Video Mastering Works 5] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/de/products/premiere.html Adobe Premiere] {{Kostenpflichtig}}<br />
* [http://staxmedia.sourceforge.net/ StaxRip]<br />
* [http://sourceforge.net/projects/megui/ MeGUI]<br />
* [http://explore.live.com/windows-live-movie-maker Windows Live Movie Maker]<br />
<br />
== Fertiger Content ==<br />
<br />
Hier soll auf Seiten verwiesen werden, auf denen man (vorzugsweise kostenlose) Grafiken, 3D-Modelle, Soundeffekte und Musikstücke finden kann.<br />
<br />
* [http://kenney.itch.io/kenney-donation Kenney Donation Pack] ist eine Sammlung von über 6000 frei verwendbaren Assets, für die der Autor eine Spende verlangt<br />
* [http://content.gpwiki.org/index.php/Game_Content_Resources Umfangreiche Link-Sammlung im GPWiki]<br />
* [http://www.reinerstilesets.de Reiner's Tilesets] {{Kostenfrei}} enthält nicht nur Tilesets, sondern auch 3D-Modelle, Texturen, Soundeffekte und Tutorials<br />
<br />
=== 3D-Modelle ===<br />
<br />
* [http://www.3dcafe.com/ 3D Cafe] {{Bedingt kostenpflichtig}} bietet auch kostenlose 3D-Modelle, wenn man zuvor mindestens drei eigene Modelle auf die Seite geladen hat<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=10 OpenGameArt 3D] {{Kostenfrei}} Frei lizensierte 3D-Modelle<br />
* [http://www.blendswap.com/ blendswap] {{Kostenfrei}} Frei lizensierte Blender-Modelle<br />
* [http://www.daz3d.com/new-releases?dir=asc&order=price DAZ 3D Marketplace] {{Kostenpflichtig}}<br />
* [http://arteria3d.com/collections/audio/Medieval Arteria3d] {{Kostenpflichtig}}<br />
<br />
=== Grafiken und Texturen ===<br />
* [http://www.3d.sk/ 3D.SK] {{Kostenpflichtig}} Referenzbilder von Menschen speziell für 3D-Modellierung und Spieleentwicklung<br />
* [http://www.cgtextures.com/ CGTextures] {{Bedingt kostenpflichtig}} bietet eine große Sammlung kostenlos benutzbarer Texturen<br />
* [http://www.environment-textures.com/ Environment Textures] {{Kostenpflichtig}}<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=9 OpenGameArt 2D] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=14 Texturen] {{Kostenfrei}} Legale, frei lizensierte Grafiken<br />
* [http://www.lostgarden.com/ Lost Garden Art] {{Kostenfrei}}<br />
* [http://charas-project.net/ Charas Project] {{Kostenfrei}}<br />
* [http://spriters-resource.com/ The Spriters Resource] {{Kostenfrei}}<br />
* [https://vxresource.wordpress.com/ RPG Maker VX Resource Planet] {{Kostenfrei}}<br />
<br />
=== Soundeffekte und Musik ===<br />
<br />
* [http://www.audiomicro.com/ AudioMicro] {{Kostenpflichtig}}<br />
* [http://www.freesound.org/ Freesound] {{Kostenfrei}} Frei lizensierte community-kreierte Sounds<br />
* [http://incompetech.com/m/c/royalty-free/ Incompetech] {{Kostenfrei}} Musik unter der Creative Commons Attribution Lizenz (CC-BY)<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12 OpenGameArt Musik] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=13 Sounds] {{Kostenfrei}} Frei lizensierte Audiodateien<br />
* [http://www.soundsnap.com/ Soundsnap] {{Kostenpflichtig}}<br />
* [http://www.bensound.com/ bensound] {{Kostenfrei}}<br />
* [https://www.jamendo.com/ Jamendo] {{Bedingt kostenpflichtig}}<br />
<br />
=== Schriftarten ===<br />
<br />
* [http://www.dafont.com/ Dafont.com] {{Kostenfrei}}<br />
* [http://www.myfont.de/ MyFont.de] {{Kostenfrei}}<br />
* [http://openfontlibrary.org/ OpenFontLibrary] {{Kostenfrei}} Frei lizensierte Schriftarten<br />
* [http://www.urbanfonts.com/ Urban Fonts] {{Kostenfrei}}<br />
<br />
== Sonstiges ==<br />
<br />
* [http://www.wotsit.org/ Wotsit.org] Große Datenbank mit Beschreibung von Dateiformaten (nützlich, wenn man ein bestimmtes Dateiformat lesen oder schreiben möchte) '''Seite ist offline'''<br />
* [http://www.wsusoffline.net/ WSUS Offline Updater] erzeugt komplette Offline-Updates (CD/DVD(.iso)/USB-Sticks) aller Windows/Office 2003-2013/C++ Laufzeit/.NET-Framework-Versionen.<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2020-09-15T07:57:21Z<p>David Scherfgen: </p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://www.spieleprogrammierer.de/index.php?page=MibbitChat IRC-Chat]''': Der IRC-Channel zur Website: <tt>#sppro</tt> auf [http://www.euirc.net/ euIRC].<br />
* '''[https://discord.gg/yqRX67X Discord-Chat]''': Der Discord-Server zur Website.<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Link-SammlungLink-Sammlung2020-04-23T12:04:31Z<p>David Scherfgen: </p>
<hr />
<div>In diesem Artikel sollen Links gesammelt werden, die für die Spieleentwicklung nützlich sind.<br />
<br />
== Webseiten und Tutorials zur Spieleentwicklung ==<br />
<br />
* [http://www.gamedev.net/ GameDev.net] Große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gamasutra.com/ Gamasutra] Weitere große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gpwiki.org/ Game Programming Wiki] Englischsprachiges Wiki zum Thema Spieleentwicklung<br />
* [http://gafferongames.com/ Game Development + Game Programming Tutorials von Glenn Fiedler] Hochqualitative Reihe von Artikeln und Tutorials zu technischen Aspekten der Spieleprogrammierung<br />
* [http://www.ludism.org/gamedesign/ Game Design Wiki] ist ein nicht-technisches Wiki zum Thema Game-Design<br />
* [http://chrishecker.com/ Chris Hecker's Homepage] enthält viele technische Artikel<br />
* [http://en.wikibooks.org/wiki/OpenGL_Programming Wikibooks OpenGL] enthält viele moderne, englische Tutorials über OpenGL<br />
* [http://www.spieleprogrammierung.net/ Spieleprogrammierung.net] bietet deutschsprachige Tutorials zu OpenGL, OpenAL und OpenCL<br />
* [http://www.gamedevelop.eu/ Gamedevelop.eu] enthält deutschsprachige Artikel und Tutorials zur Spieleentwicklung<br />
* [http://www.makinggames.de/ Makinggames.de] enhält interessante Artikel zum thema Spieleentwicklung<br />
* [http://gameprogrammingpatterns.com/ GameProgrammingPatterns.com] enthält wenige, aber ausführliche Artikel zu Design Patterns in der Spieleentwicklung<br />
* [http://natureofcode.com/ The Nature of Code] ist ein frei verfügbares, aber auch kaufbares Buch über Grundkonzepte und fortgeschrittene Themen der Spieleentwicklung<br />
<br />
== Literatur zur Spieleentwicklung ==<br />
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}<br />
* {{Amazon|3446405968|"3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen}}<br />
* "Game Programming Gems"-Reihe<br />
** {{Amazon|1584500492|"Game Programming Gems 1"}} und {{Amazon|3826609239|die deutsche Übersetzung}}<br />
** {{Amazon|1584500549|"Game Programming Gems 2"}}<br />
** {{Amazon|1584502339|"Game Programming Gems 3"}}<br />
** {{Amazon|1584502959|"Game Programming Gems 4"}} und {{Amazon|3446229442|die deutsche Übersetzung}}<br />
** {{Amazon|1584503521|"Game Programming Gems 5"}}<br />
** {{Amazon|1584504501|"Game Programming Gems 6"}}<br />
** {{Amazon|1584505273|"Game Programming Gems 7"}}<br />
** {{Amazon|1584507020|"Game Programming Gems 8"}}<br />
* "GPU Gems"-Reihe<br />
** {{Amazon|0321228324|"GPU Gems 1"}} [http://http.developer.nvidia.com/GPUGems/gpugems_pref01.html (kostenlos online lesbar)]<br />
** {{Amazon|0321335597|"GPU Gems 2"}} [http://http.developer.nvidia.com/GPUGems2/gpugems2_frontmatter.html (kostenlos online lesbar)]<br />
** {{Amazon|0321515269|"GPU Gems 3"}} und {{Amazon|B000UZQH52|die Kindle-eBook-Version}} [http://http.developer.nvidia.com/GPUGems3/gpugems3_pref01.html (kostenlos online lesbar)]<br />
* [http://www.gdcvault.com/gdmag Game Developer Magazine (alle Ausgaben von 1994-2013 gratis)]<br />
<br />
=== Objektorientierte Analyse, Design und Programmierung ===<br />
<br />
* {{Amazon|3897214954|Objektorientierte Analyse und Design von Kopf bis Fuß}}<br />
* {{Amazon|3540412867|Objektorientierter Softwareentwurf: Integration mit UML}}<br />
* {{Amazon|393258838X|UML @ Work}}, {{Amazon|3898641945|UML @ Work (Taschenbuch)}}<br />
* {{Amazon|3898642615|UML @ Work - Objektorientierte Modellierung mit UML 2}}<br />
* {{Amazon|3486588559|Analyse und Design mit UML 2.3: Objektorientierte Softwareentwicklung}}<br />
* [http://www.oreilly.de/catalog/9780596007126/ Head First Design Patterns] und die deutsche Übersetzung {{Amazon|3897214210|Entwurfsmuster von Kopf bis Fuß}}<br />
* {{Amazon|3772364888|JavaScript: Objektorientierung und Entwurfsmuster: Stabilen und sicheren Code mit JavaScript entwickeln}}<br />
<br />
== Autorensysteme ==<br />
* [https://001gamecreator.com/ 001 Game Creator] {{Kostenpflichtig}}<br />
* [http://www.unity3d.com/ Unity] {{Bedingt kostenpflichtig}}<br />
* [https://www.unrealengine.com/en-US/blog Unreal Engine 4] {{Bedingt kostenpflichtig}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 1.4] {{Kostenfrei}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 2] {{Kostenpflichtig}}<br />
* [http://www.conitec.com/german/gstudio/ Gamestudio] {{Bedingt kostenpflichtig}}<br />
* [http://jmonkeyengine.com/ jMonkeyEngine]<br />
* [http://mycryengine.com/ CryENGINE] {{Bedingt kostenpflichtig}}<br />
* [http://www.neoaxis.com/ NeoAxis Game Engine] {{Bedingt kostenpflichtig}}<br />
* [http://www.garagegames.com/products/torque-3d/ Torque3D] {{Kostenfrei}} und [http://www.garagegames.com/products/torque-2d/ Torque2D] {{Kostenfrei}}<br />
* [http://source.valvesoftware.com/ Source SDK] {{Kostenpflichtig}}<br />
* [http://www.terathon.com/c4engine/ C4 Engine] {{Kostenpflichtig}}<br />
* [http://stencyl.com Stencyl] {{Bedingt kostenpflichtig}}<br />
* [http://www.scirra.com/construct-classic/ Construct Classic]<br />
* [http://www.scirra.com/construct2/ Construct 2] {{Bedingt kostenpflichtig}} (HTML5)<br />
* [http://www.clickteam.com/clickteam-fusion-2-5-free-edition/ Clickteam Fusion 2.5] {{Bedingt kostenpflichtig}}<br />
* [https://www.duality2d.net/ Duality2d] {{Kostenfrei}} (In Entwicklung)<br />
* [https://godotengine.org/ Godot Engine] {{Kostenfrei}} <br />
* [https://gdevelop-app.com/ GDevelop] {{Kostenfrei}}<br />
* [https://www.ambiera.com/coppercube/index.html Coppercube] {{Kostenpflichtig}}<br />
* [http://www.rpgmakerweb.com/ RPG Maker] {{Kostenpflichtig}}<br />
* [https://phasereditor2d.com/ Phaser Editor 2D] {{Kostenfrei}}<br />
* [https://ctjs.rocks/ ct.js] {{Kostenfrei}}<br />
* [https://www.appgamekit.com/ Appgamekit] {{Kostenpflichtig}}<br />
<br />
== Entwicklungsumgebungen, Compiler und Sprachen ==<br />
<br />
=== Entwicklungsumgebungen und Compiler ===<br />
* [http://www.microsoft.com/visualstudio/ Visual Studio] {{Kostenpflichtig}} und die kostenlosen [http://www.microsoft.com/germany/express/ Express Editions] (C++, C#, VB.NET)<br />
* [http://www.codeblocks.org/ Code::Blocks] (C++)<br />
* [http://www.eclipse.org/ Eclipse] (Java, C++, PHP, HTML, JavaScript, CSS, XML & Co.; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.netbeans.org/ Netbeans] (Java, C++, Fortran, PHP, Groovy, HTML, JavaScript, CSS, XML & Co.; siehe [http://netbeans.org/features/index.html Netbeans: Features]; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://developer.apple.com/technologies/tools/ Xcode] (C++, Objective-C, Assembler; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.flashdevelop.org/ FlashDevelop] (AS3, HaXe, XML, MXML, HTML)<br />
* [http://www.monodevelop.com/ MonoDevelop] (C#, VB.NET, C++, Vala)<br />
* [http://www.icsharpcode.net/OpenSource/SD/Default.aspx SharpDevelop] (C#, VB.NET)<br />
<br />
=== Sprachen für die Java VM ===<br />
Siehe auch [http://en.wikipedia.org/wiki/List_of_JVM_languages List of JVM languages]<br />
* [http://java.com Java]<br />
* [http://www.jython.org Jython]<br />
* [http://groovy.codehaus.org/ Groovy]<br />
* [http://clojure.org/ Clojure]<br />
* [http://www.scala-lang.org/ Scala]<br />
* [http://jruby.org/ JRuby]<br />
<br />
=== Sprachen für .NET/CLI ===<br />
Siehe auch [http://de.wikipedia.org/wiki/Liste_von_.NET-Sprachen Liste von .NET-Sprachen]<br />
* [http://msdn.microsoft.com/de-de/vcsharp/aa336706 C#]<br />
* [http://msdn.microsoft.com/de-de/vbasic/ms789056 Visual Basic]<br />
* [http://ironpython.net/ IronPython]<br />
* [http://msdn.microsoft.com/en-us/library/3bf5fs13.aspx JScript]<br />
* [http://msdn.microsoft.com/en-us/vstudio/hh388569 F#]<br />
<br />
== Softwarebibliotheken und Programmierschnittstellen ==<br />
<br />
=== Frameworks für Multimedia und Spieleentwicklung ===<br />
<br />
* [http://www.libsdl.org/ SDL (Simple DirectMedia Layer)] (C++, .NET, Java, Python u.a.)<br />
* [http://www.sfml-dev.org/ SFML (Simple and Fast Multimedia Library)] (C++, .NET, Python)<br />
* [http://www.allegro.cc/ Allegro] (C++)<br />
* [http://msdn.microsoft.com/directx/ DirectX] (C++), [http://slimdx.org/ SlimDX]{{Wrapper|wrapped=DirectX}} (.NET) und [http://code.google.com/p/sharpdx/ SharpDX]{{Wrapper|wrapped=DirectX}} (.NET)<br />
* [http://kvakvs.github.io/hge/ HGE (Haaf's Game Engine)] (C++)<br />
* [http://sourceforge.net/projects/popcapframework/ PopCap Games Framework] (C++)<br />
* [http://pygame.org/ Pygame] (Python)<br />
* [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] (.NET)<br />
* [http://slick.cokeandcode.com/ Slick] (Java)<br />
* [http://libgdx.badlogicgames.com/ LibGDX] (Java)<br />
* [http://flashpunk.net/ FlashPunk] (Flash)<br />
* [http://flixel.org/ Flixel] (Flash)<br />
* [http://love2d.org/ LÖVE] (Lua)<br />
* [http://alternativaplatform.com/ AlternativaPlatform] (Flash)<br />
* [http://www.crystalspace3d.org/ CrystalSpace3D] (C++)<br />
* [http://clanlib.org/ ClanLib] (C++)<br />
* [http://impactjs.com/ Impact] {{Kostenpflichtig}} (JavaScript)<br />
* [http://lwjgl.org/ Lightweight Java Game Library (LWJGL)]{{Wrapper}} (Java)<br />
* [http://ardor3d.com/ Ardor3D] (Java)<br />
* [http://www.panda3d.org/ Panda3D] (Python, C++)<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.opengl.org/ OpenGL]<br />
* [http://www.ogre3d.org/ OGRE (Object-Oriented Graphics Rendering Engine)] Sehr ausgereifte objektorientierte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://irrlicht.sourceforge.net/ Irrlicht Engine] Kompakte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://openil.sourceforge.net/ DevIL] Bildverarbeitungsbibliothek (C++)<br />
* [http://opencv.willowgarage.com/ OpenCV] Computer Vision-Bibliothek (C++, .NET, Java, Python)<br />
* [http://www.starling-framework.org/ Starling Framework] GPU-beschleunigte 2D-Grafik (Flash)<br />
* [http://jogamp.org/ JOGL]{{Wrapper|wrapped=OpenGL}} (Java)<br />
* [http://www.opentk.com/ OpenTK]{{Wrapper}} (.NET)<br />
* [http://theora.org/ Theora] Freier Video-Codec<br />
* [http://assimp.sourceforge.net/ Open Asset Import Library] Bibliothek zum Laden, Optimieren und Speichern von 3D-Modellen in verschiedenen Formaten (C, C++)<br />
<br />
=== Audio ===<br />
<br />
* [http://www.fmod.org/ FMOD] {{Bedingt kostenpflichtig}} Portable Audio-Engine mit sehr großem Funktionsumfang (C++, .NET, Java, Python)<br />
* [http://www.un4seen.com/bass.html BASS] {{Bedingt kostenpflichtig}} (C++, .NET)<br />
* [http://connect.creativelabs.com/openal/ OpenAL]<br />
* [http://kcat.strangesoft.net/openal.html OpenAL Soft]<br />
* [http://jogamp.org/ JOAL]{{Wrapper|wrapped=OpenAL}} (Java)<br />
* [http://xiph.org/vorbis/ Vorbis] Freier Audio-Codec<br />
<br />
=== Physik ===<br />
<br />
Siehe auch [http://de.wikipedia.org/wiki/Physikengine#Physik-Engines ''Physikengine - Physik-Engines'' auf Wikipedia]<br />
<br />
* [http://www.bulletphysics.org/ Bullet] (C++), [http://code.google.com/p/bulletsharp/ BulletSharp]{{Wrapper}} (.NET) und [http://jbullet.advel.cz/ JBullet] (Java)<br />
* [http://developer.nvidia.com/physx PhysX] (C++) und [http://physxdotnet.codeplex.com/ PhysX.Net] (.NET)<br />
* [http://www.newtondynamics.com/ Newton Game Dynamics] (C++, .NET, Python, Pascal)<br />
* [http://opende.sourceforge.net/ ODE (Open Dynamics Engine)] (C++, .NET)<br />
* [http://www.havok.com/products/physics Havok Physics] (C++) {{Bedingt kostenpflichtig}}<br />
* [http://box2d.org/ Box2D] (C++), [http://jbox2d.org/ JBox2D] (Java), [http://code.google.com/p/box2dx/ Box2DX] (.NET), [http://box2dxna.codeplex.com/ Box2D.XNA] (.NET), [http://code.google.com/p/pybox2d/ pybox2d] (Python), [http://www.box2dflash.org/ Box2DFlash] (Flash) und [http://box2d-js.sourceforge.net/ Box2DJS] (JavaScript) - Leistungsstarke 2D-Physik-Engine, die von vielen Spielen genutzt wird<br />
<br />
=== Scripting ===<br />
<br />
* [http://www.lua.org/ Lua] und [http://sourceforge.net/projects/luabind/ Luabind] (C++-Schnittstelle)<br />
* [http://www.python.org/ Python] und [http://www.boost.org/doc/libs/release/libs/python/doc/index.html Boost.Python] (C++-Schnittstelle), [http://jepp.sourceforge.net/ JEPP], [http://jpype.sourceforge.net/ JPype], [http://pypi.python.org/pypi/JCC/ JCC]<br />
* [http://www.angelcode.com/angelscript/ AngelScript]<br />
* [http://squirrel-lang.org/ Squirrel]<br />
* [http://www.swig.org/ SWIG (Simplified Wrapper and Interface Generator)] vereinfacht die Integration einer Skriptsprache in ein Programm durch automatisches Generieren von Schnittstellen<br />
<br />
=== Netzwerk ===<br />
<br />
* [http://www.jenkinssoftware.com/ RakNet] (C++)<br />
* [http://think-async.com/Asio/ Asio C++ Library]<br />
* [http://syncsys.sourceforge.net/ SyncSys] (C++)<br />
* [http://code.google.com/p/kryonet/ kryonet] TCP- und UDP-Client/Server-Bibliothek inkl. Serialisierung. Speziell auf Spieleentwicklung ausgelegt. (Java)<br />
* [http://www.jboss.org/netty/ JBoss Netty] Ausgebaute komplexe Netzwerbibliothek mit Unterstützung von WebSocket und HTTP Tunneling. Besonders für MMO und Browsergames interessant. (Java)<br />
* [http://mina.apache.org/ Apache Mina] Alternative zu JBoss Netty. (Java)<br />
* [http://jersey.java.net/ Jersey] Referenzimplementierung des JAX-RS-Standards (JSR 311) zum Entwickeln von RESTful Web Services. Wenn ein Browsergame mit Flash oder JavaScript entwickelt wird, sollte man sich [http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e82 hier] mal anschauen wie bequem man Webservices entwickeln kann. (Java)<br />
* [http://code.google.com/p/lidgren-network-gen3/ Lidgren.Network] (.NET)<br />
* [http://www.zoidcom.com/ Zoidcom] (C++)<br />
<br />
=== GUI-Frameworks ===<br />
<br />
* [http://mygui.info/ MyGUI]<br />
* [http://www.cegui.org.uk/ CEGUI]<br />
* [http://www.cs.unc.edu/~rademach/glui/ GLUI]<br />
* [http://nifty-gui.lessvoid.com/ Nifty GUI] (Java)<br />
* [http://qt-project.org/ Qt] (C++)<br />
* [http://www.wxwidgets.org/ wxWidgets]<br />
* [http://www.gtk.org/ GTK+]<br />
* [http://developer.apple.com/cocoa/ Cocoa]<br />
* [http://fltk.org/ FLTK]<br />
* [http://code.google.com/p/gwen/ GWEN]<br />
* [http://sfgui.sfml-dev.de/ SFGUI]<br />
<br />
=== Daten ===<br />
<br />
* [http://www.grinninglizard.com/tinyxml/ TinyXml] und [http://code.google.com/p/ticpp/ ticpp] XML-Bibliothek zum Lesen und Schreiben von XML-Dateien<br />
* [http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx SharpZipLib] bietet Zugriff auf Archive im Format Zip, GZip, Tar und BZip<br />
* [http://icculus.org/physfs/ PhysicsFS] Virtuelles Dateisystem für Spiele, das auch Archive unterstützt (C++)<br />
* [http://zlib.net/ zlib] und [http://www.winimage.com/zLibDll/minizip.html Minizip] Bibliotheken zur Datenkompression und zum Lesen und Schreiben von Zip-Archiven<br />
* [http://www.jdom.org/ JDOM] (Java) Zugriff auf XML-Dateien<br />
* [http://www.sqlite.org/download.html SQLite] (C++, .NET) eingebettetes, relationales DBMS (der Python-Interpreter besitzt standardmäßig eine Implementierung)<br />
* [http://db.apache.org/derby/ Derby] (Java) eingebettetes, relationales DBMS<br />
<br />
=== Sonstige ===<br />
<br />
* [http://www.boost.org/ Boost C++ Libraries] Große Sammlung an C++-Bibliotheken für verschiedenste Zwecke (C++)<br />
* [http://pocoproject.org/ POCO] Weitere C++-Bibliothek für verschiedenste Zwecke (C++)<br />
* [http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx SharpUSBLib] bietet Low-Level Zugriff auf USB-Geräte (C#)<br />
* [http://sourceforge.net/projects/sharpcvslib/ SharpCvsLib] stellt einen CVS-Client dar (C#) ''(notwendig für Spieleprogrammierung?)''<br />
* [http://code.google.com/p/google-guice/ Google Guice] Leichtgewichtiges Dependency-Injection-Framework. Komplexere Anwendungen/Spiele können von [http://de.wikipedia.org/wiki/Dependency_Injection DI] profitieren. (Java)<br />
* [http://code.google.com/p/recastnavigation/ Recast+Detour] Navigation-Mesh- und Pathfinding-Toolset<br />
* [http://code.google.com/p/caliper/ Google Caliper] Microbenchmarking-Framework (Java)<br />
* [http://launch4j.sourceforge.net/ Launch4J] Werkzeug zum Wrappen von Java-Anwendungen in ausführbare Dateien für verschiedene Plattformen (Java)<br />
* [http://gamadu.com/artemis/ Artemis] Entity-System-Framework für Spiele (Java)<br />
* [http://www.grinninglizard.com/MicroPather/ MicroPather] A* Pathfinding für die Suche nach einem kürzesten und schnellsten Weg<br />
<br />
== Tools ==<br />
<br />
* [http://www.angelcode.com/products/bmfont/ Bitmap Font Generator] erzeugt Bitmap-Fonts mit vielfältigen Optionen<br />
* [http://code.google.com/p/fontbuilder/ Fontbuilder] erzeugt ebenfalls Bitmap-Fonts<br />
* [http://optipng.sourceforge.net/ OptiPNG] optimiert PNG-Dateien auf Größe durch Verbesserung der Kompression ohne Qualitätsverlust<br />
* [http://www.wholetomato.com/ Visual Assist X] bietet verbessertes Syntax-Highlighting und intelligente Codevervollständigung sowie Refactoring für Visual Studio<br />
* [http://www.codeandweb.com/texturepacker TexturePacker] vereinfacht das Erstellen von Spritesheets, direkter Export für viele Engines bereits enthalten<br />
<br />
=== Diagramm-Tools ===<br />
<br />
Eine Auflistung von UML-Tools ist unter [http://www.jeckle.de/umltools.html jeckle.de] zu finden.<br />
<br />
* [http://live.gnome.org/Dia Dia] Programm zum Erzeugen von (Klassen-)Diagrammen und Zeichnungen<br />
* [http://argouml.tigris.org/ ArgoUML] Programm zum Erzeugen von UML-Diagrammen<br />
* [http://www.microtool.de/objectif/de/index.asp ObjectiF] {{Kostenpflichtig}} Programm zum Erzeugen von UML-Diagrammen<br />
<br />
=== Versionsverwaltungssysteme ===<br />
<br />
* [http://subversion.tigris.org/ Subversion] Zentralisierte Versionsverwaltung<br />
* [http://git-scm.com/ Git] Verteilte Versionsverwaltung<br />
* [https://www.mercurial-scm.org/ Mercurial] Verteilte Versionsverwaltung<br />
<br />
=== Level-Editoren und -Generatoren ===<br />
<br />
* [http://tide.codeplex.com/ tIDE (Tilemap Integrated Development Environment)] Sehr flexibler 2D-Tilemap-Editor mit Plugin-Unterstützung<br />
* [http://ogmoeditor.com/ Ogmo Editor] 2D-Tilemap-Editor<br />
* [http://www.mapeditor.org/ Tiled] 2D-Tilemap-Editor<br />
* [http://www.bundysoft.com/L3DT/ L3DT (Large 3D Terrain Generator)] {{Bedingt kostenpflichtig}}<br />
* [http://www.davidwaltersdevelopment.com/tools/gridcart/ Grid Cartographer] {{Bedingt kostenpflichtig}}<br />
<br />
=== Namensgeneratoren ===<br />
<br />
* [http://ebon.pyorre.net/ Everchanging Book of Names] {{Bedingt kostenpflichtig}}<br />
* [http://www.rinkworks.com/namegen/ Fantasy Name Generator]<br />
* [http://www.behindthename.com/random/ Behind the Name: Random Name Generator]<br />
* [http://www.dotomator.com/web20.html/ Dotomator: Web 2.0 Name Generator]<br />
<br />
== Software zur Content-Erstellung ==<br />
<br />
=== 3D-Modellierung ===<br />
<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?id=14642267&siteID=403786 3ds Max] {{Kostenpflichtig}}<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?siteID=403786&id=14657512 Maya] {{Kostenpflichtig}}<br />
* [http://www.blender.org/ Blender] {{Kostenfrei}}<br />
* [http://www.maxon.net/ CINEMA 4D] {{Kostenpflichtig}}<br />
* [http://nevercenter.com/silo/ Silo] {{Kostenpflichtig}}<br />
* [http://3d-coat.com/ 3D-Coat] {{Kostenpflichtig}}<br />
* [http://www.pixologic.com/sculptris/ Sculptris]<br />
* [http://www.daz3d.com/i/products/hexagon? Hexagon 2] {{Kostenpflichtig}}<br />
* [http://www.makehuman.org/ Makehuman] {{Kostenfrei}} ist ein Open Source-Projekt zur flexiblen Erstellung menschlicher 3D-Modelle<br />
* [http://www.anim8or.com/ Anim8or] ist ein beliebtes Modellierungsprogramm mit Animationsmöglichkeiten<br />
* [https://www.daz3d.com/get_studio DAZ Studio] {{Kostenfrei}}<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.adobe.com/de/products/photoshop.html Adobe Photoshop] {{Kostenpflichtig}}<br />
* [http://www.gimp.org/ GIMP (GNU Image Manipulation Program)]<br />
* [http://inkscape.org/ Inkscape]<br />
* [http://www.paint.net/ Paint.NET]<br />
* [http://www.cosmigo.com/promotion/ Cosmigo Pro Motion] {{Kostenpflichtig}}<br />
* [http://www.humanbalance.net/gale/us/ GraphicsGale] {{Kostenpflichtig}}<br />
* [http://www.aseprite.org/ Aseprite]<br />
* [http://www.piskelapp.com/ PiskelApp]<br />
* [http://renderhjs.net/shoebox/ ShoeBox]<br />
* [http://www.pickleeditor.com/ Pickle] {{Kostenpflichtig}}<br />
* [http://pyxeledit.com/ Pyxel Edit] {{Kostenpflichtig}}<br />
* [http://www.snakehillgames.com/spritelamp/ Sprite Lamp] {{Kostenpflichtig}}<br />
* [http://autotilegen.com/ AutoTileGen] {{Kostenpflichtig}}<br />
* [http://www.brashmonkey.com/spriter.htm Spriter] {{Kostenpflichtig}}<br />
* [http://hexraystudios.com/hexels/ Hexels]<br />
* [http://de.esotericsoftware.com/ Spine] {{Kostenpflichtig}}<br />
* [http://www.vitruality.com/tools/spartan/ Spartan]<br />
* [https://krita.org/ Krita]<br />
* [https://www.allegorithmic.com/ Allegorithmic Substance Designer / Painter] {{Kostenpflichtig}}<br />
* [http://icofx.ro/ IcoFX] {{Kostenpflichtig}}<br />
<br />
=== Audio ===<br />
<br />
* [http://audacity.sourceforge.net/ Audacity]<br />
* [http://lmms.sourceforge.net/ LMMS]<br />
* [http://flstudio.image-line.com/ FL Studio] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/products/audition.html Adobe Audition] {{Kostenpflichtig}}<br />
* [http://www.renoise.com/ Renoise] {{Kostenpflichtig}}<br />
* [http://www.drpetter.se/project_sfxr.html sfxr]<br />
* [http://goldwave.com/ GoldWave] {{Kostenpflichtig}}<br />
* [http://www.steinberg.net/de/products/cubase/start.html Cubase] {{Kostenpflichtig}}<br />
* [http://www.reaper.fm/ Reaper] {{Kostenpflichtig}}<br />
* [http://www.bitwig.com/en/bitwig-studio/overview.html Bitwig Studio] {{Kostenpflichtig}}<br />
* [http://famitracker.com/ Famitracker]<br />
* [http://boscaceoil.net/ Bosca Ceiol]<br />
<br />
=== Video ===<br />
<br />
==== Aufnahme ====<br />
<br />
* [http://www.mirillis.com/de Mirillis] {{Kostenpflichtig}}<br />
* [http://www.bandicam.com/de Bandicam] {{Bedingt kostenpflichtig}}<br />
* [http://exkode.com/dxtory-features-en.html Dxtory] {{Kostenpflichtig}}<br />
* [http://www.fraps.com Fraps] {{Kostenpflichtig}}<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.videolan.org/vlc/ VLC Media Player]<br />
* [http://camstudio.org/ CamStudio]<br />
* [http://www.playclaw.com/de/ PlayClaw] {{Kostenpflichtig}}<br />
* [https://obsproject.com/ Open Broadcast Software]<br />
<br />
==== Verarbeitung ====<br />
<br />
* [http://www.virtualdub.org/ VirtualDub]<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.sonycreativesoftware.com/vegassoftware Sony Vegas] {{Kostenpflichtig}}<br />
* [http://handbrake.fr Handbrake]<br />
* [http://www.lightworksbeta.com/ Lightworks]<br />
* [http://tmpgenc.pegasys-inc.com/de/product/tvmw5.html TMPGEnc Video Mastering Works 5] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/de/products/premiere.html Adobe Premiere] {{Kostenpflichtig}}<br />
* [http://staxmedia.sourceforge.net/ StaxRip]<br />
* [http://sourceforge.net/projects/megui/ MeGUI]<br />
* [http://explore.live.com/windows-live-movie-maker Windows Live Movie Maker]<br />
<br />
== Fertiger Content ==<br />
<br />
Hier soll auf Seiten verwiesen werden, auf denen man (vorzugsweise kostenlose) Grafiken, 3D-Modelle, Soundeffekte und Musikstücke finden kann.<br />
<br />
* [http://kenney.itch.io/kenney-donation Kenney Donation Pack] ist eine Sammlung von über 6000 frei verwendbaren Assets, für die der Autor eine Spende verlangt<br />
* [http://content.gpwiki.org/index.php/Game_Content_Resources Umfangreiche Link-Sammlung im GPWiki]<br />
* [http://www.reinerstilesets.de Reiner's Tilesets] {{Kostenfrei}} enthält nicht nur Tilesets, sondern auch 3D-Modelle, Texturen, Soundeffekte und Tutorials<br />
<br />
=== 3D-Modelle ===<br />
<br />
* [http://www.3dcafe.com/ 3D Cafe] {{Bedingt kostenpflichtig}} bietet auch kostenlose 3D-Modelle, wenn man zuvor mindestens drei eigene Modelle auf die Seite geladen hat<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=10 OpenGameArt 3D] {{Kostenfrei}} Frei lizensierte 3D-Modelle<br />
* [http://www.blendswap.com/ blendswap] {{Kostenfrei}} Frei lizensierte Blender-Modelle<br />
* [http://www.daz3d.com/new-releases?dir=asc&order=price DAZ 3D Marketplace] {{Kostenpflichtig}}<br />
* [http://arteria3d.com/collections/audio/Medieval Arteria3d] {{Kostenpflichtig}}<br />
<br />
=== Grafiken und Texturen ===<br />
* [http://www.3d.sk/ 3D.SK] {{Kostenpflichtig}} Referenzbilder von Menschen speziell für 3D-Modellierung und Spieleentwicklung<br />
* [http://www.cgtextures.com/ CGTextures] {{Bedingt kostenpflichtig}} bietet eine große Sammlung kostenlos benutzbarer Texturen<br />
* [http://www.environment-textures.com/ Environment Textures] {{Kostenpflichtig}}<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=9 OpenGameArt 2D] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=14 Texturen] {{Kostenfrei}} Legale, frei lizensierte Grafiken<br />
* [http://www.lostgarden.com/ Lost Garden Art] {{Kostenfrei}}<br />
* [http://charas-project.net/ Charas Project] {{Kostenfrei}}<br />
* [http://spriters-resource.com/ The Spriters Resource] {{Kostenfrei}}<br />
* [https://vxresource.wordpress.com/ RPG Maker VX Resource Planet] {{Kostenfrei}}<br />
<br />
=== Soundeffekte und Musik ===<br />
<br />
* [http://www.audiomicro.com/ AudioMicro] {{Kostenpflichtig}}<br />
* [http://www.freesound.org/ Freesound] {{Kostenfrei}} Frei lizensierte community-kreierte Sounds<br />
* [http://incompetech.com/m/c/royalty-free/ Incompetech] {{Kostenfrei}} Musik unter der Creative Commons Attribution Lizenz (CC-BY)<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12 OpenGameArt Musik] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=13 Sounds] {{Kostenfrei}} Frei lizensierte Audiodateien<br />
* [http://www.soundsnap.com/ Soundsnap] {{Kostenpflichtig}}<br />
* [http://www.bensound.com/ bensound] {{Kostenfrei}}<br />
* [https://www.jamendo.com/ Jamendo] {{Bedingt kostenpflichtig}}<br />
<br />
=== Schriftarten ===<br />
<br />
* [http://www.dafont.com/ Dafont.com] {{Kostenfrei}}<br />
* [http://www.myfont.de/ MyFont.de] {{Kostenfrei}}<br />
* [http://openfontlibrary.org/ OpenFontLibrary] {{Kostenfrei}} Frei lizensierte Schriftarten<br />
* [http://www.urbanfonts.com/ Urban Fonts] {{Kostenfrei}}<br />
<br />
== Sonstiges ==<br />
<br />
* [http://www.wotsit.org/ Wotsit.org] Große Datenbank mit Beschreibung von Dateiformaten (nützlich, wenn man ein bestimmtes Dateiformat lesen oder schreiben möchte) '''Seite ist offline'''<br />
* [http://www.wsusoffline.net/ WSUS Offline Updater] erzeugt komplette Offline-Updates (CD/DVD(.iso)/USB-Sticks) aller Windows/Office 2003-2013/C++ Laufzeit/.NET-Framework-Versionen.<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/%C3%9Cbersicht_%C3%BCber_AutorensytemeÜbersicht über Autorensyteme2019-02-03T21:37:47Z<p>David Scherfgen: verschob „Übersicht über Authorensyteme“ nach „Übersicht über Autorensyteme“: Falsche Schreibweise</p>
<hr />
<div>[[Kategorie:Für Einsteiger]]<br />
= Definition = <br />
<br />
Autorensysteme sind Engines, welche eine grafischen Ressourcenverwaltung und einen Worldeditor integriert haben. Die meisten Autorensysteme haben auch noch eine integrierte IDE für bestimmte Sprachen.<br />
<br />
= Aufteilung der Autorensysteme =<br />
Die Authorensysteme werden in dieser Liste, nach der Art der Programmierung, in drei Kategorien aufgeteilt: Visuelle Programmierung, Kombinierte Programmierung, Code Programmierung.<br /><br />
In dieser Liste wird die Art der visiuellen Programmierung hauptsächlich in drei Arten unterschieden:<br /><br />
[[Datei:GDevelop5ed.jpg|200px|thumb|none|Beispiel: Eventsystem von Gdevelop 5]]<br />
[[Datei:Godot3_Nodeed.jpg|200px|thumb|none|Beispiel: Nodesystem von Godot 3]]<br />
[[Datei:Code Block Builder.png|200px|thumb|none|Beispiel: Codeblockbuilder von Stencyl]]<br /><br /><br />
<br />
= Die Liste der Autorensysteme: =<br />
<br />
<br />
== Autorensysteme mit visueller Programmierung: ==<br />
<br />
Bezeichnung: Fusion 2.5<br /><br />
<br />
Ersteller: Clickteam<br /><br />
<br />
Programmierung: Eventsytem<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX (extra Version)<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: GDevelop<br /><br />
<br />
Ersteller: Florian Rival und Mitwirkende<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX, Linux<br /><br />
<br />
Build-Plattformen: Android, HTML5, iOS, Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Construct 2<br /><br />
<br />
Ersteller: Scirra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Construct 3<br /><br />
<br />
Ersteller: Scirra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Web(Free), HTML 5 Offline<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Gamesalad Creator<br /><br />
<br />
Ersteller: Gamesalad Inc.<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Coppercube<br /><br />
<br />
Ersteller: Ambierra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Android<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Tombstone Engine<br /><br />
<br />
Ersteller: Terathon Software LLC<br /><br />
<br />
Programmierung: Nodeskript<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
== Autorensysteme mit kombinierter Programmierung: ==<br />
<br />
<br />
Bezeichnung: RPG Maker<br /><br />
<br />
Ersteller: Enterbrain<br /><br />
<br />
Programmierung: Eventsystem, RGSS (ab XP)<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX (MV)<br /><br />
<br />
Build-Plattformen: Windows, MV: MacOSX, Android<br /><br />
<br />
Deutsche Community: [http://www.rpg-studio.org/forum/index.php RPG-Studio], [https://rpgmaker-mv.de/ RPG Maker MV], [https://rpg-atelier.net/ RPG-Atelier (Multimediaxis Forum)]<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Game Maker Studio 1.4<br /><br />
<br />
Ersteller: Yoyo Games/ Playtech Ltd<br /><br />
<br />
Programmierung: Eventsystem, GML<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows (Free), HTML5, Mac OSX, Android, iOS, Tizen, Konsolen<br /><br />
<br />
Deutsche Community: [http://www.gm-d.de/wbb/?s=3e12df84d177861be5f79a000e81ef16c9ea252f Deutschsprachiige Gamemaker Communtity]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Game Maker Studio 2<br /><br />
<br />
Ersteller: Yoyo Games/ Playtech Ltd<br /><br />
<br />
Programmierung: Eventsystem oder GML<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows (Free), HTML5, Mac OSX, Android, iOS, Tizen, Konsolen<br /><br />
<br />
Deutsche Community: [http://www.gm-d.de/wbb/?s=3e12df84d177861be5f79a000e81ef16c9ea252f Deutschsprachiige Gamemaker Communtity]<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Stencyl<br /><br />
<br />
Ersteller: Stencyl LLC<br /><br />
<br />
Programmierung: Codeblockbuilder, Code selber programmieren<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Flash, HTML 5 (Beta), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Godot 3<br /><br />
<br />
Ersteller: Juan Linietsky, Ariel Manzur und Community<br /><br />
<br />
Programmierung: Nodeskript, GDScript, C# (Mono)<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux, BSD<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, BSD, Android, iOS, HTML5<br /><br />
<br />
Deutsche Community: [https://www.godot-community.de/ Deutschsprachiige Godot Communtity]<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Unreal 4<br /><br />
<br />
Ersteller: Epic Games<br /><br />
<br />
Programmierung: Blueprint (Nodeskript), C++<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, HTML 5, Konsolen, VR<br /><br />
<br />
Deutsche Community: [https://www.unrealengine4.de/ Unrealengine4.de]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
== Autorensysteme mit Code Programmierung ==<br />
<br />
<br />
Bezeichnung: Unity 5<br /><br />
<br />
Ersteller: Unity Technologies<br /><br />
<br />
Programmierung: Unityscript, C#<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, HTML 5, Konsolen, VR<br /><br />
<br />
Deutsche Community: [https://forum.unity-community.de/ Unity Insider Forum]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: jMonkey Engine<br /><br />
<br />
Ersteller: Erlend Sogge Heggen, Skye Book, Kirill Vainer, Normen Hansen<br /><br />
<br />
Programmierung: Java<br /><br />
<br />
Dev.-Plattformen: Windows Mac OSX, Linux, BSD<br /><br />
<br />
Build-Plattformen: Alle JVM unterstützenden Plattformen<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Cryengine 5<br /><br />
<br />
Ersteller: Crytek<br /><br />
<br />
Programmierung: C++, C#, Lua<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows, Linux, iOS, Konsolen<br /><br />
<br />
Deutsche Community: [https://crytek.4thdimension.info/forum/ Crytek Forum auf 4thdimension.de]<br /><br />
<br />
Kosten: So viel man zahlen will<br /><br />
<br />
<br />
Bezeichnung: 3D Gamestudio A8<br /><br />
<br />
Ersteller: Conitec und oP Group<br /><br />
<br />
Programmierung: lite-c<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: [http://forum.3dgs-hobbyschmiede.de/ 3dgs-hobbyschmiede]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Neoaxis Engine<br /><br />
<br />
Ersteller: Neoaxis Group LTD<br /><br />
<br />
Programmierung: C#<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Duality<br /><br />
<br />
Ersteller: Adam<br /><br />
<br />
Programmierung: C#<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Torque 3D<br /><br />
<br />
Ersteller: Garage Games<br /><br />
<br />
Programmierung: Torquescript<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Source 2 Engine<br /><br />
<br />
Ersteller: Valve<br /><br />
<br />
Programmierung: C++<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
= Die Links zu den Autorensystemen =<br />
<br />
Die Links zu den Autorensystemenen findet ihr in unserer Linksamlung [[Link-Sammlung|hier]], unter den Punkt 3.</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/%C3%9Cbersicht_%C3%BCber_AutorensytemeÜbersicht über Autorensyteme2019-02-03T21:37:17Z<p>David Scherfgen: </p>
<hr />
<div>[[Kategorie:Für Einsteiger]]<br />
= Definition = <br />
<br />
Autorensysteme sind Engines, welche eine grafischen Ressourcenverwaltung und einen Worldeditor integriert haben. Die meisten Autorensysteme haben auch noch eine integrierte IDE für bestimmte Sprachen.<br />
<br />
= Aufteilung der Autorensysteme =<br />
Die Authorensysteme werden in dieser Liste, nach der Art der Programmierung, in drei Kategorien aufgeteilt: Visuelle Programmierung, Kombinierte Programmierung, Code Programmierung.<br /><br />
In dieser Liste wird die Art der visiuellen Programmierung hauptsächlich in drei Arten unterschieden:<br /><br />
[[Datei:GDevelop5ed.jpg|200px|thumb|none|Beispiel: Eventsystem von Gdevelop 5]]<br />
[[Datei:Godot3_Nodeed.jpg|200px|thumb|none|Beispiel: Nodesystem von Godot 3]]<br />
[[Datei:Code Block Builder.png|200px|thumb|none|Beispiel: Codeblockbuilder von Stencyl]]<br /><br /><br />
<br />
= Die Liste der Autorensysteme: =<br />
<br />
<br />
== Autorensysteme mit visueller Programmierung: ==<br />
<br />
Bezeichnung: Fusion 2.5<br /><br />
<br />
Ersteller: Clickteam<br /><br />
<br />
Programmierung: Eventsytem<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX (extra Version)<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: GDevelop<br /><br />
<br />
Ersteller: Florian Rival und Mitwirkende<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX, Linux<br /><br />
<br />
Build-Plattformen: Android, HTML5, iOS, Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Construct 2<br /><br />
<br />
Ersteller: Scirra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Construct 3<br /><br />
<br />
Ersteller: Scirra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Web(Free), HTML 5 Offline<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Gamesalad Creator<br /><br />
<br />
Ersteller: Gamesalad Inc.<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: HTML5 (Free), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Coppercube<br /><br />
<br />
Ersteller: Ambierra<br /><br />
<br />
Programmierung: Eventsystem<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Android<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Tombstone Engine<br /><br />
<br />
Ersteller: Terathon Software LLC<br /><br />
<br />
Programmierung: Nodeskript<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
== Autorensysteme mit kombinierter Programmierung: ==<br />
<br />
<br />
Bezeichnung: RPG Maker<br /><br />
<br />
Ersteller: Enterbrain<br /><br />
<br />
Programmierung: Eventsystem, RGSS (ab XP)<br /><br />
<br />
Dev.-Plattformen: Windows, MacOSX (MV)<br /><br />
<br />
Build-Plattformen: Windows, MV: MacOSX, Android<br /><br />
<br />
Deutsche Community: [http://www.rpg-studio.org/forum/index.php RPG-Studio], [https://rpgmaker-mv.de/ RPG Maker MV], [https://rpg-atelier.net/ RPG-Atelier (Multimediaxis Forum)]<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Game Maker Studio 1.4<br /><br />
<br />
Ersteller: Yoyo Games/ Playtech Ltd<br /><br />
<br />
Programmierung: Eventsystem, GML<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows (Free), HTML5, Mac OSX, Android, iOS, Tizen, Konsolen<br /><br />
<br />
Deutsche Community: [http://www.gm-d.de/wbb/?s=3e12df84d177861be5f79a000e81ef16c9ea252f Deutschsprachiige Gamemaker Communtity]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Game Maker Studio 2<br /><br />
<br />
Ersteller: Yoyo Games/ Playtech Ltd<br /><br />
<br />
Programmierung: Eventsystem oder GML<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows (Free), HTML5, Mac OSX, Android, iOS, Tizen, Konsolen<br /><br />
<br />
Deutsche Community: [http://www.gm-d.de/wbb/?s=3e12df84d177861be5f79a000e81ef16c9ea252f Deutschsprachiige Gamemaker Communtity]<br /><br />
<br />
Kosten: Ja<br /><br />
<br />
<br />
Bezeichnung: Stencyl<br /><br />
<br />
Ersteller: Stencyl LLC<br /><br />
<br />
Programmierung: Codeblockbuilder, Code selber programmieren<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Flash, HTML 5 (Beta), Windows, Mac OSX, Android, iOS<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Godot 3<br /><br />
<br />
Ersteller: Juan Linietsky, Ariel Manzur und Community<br /><br />
<br />
Programmierung: Nodeskript, GDScript, C# (Mono)<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux, BSD<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, BSD, Android, iOS, HTML5<br /><br />
<br />
Deutsche Community: [https://www.godot-community.de/ Deutschsprachiige Godot Communtity]<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Unreal 4<br /><br />
<br />
Ersteller: Epic Games<br /><br />
<br />
Programmierung: Blueprint (Nodeskript), C++<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, HTML 5, Konsolen, VR<br /><br />
<br />
Deutsche Community: [https://www.unrealengine4.de/ Unrealengine4.de]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
== Autorensysteme mit Code Programmierung ==<br />
<br />
<br />
Bezeichnung: Unity 5<br /><br />
<br />
Ersteller: Unity Technologies<br /><br />
<br />
Programmierung: Unityscript, C#<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux, HTML 5, Konsolen, VR<br /><br />
<br />
Deutsche Community: [https://forum.unity-community.de/ Unity Insider Forum]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: jMonkey Engine<br /><br />
<br />
Ersteller: Erlend Sogge Heggen, Skye Book, Kirill Vainer, Normen Hansen<br /><br />
<br />
Programmierung: Java<br /><br />
<br />
Dev.-Plattformen: Windows Mac OSX, Linux, BSD<br /><br />
<br />
Build-Plattformen: Alle JVM unterstützenden Plattformen<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Cryengine 5<br /><br />
<br />
Ersteller: Crytek<br /><br />
<br />
Programmierung: C++, C#, Lua<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows, Linux, iOS, Konsolen<br /><br />
<br />
Deutsche Community: [https://crytek.4thdimension.info/forum/ Crytek Forum auf 4thdimension.de]<br /><br />
<br />
Kosten: So viel man zahlen will<br /><br />
<br />
<br />
Bezeichnung: 3D Gamestudio A8<br /><br />
<br />
Ersteller: Conitec und oP Group<br /><br />
<br />
Programmierung: lite-c<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: [http://forum.3dgs-hobbyschmiede.de/ 3dgs-hobbyschmiede]<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Neoaxis Engine<br /><br />
<br />
Ersteller: Neoaxis Group LTD<br /><br />
<br />
Programmierung: C#<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Teilweise<br /><br />
<br />
<br />
Bezeichnung: Duality<br /><br />
<br />
Ersteller: Adam<br /><br />
<br />
Programmierung: C#<br /><br />
<br />
Dev.-Plattformen: Windows<br /><br />
<br />
Build-Plattformen: Windows<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Torque 3D<br /><br />
<br />
Ersteller: Garage Games<br /><br />
<br />
Programmierung: Torquescript<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
<br />
Bezeichnung: Source 2 Engine<br /><br />
<br />
Ersteller: Valve<br /><br />
<br />
Programmierung: C++<br /><br />
<br />
Dev.-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Build-Plattformen: Windows, Mac OSX, Linux<br /><br />
<br />
Deutsche Community: Nein<br /><br />
<br />
Kosten: Nein<br /><br />
<br />
= Die Links zu den Autorensystemen =<br />
<br />
Die Links zu den Autorensystemenen findet ihr in unserer Linksamlung [[Link-Sammlung|hier]], unter den Punkt 3.</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2018-06-19T14:59:47Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* '''Achte auf fremdes Urheberrecht. "Fan-Projekte", die unerlaubt Markennamen verwenden, Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle, Musik o. Ä. aus anderen Spielen ungefragt zu verwenden ist nicht akzeptabel.'''<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du (idealerweise mit "Kostproben" deines bisherigen Schaffens)?<br />
* Beschreibe das Spiel ausführlich. Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe, denn erfahrungsgemäß meldet sich dafür niemand.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2018-06-19T14:58:19Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* '''Achte auf fremdes Urheberrecht. "Fan-Projekte", die unerlaubt Markennamen verwenden, Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du (idealerweise mit "Kostproben" deines bisherigen Schaffens)?<br />
* Beschreibe das Spiel ausführlich. Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe, denn erfahrungsgemäß meldet sich dafür niemand.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2018-06-19T14:57:25Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* '''Achte auf fremdes Urheberrecht. "Fan-Projekte", die unerlaubt Markennamen verwenden, Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe, denn erfahrungsgemäß meldet sich dafür niemand.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2018-06-19T14:57:06Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* '''Achte auf fremdes Urheberrecht. "Fan-Projekte", die unerlaubt Markennamen verwenden, Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.''' Erfahrungsgemäß meldet sich dafür niemand.<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/PatentePatente2018-06-19T14:54:09Z<p>David Scherfgen: </p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
Hier lernt Ihr wie Ihr mit Patenten, beispielsweise von Wettbewerbern umgeht. <br />
<br />
'''Abmahnungen oder ähnliche Drohungen''' sollten genau geprüft werden. Fraglich ist zunächst, ob Euer Produkt überhaupt in den Schutzbereich des vermeintlichen Schutzrechts fällt. Steht in den Patentansprüchen etwas, was Ihr nicht umsetzt, so stehen die Chancen gut für Euch. Falls Ihr das vermeintliche Patent verletzt, wäre zu überprüfen, ob das Patent valide ist. Reine Softwarepatente (z.B. Wiedergabe von Information als solche) sind zu widerrufen. Da ensprechende Verfahren recht teuer sind, solltet Ihr prüfen ob man sich aussergerichtlich einigt. Evtl. habt Ihr selbst ein Schutzrecht, welches Ihr dann der Gegenseite vorhalten könnt. Insofern kann eine vorbeugende Maßnahme die Anmeldung eines eigenen Schutzrechts zur Verteidigung sein. Erfahrungsgemäß werden kleinere Entwickler jedoch typischerweise nicht angegriffen, meist trifft es Entwickler mit größerem Volumen, bei denen auch mehr zu holen ist.<br />
<br />
'''Wollt Ihr selbst ein Patent anmelden''', so müsst Ihr darauf achten, dass Ihr eben nicht ein solches Softwarepatent anstrebt. Ihr müsst also prüfen, ob ein technischer Beitrag über den Stand der Technik hinaus durch die Erfindung geboten ist. Im Zweifel hilft Euch ein Patentanwalt. Der technische Beitrag wird im Rahmen der erfinderischen Tätigkeit geprüft. Erfinderisch ist, was nicht nur neu ist, sondern auch eine gewisse Erfindungshöhe hat, also nicht trivial ist. Am wichitigsten ist, dass Eure Erfindung nicht veröffentlicht wurde. Ihr müsst also zuerst anmelden und könnt dann zu Investoren und anderen gehen. Geheimhaltungsverpflichtungen sind schwer zu überprüfen und schützt in der Praxis typischerweise nicht davor, dass Euer Investor selbst anmeldet.<br />
<br />
Weitere Information findet Ihr z.B. hier: [http://patente.gi.de/ Arbeitskreis Patente, Gesellschaft für Informatik e.V.]<br />
<br />
<br />
Einige Leitsätze aus der Rechtsprechung:<br />
<br />
* Eine mathematische Methode kann nur dann als nicht-technisch angesehen werden, wenn sie im Zusammenhang mit der beanspruchten Lehre keinen Bezug zur gezielten Anwendung von Naturkräften aufweist.<br />
* Ein ausreichender Bezug zur gezielten Anwendung von Naturkräften liegt vor, wenn eine mathematische Methode zu dem Zweck herangezogen wird, anhand von zur Verfügung stehenden Messwerten zuverlässigere Erkenntnisse über den Zustand eines Flugzeugs zu gewinnen und damit die Funktionsweise des Systems, das der Ermittlung dieses Zustands dient, zu beeinflussen.<br />
* Ein Gegenstand, der neu ist und auf erfinderischer Tätigkeit beruht, kann nicht allein deshalb als nicht patentfähig angesehen werden, weil er im Vergleich zum Stand der Technik keinen erkennbaren Vorteil bietet. <br />
* Anweisungen zur Auswahl von Daten, deren technischer Aspekt sich auf die Anweisung beschränkt, hierzu Mittel der elektronischen Datenverarbeitung einzusetzen, können jedenfalls bei der Beurteilung der erfinderischen Tätigkeit nicht berücksichtigt werden (Bestätigung von BGH, Urteil vom 26. Oktober 2010 - X ZR 47/07, GRUR 2011, 125 Rn. 36 - Wiedergabe topografischer Informationen).<br />
* Dies gilt auch dann, wenn solche Anweisungen zu einer Verringerung der erforderlichen Rechenschritte führen.</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/PatentePatente2018-06-19T14:54:04Z<p>David Scherfgen: </p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
<br />
Hier lernt Ihr wie Ihr mit Patenten, beispielsweise von Wettbewerbern umgeht. <br />
<br />
'''Abmahnungen oder ähnliche Drohungen''' sollten genau geprüft werden. Fraglich ist zunächst, ob Euer Produkt überhaupt in den Schutzbereich des vermeintlichen Schutzrechts fällt. Steht in den Patentansprüchen etwas, was Ihr nicht umsetzt, so stehen die Chancen gut für Euch. Falls Ihr das vermeintliche Patent verletzt, wäre zu überprüfen, ob das Patent valide ist. Reine Softwarepatente (z.B. Wiedergabe von Information als solche) sind zu widerrufen. Da ensprechende Verfahren recht teuer sind, solltet Ihr prüfen ob man sich aussergerichtlich einigt. Evtl. habt Ihr selbst ein Schutzrecht, welches Ihr dann der Gegenseite vorhalten könnt. Insofern kann eine vorbeugende Maßnahme die Anmeldung eines eigenen Schutzrechts zur Verteidigung sein. Erfahrungsgemäß werden kleinere Entwickler jedoch typischerweise nicht angegriffen, meist trifft es Entwickler mit größerem Volumen, bei denen auch mehr zu holen ist.<br />
<br />
'''Wollt Ihr selbst ein Patent anmelden''', so müsst Ihr darauf achten, dass Ihr eben nicht ein solches Softwarepatent anstrebt. Ihr müsst also prüfen, ob ein technischer Beitrag über den Stand der Technik hinaus durch die Erfindung geboten ist. Im Zweifel hilft Euch ein Patentanwalt. Der technische Beitrag wird im Rahmen der erfinderischen Tätigkeit geprüft. Erfinderisch ist, was nicht nur neu ist, sondern auch eine gewisse Erfindungshöhe hat, also nicht trivial ist. Am wichitigsten ist, dass Eure Erfindung nicht veröffentlicht wurde. Ihr müsst also zuerst anmelden und könnt dann zu Investoren und anderen gehen. Geheimhaltungsverpflichtungen sind schwer zu überprüfen und schützt in der Praxis typischerweise nicht davor, dass Euer Investor selbst anmeldet.<br />
<br />
Weitere Information findet Ihr z.B. hier: [http://patente.gi.de/ Arbeitskreis Patente, Gesellschaft für Informatik e.V.]<br />
<br />
<br />
Einige Leitsätze aus der Rechtsprechung:<br />
<br />
* Eine mathematische Methode kann nur dann als nicht-technisch angesehen werden, wenn sie im Zusammenhang mit der beanspruchten Lehre keinen Bezug zur gezielten Anwendung von Naturkräften aufweist.<br />
* Ein ausreichender Bezug zur gezielten Anwendung von Naturkräften liegt vor, wenn eine mathematische Methode zu dem Zweck herangezogen wird, anhand von zur Verfügung stehenden Messwerten zuverlässigere Erkenntnisse über den Zustand eines Flugzeugs zu gewinnen und damit die Funktionsweise des Systems, das der Ermittlung dieses Zustands dient, zu beeinflussen.<br />
* Ein Gegenstand, der neu ist und auf erfinderischer Tätigkeit beruht, kann nicht allein deshalb als nicht patentfähig angesehen werden, weil er im Vergleich zum Stand der Technik keinen erkennbaren Vorteil bietet. <br />
* Anweisungen zur Auswahl von Daten, deren technischer Aspekt sich auf die Anweisung beschränkt, hierzu Mittel der elektronischen Datenverarbeitung einzusetzen, können jedenfalls bei der Beurteilung der erfinderischen Tätigkeit nicht berücksichtigt werden (Bestätigung von BGH, Urteil vom 26. Oktober 2010 - X ZR 47/07, GRUR 2011, 125 Rn. 36 - Wiedergabe topografischer Informationen).<br />
* Dies gilt auch dann, wenn solche Anweisungen zu einer Verringerung der erforderlichen Rechenschritte führen.</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Link-SammlungLink-Sammlung2018-06-13T21:01:27Z<p>David Scherfgen: Die letzte Änderung von Firedragon wurde verworfen und die Version 3119 von David Scherfgen wiederhergestellt: Link kann nicht nach Überschrift eingefügt werden</p>
<hr />
<div>In diesem Artikel sollen Links gesammelt werden, die für die Spieleentwicklung nützlich sind.<br />
<br />
== Webseiten und Tutorials zur Spieleentwicklung ==<br />
<br />
* [http://www.gamedev.net/ GameDev.net] Große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gamasutra.com/ Gamasutra] Weitere große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gpwiki.org/ Game Programming Wiki] Englischsprachiges Wiki zum Thema Spieleentwicklung<br />
* [http://gafferongames.com/ Game Development + Game Programming Tutorials von Glenn Fiedler] Hochqualitative Reihe von Artikeln und Tutorials zu technischen Aspekten der Spieleprogrammierung<br />
* [http://www.ludism.org/gamedesign/ Game Design Wiki] ist ein nicht-technisches Wiki zum Thema Game-Design<br />
* [http://chrishecker.com/ Chris Hecker's Homepage] enthält viele technische Artikel<br />
* [http://en.wikibooks.org/wiki/OpenGL_Programming Wikibooks OpenGL] enthält viele moderne, englische Tutorials über OpenGL<br />
* [http://www.spieleprogrammierung.net/ Spieleprogrammierung.net] bietet deutschsprachige Tutorials zu OpenGL, OpenAL und OpenCL<br />
* [http://www.gamedevelop.eu/ Gamedevelop.eu] enthält deutschsprachige Artikel und Tutorials zur Spieleentwicklung<br />
* [http://www.makinggames.de/ Makinggames.de] enhält interessante Artikel zum thema Spieleentwicklung<br />
* [http://gameprogrammingpatterns.com/ GameProgrammingPatterns.com] enthält wenige, aber ausführliche Artikel zu Design Patterns in der Spieleentwicklung<br />
* [http://natureofcode.com/ The Nature of Code] ist ein frei verfügbares, aber auch kaufbares Buch über Grundkonzepte und fortgeschrittene Themen der Spieleentwicklung<br />
<br />
== Literatur zur Spieleentwicklung ==<br />
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}<br />
* {{Amazon|3446405968|"3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen}}<br />
* "Game Programming Gems"-Reihe<br />
** {{Amazon|1584500492|"Game Programming Gems 1"}} und {{Amazon|3826609239|die deutsche Übersetzung}}<br />
** {{Amazon|1584500549|"Game Programming Gems 2"}}<br />
** {{Amazon|1584502339|"Game Programming Gems 3"}}<br />
** {{Amazon|1584502959|"Game Programming Gems 4"}} und {{Amazon|3446229442|die deutsche Übersetzung}}<br />
** {{Amazon|1584503521|"Game Programming Gems 5"}}<br />
** {{Amazon|1584504501|"Game Programming Gems 6"}}<br />
** {{Amazon|1584505273|"Game Programming Gems 7"}}<br />
** {{Amazon|1584507020|"Game Programming Gems 8"}}<br />
* "GPU Gems"-Reihe<br />
** {{Amazon|0321228324|"GPU Gems 1"}} [http://http.developer.nvidia.com/GPUGems/gpugems_pref01.html (kostenlos online lesbar)]<br />
** {{Amazon|0321335597|"GPU Gems 2"}} [http://http.developer.nvidia.com/GPUGems2/gpugems2_frontmatter.html (kostenlos online lesbar)]<br />
** {{Amazon|0321515269|"GPU Gems 3"}} und {{Amazon|B000UZQH52|die Kindle-eBook-Version}} [http://http.developer.nvidia.com/GPUGems3/gpugems3_pref01.html (kostenlos online lesbar)]<br />
* [http://www.gdcvault.com/gdmag Game Developer Magazine (alle Ausgaben von 1994-2013 gratis)]<br />
<br />
=== Objektorientierte Analyse, Design und Programmierung ===<br />
<br />
* {{Amazon|3897214954|Objektorientierte Analyse und Design von Kopf bis Fuß}}<br />
* {{Amazon|3540412867|Objektorientierter Softwareentwurf: Integration mit UML}}<br />
* {{Amazon|393258838X|UML @ Work}}, {{Amazon|3898641945|UML @ Work (Taschenbuch)}}<br />
* {{Amazon|3898642615|UML @ Work - Objektorientierte Modellierung mit UML 2}}<br />
* {{Amazon|3486588559|Analyse und Design mit UML 2.3: Objektorientierte Softwareentwicklung}}<br />
* [http://www.oreilly.de/catalog/9780596007126/ Head First Design Patterns] und die deutsche Übersetzung {{Amazon|3897214210|Entwurfsmuster von Kopf bis Fuß}}<br />
* {{Amazon|3772364888|JavaScript: Objektorientierung und Entwurfsmuster: Stabilen und sicheren Code mit JavaScript entwickeln}}<br />
<br />
== Autorensysteme ==<br />
<br />
* [http://www.unity3d.com/ Unity] {{Bedingt kostenpflichtig}}<br />
* [https://www.unrealengine.com/en-US/blog Unreal Engine 4] {{Bedingt kostenpflichtig}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 1.4] {{Kostenfrei}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 2] {{Kostenpflichtig}}<br />
* [http://www.conitec.com/german/gstudio/ Gamestudio] {{Bedingt kostenpflichtig}}<br />
* [http://jmonkeyengine.com/ jMonkeyEngine]<br />
* [http://mycryengine.com/ CryENGINE] {{Bedingt kostenpflichtig}}<br />
* [http://www.neoaxis.com/ NeoAxis Game Engine] {{Bedingt kostenpflichtig}}<br />
* [http://www.garagegames.com/products/torque-3d/ Torque3D] {{Kostenfrei}} und [http://www.garagegames.com/products/torque-2d/ Torque2D] {{Kostenfrei}}<br />
* [http://source.valvesoftware.com/ Source SDK] {{Kostenpflichtig}}<br />
* [http://www.terathon.com/c4engine/ C4 Engine] {{Kostenpflichtig}}<br />
* [http://stencyl.com Stencyl] {{Bedingt kostenpflichtig}}<br />
* [http://www.scirra.com/construct-classic/ Construct Classic]<br />
* [http://www.scirra.com/construct2/ Construct 2] {{Bedingt kostenpflichtig}} (HTML5)<br />
* [http://www.clickteam.com/clickteam-fusion-2-5-free-edition/ Clickteam Fusion 2.5] {{Bedingt kostenpflichtig}}<br />
* [https://duality.adamslair.net/ Duality] {{Kostenfrei}} (In Entwicklung)<br />
* [https://godotengine.org/ Godot Engine] {{Kostenfrei}} <br />
* [https://gdevelop-app.com/ GDevelop] {{Kostenfrei}}<br />
* [https://www.ambiera.com/coppercube/index.html Coppercube] {{Kostenpflichtig}}<br />
* [http://www.rpgmakerweb.com/ RPG Maker] {{Kostenpflichtig}}<br />
<br />
== Entwicklungsumgebungen, Compiler und Sprachen ==<br />
<br />
=== Entwicklungsumgebungen und Compiler ===<br />
* [http://www.microsoft.com/visualstudio/ Visual Studio] {{Kostenpflichtig}} und die kostenlosen [http://www.microsoft.com/germany/express/ Express Editions] (C++, C#, VB.NET)<br />
* [http://www.codeblocks.org/ Code::Blocks] (C++)<br />
* [http://www.eclipse.org/ Eclipse] (Java, C++, PHP, HTML, JavaScript, CSS, XML & Co.; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.netbeans.org/ Netbeans] (Java, C++, Fortran, PHP, Groovy, HTML, JavaScript, CSS, XML & Co.; siehe [http://netbeans.org/features/index.html Netbeans: Features]; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://developer.apple.com/technologies/tools/ Xcode] (C++, Objective-C, Assembler; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.flashdevelop.org/ FlashDevelop] (AS3, HaXe, XML, MXML, HTML)<br />
* [http://www.monodevelop.com/ MonoDevelop] (C#, VB.NET, C++, Vala)<br />
* [http://www.icsharpcode.net/OpenSource/SD/Default.aspx SharpDevelop] (C#, VB.NET)<br />
<br />
=== Sprachen für die Java VM ===<br />
Siehe auch [http://en.wikipedia.org/wiki/List_of_JVM_languages List of JVM languages]<br />
* [http://java.com Java]<br />
* [http://www.jython.org Jython]<br />
* [http://groovy.codehaus.org/ Groovy]<br />
* [http://clojure.org/ Clojure]<br />
* [http://www.scala-lang.org/ Scala]<br />
* [http://jruby.org/ JRuby]<br />
<br />
=== Sprachen für .NET/CLI ===<br />
Siehe auch [http://de.wikipedia.org/wiki/Liste_von_.NET-Sprachen Liste von .NET-Sprachen]<br />
* [http://msdn.microsoft.com/de-de/vcsharp/aa336706 C#]<br />
* [http://msdn.microsoft.com/de-de/vbasic/ms789056 Visual Basic]<br />
* [http://ironpython.net/ IronPython]<br />
* [http://msdn.microsoft.com/en-us/library/3bf5fs13.aspx JScript]<br />
* [http://msdn.microsoft.com/en-us/vstudio/hh388569 F#]<br />
<br />
== Softwarebibliotheken und Programmierschnittstellen ==<br />
<br />
=== Frameworks für Multimedia und Spieleentwicklung ===<br />
<br />
* [http://www.libsdl.org/ SDL (Simple DirectMedia Layer)] (C++, .NET, Java, Python u.a.)<br />
* [http://www.sfml-dev.org/ SFML (Simple and Fast Multimedia Library)] (C++, .NET, Python)<br />
* [http://www.allegro.cc/ Allegro] (C++)<br />
* [http://msdn.microsoft.com/directx/ DirectX] (C++), [http://slimdx.org/ SlimDX]{{Wrapper|wrapped=DirectX}} (.NET) und [http://code.google.com/p/sharpdx/ SharpDX]{{Wrapper|wrapped=DirectX}} (.NET)<br />
* [http://hge.relishgames.com/ HGE (Haaf's Game Engine)] (C++)<br />
* [http://sourceforge.net/projects/popcapframework/ PopCap Games Framework] (C++)<br />
* [http://pygame.org/ Pygame] (Python)<br />
* [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] (.NET)<br />
* [http://slick.cokeandcode.com/ Slick] (Java)<br />
* [http://libgdx.badlogicgames.com/ LibGDX] (Java)<br />
* [http://flashpunk.net/ FlashPunk] (Flash)<br />
* [http://flixel.org/ Flixel] (Flash)<br />
* [http://love2d.org/ LÖVE] (Lua)<br />
* [http://alternativaplatform.com/ AlternativaPlatform] (Flash)<br />
* [http://www.crystalspace3d.org/ CrystalSpace3D] (C++)<br />
* [http://clanlib.org/ ClanLib] (C++)<br />
* [http://impactjs.com/ Impact] {{Kostenpflichtig}} (JavaScript)<br />
* [http://lwjgl.org/ Lightweight Java Game Library (LWJGL)]{{Wrapper}} (Java)<br />
* [http://ardor3d.com/ Ardor3D] (Java)<br />
* [http://www.panda3d.org/ Panda3D] (Python, C++)<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.opengl.org/ OpenGL]<br />
* [http://www.ogre3d.org/ OGRE (Object-Oriented Graphics Rendering Engine)] Sehr ausgereifte objektorientierte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://irrlicht.sourceforge.net/ Irrlicht Engine] Kompakte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://openil.sourceforge.net/ DevIL] Bildverarbeitungsbibliothek (C++)<br />
* [http://opencv.willowgarage.com/ OpenCV] Computer Vision-Bibliothek (C++, .NET, Java, Python)<br />
* [http://www.starling-framework.org/ Starling Framework] GPU-beschleunigte 2D-Grafik (Flash)<br />
* [http://jogamp.org/ JOGL]{{Wrapper|wrapped=OpenGL}} (Java)<br />
* [http://www.opentk.com/ OpenTK]{{Wrapper}} (.NET)<br />
* [http://theora.org/ Theora] Freier Video-Codec<br />
* [http://assimp.sourceforge.net/ Open Asset Import Library] Bibliothek zum Laden, Optimieren und Speichern von 3D-Modellen in verschiedenen Formaten (C, C++)<br />
<br />
=== Audio ===<br />
<br />
* [http://www.fmod.org/ FMOD] {{Bedingt kostenpflichtig}} Portable Audio-Engine mit sehr großem Funktionsumfang (C++, .NET, Java, Python)<br />
* [http://www.un4seen.com/bass.html BASS] {{Bedingt kostenpflichtig}} (C++, .NET)<br />
* [http://connect.creativelabs.com/openal/ OpenAL]<br />
* [http://kcat.strangesoft.net/openal.html OpenAL Soft]<br />
* [http://jogamp.org/ JOAL]{{Wrapper|wrapped=OpenAL}} (Java)<br />
* [http://xiph.org/vorbis/ Vorbis] Freier Audio-Codec<br />
<br />
=== Physik ===<br />
<br />
Siehe auch [http://de.wikipedia.org/wiki/Physikengine#Physik-Engines ''Physikengine - Physik-Engines'' auf Wikipedia]<br />
<br />
* [http://www.bulletphysics.org/ Bullet] (C++), [http://code.google.com/p/bulletsharp/ BulletSharp]{{Wrapper}} (.NET) und [http://jbullet.advel.cz/ JBullet] (Java)<br />
* [http://developer.nvidia.com/physx PhysX] (C++) und [http://physxdotnet.codeplex.com/ PhysX.Net] (.NET)<br />
* [http://www.newtondynamics.com/ Newton Game Dynamics] (C++, .NET, Python, Pascal)<br />
* [http://opende.sourceforge.net/ ODE (Open Dynamics Engine)] (C++, .NET)<br />
* [http://www.havok.com/products/physics Havok Physics] (C++) {{Bedingt kostenpflichtig}}<br />
* [http://box2d.org/ Box2D] (C++), [http://jbox2d.org/ JBox2D] (Java), [http://code.google.com/p/box2dx/ Box2DX] (.NET), [http://box2dxna.codeplex.com/ Box2D.XNA] (.NET), [http://code.google.com/p/pybox2d/ pybox2d] (Python), [http://www.box2dflash.org/ Box2DFlash] (Flash) und [http://box2d-js.sourceforge.net/ Box2DJS] (JavaScript) - Leistungsstarke 2D-Physik-Engine, die von vielen Spielen genutzt wird<br />
<br />
=== Scripting ===<br />
<br />
* [http://www.lua.org/ Lua] und [http://sourceforge.net/projects/luabind/ Luabind] (C++-Schnittstelle)<br />
* [http://www.python.org/ Python] und [http://www.boost.org/doc/libs/release/libs/python/doc/index.html Boost.Python] (C++-Schnittstelle), [http://jepp.sourceforge.net/ JEPP], [http://jpype.sourceforge.net/ JPype], [http://pypi.python.org/pypi/JCC/ JCC]<br />
* [http://www.angelcode.com/angelscript/ AngelScript]<br />
* [http://squirrel-lang.org/ Squirrel]<br />
* [http://www.swig.org/ SWIG (Simplified Wrapper and Interface Generator)] vereinfacht die Integration einer Skriptsprache in ein Programm durch automatisches Generieren von Schnittstellen<br />
<br />
=== Netzwerk ===<br />
<br />
* [http://www.jenkinssoftware.com/ RakNet] (C++)<br />
* [http://think-async.com/Asio/ Asio C++ Library]<br />
* [http://syncsys.sourceforge.net/ SyncSys] (C++)<br />
* [http://code.google.com/p/kryonet/ kryonet] TCP- und UDP-Client/Server-Bibliothek inkl. Serialisierung. Speziell auf Spieleentwicklung ausgelegt. (Java)<br />
* [http://www.jboss.org/netty/ JBoss Netty] Ausgebaute komplexe Netzwerbibliothek mit Unterstützung von WebSocket und HTTP Tunneling. Besonders für MMO und Browsergames interessant. (Java)<br />
* [http://mina.apache.org/ Apache Mina] Alternative zu JBoss Netty. (Java)<br />
* [http://jersey.java.net/ Jersey] Referenzimplementierung des JAX-RS-Standards (JSR 311) zum Entwickeln von RESTful Web Services. Wenn ein Browsergame mit Flash oder JavaScript entwickelt wird, sollte man sich [http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e82 hier] mal anschauen wie bequem man Webservices entwickeln kann. (Java)<br />
* [http://code.google.com/p/lidgren-network-gen3/ Lidgren.Network] (.NET)<br />
* [http://www.zoidcom.com/ Zoidcom] (C++)<br />
<br />
=== GUI-Frameworks ===<br />
<br />
* [http://mygui.info/ MyGUI]<br />
* [http://www.cegui.org.uk/ CEGUI]<br />
* [http://www.cs.unc.edu/~rademach/glui/ GLUI]<br />
* [http://nifty-gui.lessvoid.com/ Nifty GUI] (Java)<br />
* [http://qt-project.org/ Qt] (C++)<br />
* [http://www.wxwidgets.org/ wxWidgets]<br />
* [http://www.gtk.org/ GTK+]<br />
* [http://developer.apple.com/cocoa/ Cocoa]<br />
* [http://fltk.org/ FLTK]<br />
* [http://code.google.com/p/gwen/ GWEN]<br />
* [http://sfgui.sfml-dev.de/ SFGUI]<br />
<br />
=== Daten ===<br />
<br />
* [http://www.grinninglizard.com/tinyxml/ TinyXml] und [http://code.google.com/p/ticpp/ ticpp] XML-Bibliothek zum Lesen und Schreiben von XML-Dateien<br />
* [http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx SharpZipLib] bietet Zugriff auf Archive im Format Zip, GZip, Tar und BZip<br />
* [http://icculus.org/physfs/ PhysicsFS] Virtuelles Dateisystem für Spiele, das auch Archive unterstützt (C++)<br />
* [http://zlib.net/ zlib] und [http://www.winimage.com/zLibDll/minizip.html Minizip] Bibliotheken zur Datenkompression und zum Lesen und Schreiben von Zip-Archiven<br />
* [http://www.jdom.org/ JDOM] (Java) Zugriff auf XML-Dateien<br />
* [http://www.sqlite.org/download.html SQLite] (C++, .NET) eingebettetes, relationales DBMS (der Python-Interpreter besitzt standardmäßig eine Implementierung)<br />
* [http://db.apache.org/derby/ Derby] (Java) eingebettetes, relationales DBMS<br />
<br />
=== Sonstige ===<br />
<br />
* [http://www.boost.org/ Boost C++ Libraries] Große Sammlung an C++-Bibliotheken für verschiedenste Zwecke (C++)<br />
* [http://pocoproject.org/ POCO] Weitere C++-Bibliothek für verschiedenste Zwecke (C++)<br />
* [http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx SharpUSBLib] bietet Low-Level Zugriff auf USB-Geräte (C#)<br />
* [http://sourceforge.net/projects/sharpcvslib/ SharpCvsLib] stellt einen CVS-Client dar (C#) ''(notwendig für Spieleprogrammierung?)''<br />
* [http://code.google.com/p/google-guice/ Google Guice] Leichtgewichtiges Dependency-Injection-Framework. Komplexere Anwendungen/Spiele können von [http://de.wikipedia.org/wiki/Dependency_Injection DI] profitieren. (Java)<br />
* [http://code.google.com/p/recastnavigation/ Recast+Detour] Navigation-Mesh- und Pathfinding-Toolset<br />
* [http://code.google.com/p/caliper/ Google Caliper] Microbenchmarking-Framework (Java)<br />
* [http://launch4j.sourceforge.net/ Launch4J] Werkzeug zum Wrappen von Java-Anwendungen in ausführbare Dateien für verschiedene Plattformen (Java)<br />
* [http://gamadu.com/artemis/ Artemis] Entity-System-Framework für Spiele (Java)<br />
* [http://www.grinninglizard.com/MicroPather/ MicroPather] A* Pathfinding für die Suche nach einem kürzesten und schnellsten Weg<br />
<br />
== Tools ==<br />
<br />
* [http://www.angelcode.com/products/bmfont/ Bitmap Font Generator] erzeugt Bitmap-Fonts mit vielfältigen Optionen<br />
* [http://code.google.com/p/fontbuilder/ Fontbuilder] erzeugt ebenfalls Bitmap-Fonts<br />
* [http://optipng.sourceforge.net/ OptiPNG] optimiert PNG-Dateien auf Größe durch Verbesserung der Kompression ohne Qualitätsverlust<br />
* [http://www.wholetomato.com/ Visual Assist X] bietet verbessertes Syntax-Highlighting und intelligente Codevervollständigung sowie Refactoring für Visual Studio<br />
* [http://www.codeandweb.com/texturepacker TexturePacker] vereinfacht das Erstellen von Spritesheets, direkter Export für viele Engines bereits enthalten<br />
<br />
=== Diagramm-Tools ===<br />
<br />
Eine Auflistung von UML-Tools ist unter [http://www.jeckle.de/umltools.html jeckle.de] zu finden.<br />
<br />
* [http://live.gnome.org/Dia Dia] Programm zum Erzeugen von (Klassen-)Diagrammen und Zeichnungen<br />
* [http://argouml.tigris.org/ ArgoUML] Programm zum Erzeugen von UML-Diagrammen<br />
* [http://www.microtool.de/objectif/de/index.asp ObjectiF] {{Kostenpflichtig}} Programm zum Erzeugen von UML-Diagrammen<br />
<br />
=== Versionsverwaltungssysteme ===<br />
<br />
* [http://subversion.tigris.org/ Subversion] Zentralisierte Versionsverwaltung<br />
* [http://git-scm.com/ Git] Verteilte Versionsverwaltung<br />
* [https://www.mercurial-scm.org/ Mercurial] Verteilte Versionsverwaltung<br />
<br />
=== Level-Editoren und -Generatoren ===<br />
<br />
* [http://tide.codeplex.com/ tIDE (Tilemap Integrated Development Environment)] Sehr flexibler 2D-Tilemap-Editor mit Plugin-Unterstützung<br />
* [http://ogmoeditor.com/ Ogmo Editor] 2D-Tilemap-Editor<br />
* [http://www.mapeditor.org/ Tiled] 2D-Tilemap-Editor<br />
* [http://www.bundysoft.com/L3DT/ L3DT (Large 3D Terrain Generator)] {{Bedingt kostenpflichtig}}<br />
* [http://www.davidwaltersdevelopment.com/tools/gridcart/ Grid Cartographer] {{Bedingt kostenpflichtig}}<br />
<br />
=== Namensgeneratoren ===<br />
<br />
* [http://ebon.pyorre.net/ Everchanging Book of Names] {{Bedingt kostenpflichtig}}<br />
* [http://www.rinkworks.com/namegen/ Fantasy Name Generator]<br />
* [http://www.behindthename.com/random/ Behind the Name: Random Name Generator]<br />
* [http://www.dotomator.com/web20.html/ Dotomator: Web 2.0 Name Generator]<br />
<br />
== Software zur Content-Erstellung ==<br />
<br />
=== 3D-Modellierung ===<br />
<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?id=14642267&siteID=403786 3ds Max] {{Kostenpflichtig}}<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?siteID=403786&id=14657512 Maya] {{Kostenpflichtig}}<br />
* [http://www.blender.org/ Blender] {{Kostenfrei}}<br />
* [http://www.maxon.net/ CINEMA 4D] {{Kostenpflichtig}}<br />
* [http://nevercenter.com/silo/ Silo] {{Kostenpflichtig}}<br />
* [http://3d-coat.com/ 3D-Coat] {{Kostenpflichtig}}<br />
* [http://www.pixologic.com/sculptris/ Sculptris]<br />
* [http://www.daz3d.com/i/products/hexagon? Hexagon 2] {{Kostenpflichtig}}<br />
* [http://www.makehuman.org/ Makehuman] {{Kostenfrei}} ist ein Open Source-Projekt zur flexiblen Erstellung menschlicher 3D-Modelle<br />
* [http://www.anim8or.com/ Anim8or] ist ein beliebtes Modellierungsprogramm mit Animationsmöglichkeiten<br />
* [https://www.daz3d.com/get_studio DAZ Studio] {{Kostenfrei}}<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.adobe.com/de/products/photoshop.html Adobe Photoshop] {{Kostenpflichtig}}<br />
* [http://www.gimp.org/ GIMP (GNU Image Manipulation Program)]<br />
* [http://inkscape.org/ Inkscape]<br />
* [http://www.paint.net/ Paint.NET]<br />
* [http://www.cosmigo.com/promotion/ Cosmigo Pro Motion] {{Kostenpflichtig}}<br />
* [http://www.humanbalance.net/gale/us/ GraphicsGale] {{Kostenpflichtig}}<br />
* [http://www.aseprite.org/ Aseprite]<br />
* [http://www.piskelapp.com/ PiskelApp]<br />
* [http://renderhjs.net/shoebox/ ShoeBox]<br />
* [http://www.pickleeditor.com/ Pickle] {{Kostenpflichtig}}<br />
* [http://pyxeledit.com/ Pyxel Edit] {{Kostenpflichtig}}<br />
* [http://www.snakehillgames.com/spritelamp/ Sprite Lamp] {{Kostenpflichtig}}<br />
* [http://autotilegen.com/ AutoTileGen] {{Kostenpflichtig}}<br />
* [http://www.brashmonkey.com/spriter.htm Spriter] {{Kostenpflichtig}}<br />
* [http://hexraystudios.com/hexels/ Hexels]<br />
* [http://de.esotericsoftware.com/ Spine] {{Kostenpflichtig}}<br />
* [http://www.vitruality.com/tools/spartan/ Spartan]<br />
* [https://krita.org/ Krita]<br />
* [https://www.allegorithmic.com/ Allegorithmic Substance Designer / Painter] {{Kostenpflichtig}}<br />
* [http://icofx.ro/ IcoFX] {{Kostenpflichtig}}<br />
<br />
=== Audio ===<br />
<br />
* [http://audacity.sourceforge.net/ Audacity]<br />
* [http://lmms.sourceforge.net/ LMMS]<br />
* [http://flstudio.image-line.com/ FL Studio] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/products/audition.html Adobe Audition] {{Kostenpflichtig}}<br />
* [http://www.renoise.com/ Renoise] {{Kostenpflichtig}}<br />
* [http://www.drpetter.se/project_sfxr.html sfxr]<br />
* [http://goldwave.com/ GoldWave] {{Kostenpflichtig}}<br />
* [http://www.steinberg.net/de/products/cubase/start.html Cubase] {{Kostenpflichtig}}<br />
* [http://www.reaper.fm/ Reaper] {{Kostenpflichtig}}<br />
* [http://www.bitwig.com/en/bitwig-studio/overview.html Bitwig Studio] {{Kostenpflichtig}}<br />
* [http://famitracker.com/ Famitracker]<br />
<br />
=== Video ===<br />
<br />
==== Aufnahme ====<br />
<br />
* [http://www.mirillis.com/de Mirillis] {{Kostenpflichtig}}<br />
* [http://www.bandicam.com/de Bandicam] {{Bedingt kostenpflichtig}}<br />
* [http://exkode.com/dxtory-features-en.html Dxtory] {{Kostenpflichtig}}<br />
* [http://www.fraps.com Fraps] {{Kostenpflichtig}}<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.videolan.org/vlc/ VLC Media Player]<br />
* [http://camstudio.org/ CamStudio]<br />
* [http://www.playclaw.com/de/ PlayClaw] {{Kostenpflichtig}}<br />
* [https://obsproject.com/ Open Broadcast Software]<br />
<br />
==== Verarbeitung ====<br />
<br />
* [http://www.virtualdub.org/ VirtualDub]<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.sonycreativesoftware.com/vegassoftware Sony Vegas] {{Kostenpflichtig}}<br />
* [http://handbrake.fr Handbrake]<br />
* [http://www.lightworksbeta.com/ Lightworks]<br />
* [http://tmpgenc.pegasys-inc.com/de/product/tvmw5.html TMPGEnc Video Mastering Works 5] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/de/products/premiere.html Adobe Premiere] {{Kostenpflichtig}}<br />
* [http://staxmedia.sourceforge.net/ StaxRip]<br />
* [http://sourceforge.net/projects/megui/ MeGUI]<br />
* [http://explore.live.com/windows-live-movie-maker Windows Live Movie Maker]<br />
<br />
== Fertiger Content ==<br />
<br />
Hier soll auf Seiten verwiesen werden, auf denen man (vorzugsweise kostenlose) Grafiken, 3D-Modelle, Soundeffekte und Musikstücke finden kann.<br />
<br />
* [http://kenney.itch.io/kenney-donation Kenney Donation Pack] ist eine Sammlung von über 6000 frei verwendbaren Assets, für die der Autor eine Spende verlangt<br />
* [http://content.gpwiki.org/index.php/Game_Content_Resources Umfangreiche Link-Sammlung im GPWiki]<br />
* [http://www.reinerstilesets.de Reiner's Tilesets] {{Kostenfrei}} enthält nicht nur Tilesets, sondern auch 3D-Modelle, Texturen, Soundeffekte und Tutorials<br />
<br />
=== 3D-Modelle ===<br />
<br />
* [http://www.3dcafe.com/ 3D Cafe] {{Bedingt kostenpflichtig}} bietet auch kostenlose 3D-Modelle, wenn man zuvor mindestens drei eigene Modelle auf die Seite geladen hat<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=10 OpenGameArt 3D] {{Kostenfrei}} Frei lizensierte 3D-Modelle<br />
* [http://www.blendswap.com/ blendswap] {{Kostenfrei}} Frei lizensierte Blender-Modelle<br />
* [http://www.daz3d.com/new-releases?dir=asc&order=price DAZ 3D Marketplace] {{Kostenpflichtig}}<br />
* [http://arteria3d.com/collections/audio/Medieval Arteria3d] {{Kostenpflichtig}}<br />
<br />
=== Grafiken und Texturen ===<br />
* [http://www.3d.sk/ 3D.SK] {{Kostenpflichtig}} Referenzbilder von Menschen speziell für 3D-Modellierung und Spieleentwicklung<br />
* [http://www.cgtextures.com/ CGTextures] {{Bedingt kostenpflichtig}} bietet eine große Sammlung kostenlos benutzbarer Texturen<br />
* [http://www.environment-textures.com/ Environment Textures] {{Kostenpflichtig}}<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=9 OpenGameArt 2D] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=14 Texturen] {{Kostenfrei}} Legale, frei lizensierte Grafiken<br />
* [http://www.lostgarden.com/ Lost Garden Art] {{Kostenfrei}}<br />
* [http://charas-project.net/ Charas Project] {{Kostenfrei}}<br />
* [http://spriters-resource.com/ The Spriters Resource] {{Kostenfrei}}<br />
* [https://vxresource.wordpress.com/ RPG Maker VX Resource Planet] {{Kostenfrei}}<br />
<br />
=== Soundeffekte und Musik ===<br />
<br />
* [http://www.audiomicro.com/ AudioMicro] {{Kostenpflichtig}}<br />
* [http://www.freesound.org/ Freesound] {{Kostenfrei}} Frei lizensierte community-kreierte Sounds<br />
* [http://incompetech.com/m/c/royalty-free/ Incompetech] {{Kostenfrei}} Musik unter der Creative Commons Attribution Lizenz (CC-BY)<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12 OpenGameArt Musik] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=13 Sounds] {{Kostenfrei}} Frei lizensierte Audiodateien<br />
* [http://www.soundsnap.com/ Soundsnap] {{Kostenpflichtig}}<br />
* [http://www.bensound.com/ bensound] {{Kostenfrei}}<br />
* [https://www.jamendo.com/ Jamendo] {{Bedingt kostenpflichtig}}<br />
<br />
=== Schriftarten ===<br />
<br />
* [http://www.dafont.com/ Dafont.com] {{Kostenfrei}}<br />
* [http://www.myfont.de/ MyFont.de] {{Kostenfrei}}<br />
* [http://openfontlibrary.org/ OpenFontLibrary] {{Kostenfrei}} Frei lizensierte Schriftarten<br />
* [http://www.urbanfonts.com/ Urban Fonts] {{Kostenfrei}}<br />
<br />
== Sonstiges ==<br />
<br />
* [http://www.wotsit.org/ Wotsit.org] Große Datenbank mit Beschreibung von Dateiformaten (nützlich, wenn man ein bestimmtes Dateiformat lesen oder schreiben möchte)<br />
* [http://www.wsusoffline.net/ WSUS Offline Updater] erzeugt komplette Offline-Updates (CD/DVD(.iso)/USB-Sticks) aller Windows/Office 2003-2013/C++ Laufzeit/.NET-Framework-Versionen.<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Link-SammlungLink-Sammlung2018-05-31T13:02:19Z<p>David Scherfgen: Autor ohne h</p>
<hr />
<div>In diesem Artikel sollen Links gesammelt werden, die für die Spieleentwicklung nützlich sind.<br />
<br />
== Webseiten und Tutorials zur Spieleentwicklung ==<br />
<br />
* [http://www.gamedev.net/ GameDev.net] Große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gamasutra.com/ Gamasutra] Weitere große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gpwiki.org/ Game Programming Wiki] Englischsprachiges Wiki zum Thema Spieleentwicklung<br />
* [http://gafferongames.com/ Game Development + Game Programming Tutorials von Glenn Fiedler] Hochqualitative Reihe von Artikeln und Tutorials zu technischen Aspekten der Spieleprogrammierung<br />
* [http://www.ludism.org/gamedesign/ Game Design Wiki] ist ein nicht-technisches Wiki zum Thema Game-Design<br />
* [http://chrishecker.com/ Chris Hecker's Homepage] enthält viele technische Artikel<br />
* [http://en.wikibooks.org/wiki/OpenGL_Programming Wikibooks OpenGL] enthält viele moderne, englische Tutorials über OpenGL<br />
* [http://www.spieleprogrammierung.net/ Spieleprogrammierung.net] bietet deutschsprachige Tutorials zu OpenGL, OpenAL und OpenCL<br />
* [http://www.gamedevelop.eu/ Gamedevelop.eu] enthält deutschsprachige Artikel und Tutorials zur Spieleentwicklung<br />
* [http://www.makinggames.de/ Makinggames.de] enhält interessante Artikel zum thema Spieleentwicklung<br />
* [http://gameprogrammingpatterns.com/ GameProgrammingPatterns.com] enthält wenige, aber ausführliche Artikel zu Design Patterns in der Spieleentwicklung<br />
* [http://natureofcode.com/ The Nature of Code] ist ein frei verfügbares, aber auch kaufbares Buch über Grundkonzepte und fortgeschrittene Themen der Spieleentwicklung<br />
<br />
== Literatur zur Spieleentwicklung ==<br />
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}<br />
* {{Amazon|3446405968|"3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen}}<br />
* "Game Programming Gems"-Reihe<br />
** {{Amazon|1584500492|"Game Programming Gems 1"}} und {{Amazon|3826609239|die deutsche Übersetzung}}<br />
** {{Amazon|1584500549|"Game Programming Gems 2"}}<br />
** {{Amazon|1584502339|"Game Programming Gems 3"}}<br />
** {{Amazon|1584502959|"Game Programming Gems 4"}} und {{Amazon|3446229442|die deutsche Übersetzung}}<br />
** {{Amazon|1584503521|"Game Programming Gems 5"}}<br />
** {{Amazon|1584504501|"Game Programming Gems 6"}}<br />
** {{Amazon|1584505273|"Game Programming Gems 7"}}<br />
** {{Amazon|1584507020|"Game Programming Gems 8"}}<br />
* "GPU Gems"-Reihe<br />
** {{Amazon|0321228324|"GPU Gems 1"}} [http://http.developer.nvidia.com/GPUGems/gpugems_pref01.html (kostenlos online lesbar)]<br />
** {{Amazon|0321335597|"GPU Gems 2"}} [http://http.developer.nvidia.com/GPUGems2/gpugems2_frontmatter.html (kostenlos online lesbar)]<br />
** {{Amazon|0321515269|"GPU Gems 3"}} und {{Amazon|B000UZQH52|die Kindle-eBook-Version}} [http://http.developer.nvidia.com/GPUGems3/gpugems3_pref01.html (kostenlos online lesbar)]<br />
* [http://www.gdcvault.com/gdmag Game Developer Magazine (alle Ausgaben von 1994-2013 gratis)]<br />
<br />
=== Objektorientierte Analyse, Design und Programmierung ===<br />
<br />
* {{Amazon|3897214954|Objektorientierte Analyse und Design von Kopf bis Fuß}}<br />
* {{Amazon|3540412867|Objektorientierter Softwareentwurf: Integration mit UML}}<br />
* {{Amazon|393258838X|UML @ Work}}, {{Amazon|3898641945|UML @ Work (Taschenbuch)}}<br />
* {{Amazon|3898642615|UML @ Work - Objektorientierte Modellierung mit UML 2}}<br />
* {{Amazon|3486588559|Analyse und Design mit UML 2.3: Objektorientierte Softwareentwicklung}}<br />
* [http://www.oreilly.de/catalog/9780596007126/ Head First Design Patterns] und die deutsche Übersetzung {{Amazon|3897214210|Entwurfsmuster von Kopf bis Fuß}}<br />
* {{Amazon|3772364888|JavaScript: Objektorientierung und Entwurfsmuster: Stabilen und sicheren Code mit JavaScript entwickeln}}<br />
<br />
== Autorensysteme ==<br />
<br />
* [http://www.unity3d.com/ Unity] {{Bedingt kostenpflichtig}}<br />
* [https://www.unrealengine.com/en-US/blog Unreal Engine 4] {{Bedingt kostenpflichtig}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 1.4] {{Kostenfrei}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker Studio 2] {{Kostenpflichtig}}<br />
* [http://www.conitec.com/german/gstudio/ Gamestudio] {{Bedingt kostenpflichtig}}<br />
* [http://jmonkeyengine.com/ jMonkeyEngine]<br />
* [http://mycryengine.com/ CryENGINE] {{Bedingt kostenpflichtig}}<br />
* [http://www.neoaxis.com/ NeoAxis Game Engine] {{Bedingt kostenpflichtig}}<br />
* [http://www.garagegames.com/products/torque-3d/ Torque3D] {{Kostenfrei}} und [http://www.garagegames.com/products/torque-2d/ Torque2D] {{Kostenfrei}}<br />
* [http://source.valvesoftware.com/ Source SDK] {{Kostenpflichtig}}<br />
* [http://www.terathon.com/c4engine/ C4 Engine] {{Kostenpflichtig}}<br />
* [http://stencyl.com Stencyl] {{Bedingt kostenpflichtig}}<br />
* [http://www.scirra.com/construct-classic/ Construct Classic]<br />
* [http://www.scirra.com/construct2/ Construct 2] {{Bedingt kostenpflichtig}} (HTML5)<br />
* [http://www.clickteam.com/clickteam-fusion-2-5-free-edition/ Clickteam Fusion 2.5] {{Bedingt kostenpflichtig}}<br />
* [https://duality.adamslair.net/ Duality] {{Kostenfrei}} (In Entwicklung)<br />
* [https://godotengine.org/ Godot Engine] {{Kostenfrei}} <br />
* [https://gdevelop-app.com/ GDevelop] {{Kostenfrei}}<br />
* [https://www.ambiera.com/coppercube/index.html Coppercube] {{Kostenpflichtig}}<br />
* [http://www.rpgmakerweb.com/ RPG Maker] {{Kostenpflichtig}}<br />
<br />
== Entwicklungsumgebungen, Compiler und Sprachen ==<br />
<br />
=== Entwicklungsumgebungen und Compiler ===<br />
* [http://www.microsoft.com/visualstudio/ Visual Studio] {{Kostenpflichtig}} und die kostenlosen [http://www.microsoft.com/germany/express/ Express Editions] (C++, C#, VB.NET)<br />
* [http://www.codeblocks.org/ Code::Blocks] (C++)<br />
* [http://www.eclipse.org/ Eclipse] (Java, C++, PHP, HTML, JavaScript, CSS, XML & Co.; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.netbeans.org/ Netbeans] (Java, C++, Fortran, PHP, Groovy, HTML, JavaScript, CSS, XML & Co.; siehe [http://netbeans.org/features/index.html Netbeans: Features]; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://developer.apple.com/technologies/tools/ Xcode] (C++, Objective-C, Assembler; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.flashdevelop.org/ FlashDevelop] (AS3, HaXe, XML, MXML, HTML)<br />
* [http://www.monodevelop.com/ MonoDevelop] (C#, VB.NET, C++, Vala)<br />
* [http://www.icsharpcode.net/OpenSource/SD/Default.aspx SharpDevelop] (C#, VB.NET)<br />
<br />
=== Sprachen für die Java VM ===<br />
Siehe auch [http://en.wikipedia.org/wiki/List_of_JVM_languages List of JVM languages]<br />
* [http://java.com Java]<br />
* [http://www.jython.org Jython]<br />
* [http://groovy.codehaus.org/ Groovy]<br />
* [http://clojure.org/ Clojure]<br />
* [http://www.scala-lang.org/ Scala]<br />
* [http://jruby.org/ JRuby]<br />
<br />
=== Sprachen für .NET/CLI ===<br />
Siehe auch [http://de.wikipedia.org/wiki/Liste_von_.NET-Sprachen Liste von .NET-Sprachen]<br />
* [http://msdn.microsoft.com/de-de/vcsharp/aa336706 C#]<br />
* [http://msdn.microsoft.com/de-de/vbasic/ms789056 Visual Basic]<br />
* [http://ironpython.net/ IronPython]<br />
* [http://msdn.microsoft.com/en-us/library/3bf5fs13.aspx JScript]<br />
* [http://msdn.microsoft.com/en-us/vstudio/hh388569 F#]<br />
<br />
== Softwarebibliotheken und Programmierschnittstellen ==<br />
<br />
=== Frameworks für Multimedia und Spieleentwicklung ===<br />
<br />
* [http://www.libsdl.org/ SDL (Simple DirectMedia Layer)] (C++, .NET, Java, Python u.a.)<br />
* [http://www.sfml-dev.org/ SFML (Simple and Fast Multimedia Library)] (C++, .NET, Python)<br />
* [http://www.allegro.cc/ Allegro] (C++)<br />
* [http://msdn.microsoft.com/directx/ DirectX] (C++), [http://slimdx.org/ SlimDX]{{Wrapper|wrapped=DirectX}} (.NET) und [http://code.google.com/p/sharpdx/ SharpDX]{{Wrapper|wrapped=DirectX}} (.NET)<br />
* [http://hge.relishgames.com/ HGE (Haaf's Game Engine)] (C++)<br />
* [http://sourceforge.net/projects/popcapframework/ PopCap Games Framework] (C++)<br />
* [http://pygame.org/ Pygame] (Python)<br />
* [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] (.NET)<br />
* [http://slick.cokeandcode.com/ Slick] (Java)<br />
* [http://libgdx.badlogicgames.com/ LibGDX] (Java)<br />
* [http://flashpunk.net/ FlashPunk] (Flash)<br />
* [http://flixel.org/ Flixel] (Flash)<br />
* [http://love2d.org/ LÖVE] (Lua)<br />
* [http://alternativaplatform.com/ AlternativaPlatform] (Flash)<br />
* [http://www.crystalspace3d.org/ CrystalSpace3D] (C++)<br />
* [http://clanlib.org/ ClanLib] (C++)<br />
* [http://impactjs.com/ Impact] {{Kostenpflichtig}} (JavaScript)<br />
* [http://lwjgl.org/ Lightweight Java Game Library (LWJGL)]{{Wrapper}} (Java)<br />
* [http://ardor3d.com/ Ardor3D] (Java)<br />
* [http://www.panda3d.org/ Panda3D] (Python, C++)<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.opengl.org/ OpenGL]<br />
* [http://www.ogre3d.org/ OGRE (Object-Oriented Graphics Rendering Engine)] Sehr ausgereifte objektorientierte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://irrlicht.sourceforge.net/ Irrlicht Engine] Kompakte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://openil.sourceforge.net/ DevIL] Bildverarbeitungsbibliothek (C++)<br />
* [http://opencv.willowgarage.com/ OpenCV] Computer Vision-Bibliothek (C++, .NET, Java, Python)<br />
* [http://www.starling-framework.org/ Starling Framework] GPU-beschleunigte 2D-Grafik (Flash)<br />
* [http://jogamp.org/ JOGL]{{Wrapper|wrapped=OpenGL}} (Java)<br />
* [http://www.opentk.com/ OpenTK]{{Wrapper}} (.NET)<br />
* [http://theora.org/ Theora] Freier Video-Codec<br />
* [http://assimp.sourceforge.net/ Open Asset Import Library] Bibliothek zum Laden, Optimieren und Speichern von 3D-Modellen in verschiedenen Formaten (C, C++)<br />
<br />
=== Audio ===<br />
<br />
* [http://www.fmod.org/ FMOD] {{Bedingt kostenpflichtig}} Portable Audio-Engine mit sehr großem Funktionsumfang (C++, .NET, Java, Python)<br />
* [http://www.un4seen.com/bass.html BASS] {{Bedingt kostenpflichtig}} (C++, .NET)<br />
* [http://connect.creativelabs.com/openal/ OpenAL]<br />
* [http://kcat.strangesoft.net/openal.html OpenAL Soft]<br />
* [http://jogamp.org/ JOAL]{{Wrapper|wrapped=OpenAL}} (Java)<br />
* [http://xiph.org/vorbis/ Vorbis] Freier Audio-Codec<br />
<br />
=== Physik ===<br />
<br />
Siehe auch [http://de.wikipedia.org/wiki/Physikengine#Physik-Engines ''Physikengine - Physik-Engines'' auf Wikipedia]<br />
<br />
* [http://www.bulletphysics.org/ Bullet] (C++), [http://code.google.com/p/bulletsharp/ BulletSharp]{{Wrapper}} (.NET) und [http://jbullet.advel.cz/ JBullet] (Java)<br />
* [http://developer.nvidia.com/physx PhysX] (C++) und [http://physxdotnet.codeplex.com/ PhysX.Net] (.NET)<br />
* [http://www.newtondynamics.com/ Newton Game Dynamics] (C++, .NET, Python, Pascal)<br />
* [http://opende.sourceforge.net/ ODE (Open Dynamics Engine)] (C++, .NET)<br />
* [http://www.havok.com/products/physics Havok Physics] (C++) {{Bedingt kostenpflichtig}}<br />
* [http://box2d.org/ Box2D] (C++), [http://jbox2d.org/ JBox2D] (Java), [http://code.google.com/p/box2dx/ Box2DX] (.NET), [http://box2dxna.codeplex.com/ Box2D.XNA] (.NET), [http://code.google.com/p/pybox2d/ pybox2d] (Python), [http://www.box2dflash.org/ Box2DFlash] (Flash) und [http://box2d-js.sourceforge.net/ Box2DJS] (JavaScript) - Leistungsstarke 2D-Physik-Engine, die von vielen Spielen genutzt wird<br />
<br />
=== Scripting ===<br />
<br />
* [http://www.lua.org/ Lua] und [http://sourceforge.net/projects/luabind/ Luabind] (C++-Schnittstelle)<br />
* [http://www.python.org/ Python] und [http://www.boost.org/doc/libs/release/libs/python/doc/index.html Boost.Python] (C++-Schnittstelle), [http://jepp.sourceforge.net/ JEPP], [http://jpype.sourceforge.net/ JPype], [http://pypi.python.org/pypi/JCC/ JCC]<br />
* [http://www.angelcode.com/angelscript/ AngelScript]<br />
* [http://squirrel-lang.org/ Squirrel]<br />
* [http://www.swig.org/ SWIG (Simplified Wrapper and Interface Generator)] vereinfacht die Integration einer Skriptsprache in ein Programm durch automatisches Generieren von Schnittstellen<br />
<br />
=== Netzwerk ===<br />
<br />
* [http://www.jenkinssoftware.com/ RakNet] (C++)<br />
* [http://think-async.com/Asio/ Asio C++ Library]<br />
* [http://syncsys.sourceforge.net/ SyncSys] (C++)<br />
* [http://code.google.com/p/kryonet/ kryonet] TCP- und UDP-Client/Server-Bibliothek inkl. Serialisierung. Speziell auf Spieleentwicklung ausgelegt. (Java)<br />
* [http://www.jboss.org/netty/ JBoss Netty] Ausgebaute komplexe Netzwerbibliothek mit Unterstützung von WebSocket und HTTP Tunneling. Besonders für MMO und Browsergames interessant. (Java)<br />
* [http://mina.apache.org/ Apache Mina] Alternative zu JBoss Netty. (Java)<br />
* [http://jersey.java.net/ Jersey] Referenzimplementierung des JAX-RS-Standards (JSR 311) zum Entwickeln von RESTful Web Services. Wenn ein Browsergame mit Flash oder JavaScript entwickelt wird, sollte man sich [http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e82 hier] mal anschauen wie bequem man Webservices entwickeln kann. (Java)<br />
* [http://code.google.com/p/lidgren-network-gen3/ Lidgren.Network] (.NET)<br />
* [http://www.zoidcom.com/ Zoidcom] (C++)<br />
<br />
=== GUI-Frameworks ===<br />
<br />
* [http://mygui.info/ MyGUI]<br />
* [http://www.cegui.org.uk/ CEGUI]<br />
* [http://www.cs.unc.edu/~rademach/glui/ GLUI]<br />
* [http://nifty-gui.lessvoid.com/ Nifty GUI] (Java)<br />
* [http://qt-project.org/ Qt] (C++)<br />
* [http://www.wxwidgets.org/ wxWidgets]<br />
* [http://www.gtk.org/ GTK+]<br />
* [http://developer.apple.com/cocoa/ Cocoa]<br />
* [http://fltk.org/ FLTK]<br />
* [http://code.google.com/p/gwen/ GWEN]<br />
* [http://sfgui.sfml-dev.de/ SFGUI]<br />
<br />
=== Daten ===<br />
<br />
* [http://www.grinninglizard.com/tinyxml/ TinyXml] und [http://code.google.com/p/ticpp/ ticpp] XML-Bibliothek zum Lesen und Schreiben von XML-Dateien<br />
* [http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx SharpZipLib] bietet Zugriff auf Archive im Format Zip, GZip, Tar und BZip<br />
* [http://icculus.org/physfs/ PhysicsFS] Virtuelles Dateisystem für Spiele, das auch Archive unterstützt (C++)<br />
* [http://zlib.net/ zlib] und [http://www.winimage.com/zLibDll/minizip.html Minizip] Bibliotheken zur Datenkompression und zum Lesen und Schreiben von Zip-Archiven<br />
* [http://www.jdom.org/ JDOM] (Java) Zugriff auf XML-Dateien<br />
* [http://www.sqlite.org/download.html SQLite] (C++, .NET) eingebettetes, relationales DBMS (der Python-Interpreter besitzt standardmäßig eine Implementierung)<br />
* [http://db.apache.org/derby/ Derby] (Java) eingebettetes, relationales DBMS<br />
<br />
=== Sonstige ===<br />
<br />
* [http://www.boost.org/ Boost C++ Libraries] Große Sammlung an C++-Bibliotheken für verschiedenste Zwecke (C++)<br />
* [http://pocoproject.org/ POCO] Weitere C++-Bibliothek für verschiedenste Zwecke (C++)<br />
* [http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx SharpUSBLib] bietet Low-Level Zugriff auf USB-Geräte (C#)<br />
* [http://sourceforge.net/projects/sharpcvslib/ SharpCvsLib] stellt einen CVS-Client dar (C#) ''(notwendig für Spieleprogrammierung?)''<br />
* [http://code.google.com/p/google-guice/ Google Guice] Leichtgewichtiges Dependency-Injection-Framework. Komplexere Anwendungen/Spiele können von [http://de.wikipedia.org/wiki/Dependency_Injection DI] profitieren. (Java)<br />
* [http://code.google.com/p/recastnavigation/ Recast+Detour] Navigation-Mesh- und Pathfinding-Toolset<br />
* [http://code.google.com/p/caliper/ Google Caliper] Microbenchmarking-Framework (Java)<br />
* [http://launch4j.sourceforge.net/ Launch4J] Werkzeug zum Wrappen von Java-Anwendungen in ausführbare Dateien für verschiedene Plattformen (Java)<br />
* [http://gamadu.com/artemis/ Artemis] Entity-System-Framework für Spiele (Java)<br />
* [http://www.grinninglizard.com/MicroPather/ MicroPather] A* Pathfinding für die Suche nach einem kürzesten und schnellsten Weg<br />
<br />
== Tools ==<br />
<br />
* [http://www.angelcode.com/products/bmfont/ Bitmap Font Generator] erzeugt Bitmap-Fonts mit vielfältigen Optionen<br />
* [http://code.google.com/p/fontbuilder/ Fontbuilder] erzeugt ebenfalls Bitmap-Fonts<br />
* [http://optipng.sourceforge.net/ OptiPNG] optimiert PNG-Dateien auf Größe durch Verbesserung der Kompression ohne Qualitätsverlust<br />
* [http://www.wholetomato.com/ Visual Assist X] bietet verbessertes Syntax-Highlighting und intelligente Codevervollständigung sowie Refactoring für Visual Studio<br />
* [http://www.codeandweb.com/texturepacker TexturePacker] vereinfacht das Erstellen von Spritesheets, direkter Export für viele Engines bereits enthalten<br />
<br />
=== Diagramm-Tools ===<br />
<br />
Eine Auflistung von UML-Tools ist unter [http://www.jeckle.de/umltools.html jeckle.de] zu finden.<br />
<br />
* [http://live.gnome.org/Dia Dia] Programm zum Erzeugen von (Klassen-)Diagrammen und Zeichnungen<br />
* [http://argouml.tigris.org/ ArgoUML] Programm zum Erzeugen von UML-Diagrammen<br />
* [http://www.microtool.de/objectif/de/index.asp ObjectiF] {{Kostenpflichtig}} Programm zum Erzeugen von UML-Diagrammen<br />
<br />
=== Versionsverwaltungssysteme ===<br />
<br />
* [http://subversion.tigris.org/ Subversion] Zentralisierte Versionsverwaltung<br />
* [http://git-scm.com/ Git] Verteilte Versionsverwaltung<br />
* [https://www.mercurial-scm.org/ Mercurial] Verteilte Versionsverwaltung<br />
<br />
=== Level-Editoren und -Generatoren ===<br />
<br />
* [http://tide.codeplex.com/ tIDE (Tilemap Integrated Development Environment)] Sehr flexibler 2D-Tilemap-Editor mit Plugin-Unterstützung<br />
* [http://ogmoeditor.com/ Ogmo Editor] 2D-Tilemap-Editor<br />
* [http://www.mapeditor.org/ Tiled] 2D-Tilemap-Editor<br />
* [http://www.bundysoft.com/L3DT/ L3DT (Large 3D Terrain Generator)] {{Bedingt kostenpflichtig}}<br />
* [http://www.davidwaltersdevelopment.com/tools/gridcart/ Grid Cartographer] {{Bedingt kostenpflichtig}}<br />
<br />
=== Namensgeneratoren ===<br />
<br />
* [http://ebon.pyorre.net/ Everchanging Book of Names] {{Bedingt kostenpflichtig}}<br />
* [http://www.rinkworks.com/namegen/ Fantasy Name Generator]<br />
* [http://www.behindthename.com/random/ Behind the Name: Random Name Generator]<br />
* [http://www.dotomator.com/web20.html/ Dotomator: Web 2.0 Name Generator]<br />
<br />
== Software zur Content-Erstellung ==<br />
<br />
=== 3D-Modellierung ===<br />
<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?id=14642267&siteID=403786 3ds Max] {{Kostenpflichtig}}<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?siteID=403786&id=14657512 Maya] {{Kostenpflichtig}}<br />
* [http://www.blender.org/ Blender] {{Kostenfrei}}<br />
* [http://www.maxon.net/ CINEMA 4D] {{Kostenpflichtig}}<br />
* [http://nevercenter.com/silo/ Silo] {{Kostenpflichtig}}<br />
* [http://3d-coat.com/ 3D-Coat] {{Kostenpflichtig}}<br />
* [http://www.pixologic.com/sculptris/ Sculptris]<br />
* [http://www.daz3d.com/i/products/hexagon? Hexagon 2] {{Kostenpflichtig}}<br />
* [http://www.makehuman.org/ Makehuman] {{Kostenfrei}} ist ein Open Source-Projekt zur flexiblen Erstellung menschlicher 3D-Modelle<br />
* [http://www.anim8or.com/ Anim8or] ist ein beliebtes Modellierungsprogramm mit Animationsmöglichkeiten<br />
* [https://www.daz3d.com/get_studio DAZ Studio] {{Kostenfrei}}<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.adobe.com/de/products/photoshop.html Adobe Photoshop] {{Kostenpflichtig}}<br />
* [http://www.gimp.org/ GIMP (GNU Image Manipulation Program)]<br />
* [http://inkscape.org/ Inkscape]<br />
* [http://www.paint.net/ Paint.NET]<br />
* [http://www.cosmigo.com/promotion/ Cosmigo Pro Motion] {{Kostenpflichtig}}<br />
* [http://www.humanbalance.net/gale/us/ GraphicsGale] {{Kostenpflichtig}}<br />
* [http://www.aseprite.org/ Aseprite]<br />
* [http://www.piskelapp.com/ PiskelApp]<br />
* [http://renderhjs.net/shoebox/ ShoeBox]<br />
* [http://www.pickleeditor.com/ Pickle] {{Kostenpflichtig}}<br />
* [http://pyxeledit.com/ Pyxel Edit] {{Kostenpflichtig}}<br />
* [http://www.snakehillgames.com/spritelamp/ Sprite Lamp] {{Kostenpflichtig}}<br />
* [http://autotilegen.com/ AutoTileGen] {{Kostenpflichtig}}<br />
* [http://www.brashmonkey.com/spriter.htm Spriter] {{Kostenpflichtig}}<br />
* [http://hexraystudios.com/hexels/ Hexels]<br />
* [http://de.esotericsoftware.com/ Spine] {{Kostenpflichtig}}<br />
* [http://www.vitruality.com/tools/spartan/ Spartan]<br />
* [https://krita.org/ Krita]<br />
* [https://www.allegorithmic.com/ Allegorithmic Substance Designer / Painter] {{Kostenpflichtig}}<br />
* [http://icofx.ro/ IcoFX] {{Kostenpflichtig}}<br />
<br />
=== Audio ===<br />
<br />
* [http://audacity.sourceforge.net/ Audacity]<br />
* [http://lmms.sourceforge.net/ LMMS]<br />
* [http://flstudio.image-line.com/ FL Studio] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/products/audition.html Adobe Audition] {{Kostenpflichtig}}<br />
* [http://www.renoise.com/ Renoise] {{Kostenpflichtig}}<br />
* [http://www.drpetter.se/project_sfxr.html sfxr]<br />
* [http://goldwave.com/ GoldWave] {{Kostenpflichtig}}<br />
* [http://www.steinberg.net/de/products/cubase/start.html Cubase] {{Kostenpflichtig}}<br />
* [http://www.reaper.fm/ Reaper] {{Kostenpflichtig}}<br />
* [http://www.bitwig.com/en/bitwig-studio/overview.html Bitwig Studio] {{Kostenpflichtig}}<br />
* [http://famitracker.com/ Famitracker]<br />
<br />
=== Video ===<br />
<br />
==== Aufnahme ====<br />
<br />
* [http://www.mirillis.com/de Mirillis] {{Kostenpflichtig}}<br />
* [http://www.bandicam.com/de Bandicam] {{Bedingt kostenpflichtig}}<br />
* [http://exkode.com/dxtory-features-en.html Dxtory] {{Kostenpflichtig}}<br />
* [http://www.fraps.com Fraps] {{Kostenpflichtig}}<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.videolan.org/vlc/ VLC Media Player]<br />
* [http://camstudio.org/ CamStudio]<br />
* [http://www.playclaw.com/de/ PlayClaw] {{Kostenpflichtig}}<br />
* [https://obsproject.com/ Open Broadcast Software]<br />
<br />
==== Verarbeitung ====<br />
<br />
* [http://www.virtualdub.org/ VirtualDub]<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.sonycreativesoftware.com/vegassoftware Sony Vegas] {{Kostenpflichtig}}<br />
* [http://handbrake.fr Handbrake]<br />
* [http://www.lightworksbeta.com/ Lightworks]<br />
* [http://tmpgenc.pegasys-inc.com/de/product/tvmw5.html TMPGEnc Video Mastering Works 5] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/de/products/premiere.html Adobe Premiere] {{Kostenpflichtig}}<br />
* [http://staxmedia.sourceforge.net/ StaxRip]<br />
* [http://sourceforge.net/projects/megui/ MeGUI]<br />
* [http://explore.live.com/windows-live-movie-maker Windows Live Movie Maker]<br />
<br />
== Fertiger Content ==<br />
<br />
Hier soll auf Seiten verwiesen werden, auf denen man (vorzugsweise kostenlose) Grafiken, 3D-Modelle, Soundeffekte und Musikstücke finden kann.<br />
<br />
* [http://kenney.itch.io/kenney-donation Kenney Donation Pack] ist eine Sammlung von über 6000 frei verwendbaren Assets, für die der Autor eine Spende verlangt<br />
* [http://content.gpwiki.org/index.php/Game_Content_Resources Umfangreiche Link-Sammlung im GPWiki]<br />
* [http://www.reinerstilesets.de Reiner's Tilesets] {{Kostenfrei}} enthält nicht nur Tilesets, sondern auch 3D-Modelle, Texturen, Soundeffekte und Tutorials<br />
<br />
=== 3D-Modelle ===<br />
<br />
* [http://www.3dcafe.com/ 3D Cafe] {{Bedingt kostenpflichtig}} bietet auch kostenlose 3D-Modelle, wenn man zuvor mindestens drei eigene Modelle auf die Seite geladen hat<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=10 OpenGameArt 3D] {{Kostenfrei}} Frei lizensierte 3D-Modelle<br />
* [http://www.blendswap.com/ blendswap] {{Kostenfrei}} Frei lizensierte Blender-Modelle<br />
* [http://www.daz3d.com/new-releases?dir=asc&order=price DAZ 3D Marketplace] {{Kostenpflichtig}}<br />
* [http://arteria3d.com/collections/audio/Medieval Arteria3d] {{Kostenpflichtig}}<br />
<br />
=== Grafiken und Texturen ===<br />
* [http://www.3d.sk/ 3D.SK] {{Kostenpflichtig}} Referenzbilder von Menschen speziell für 3D-Modellierung und Spieleentwicklung<br />
* [http://www.cgtextures.com/ CGTextures] {{Bedingt kostenpflichtig}} bietet eine große Sammlung kostenlos benutzbarer Texturen<br />
* [http://www.environment-textures.com/ Environment Textures] {{Kostenpflichtig}}<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=9 OpenGameArt 2D] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=14 Texturen] {{Kostenfrei}} Legale, frei lizensierte Grafiken<br />
* [http://www.lostgarden.com/ Lost Garden Art] {{Kostenfrei}}<br />
* [http://charas-project.net/ Charas Project] {{Kostenfrei}}<br />
* [http://spriters-resource.com/ The Spriters Resource] {{Kostenfrei}}<br />
* [https://vxresource.wordpress.com/ RPG Maker VX Resource Planet] {{Kostenfrei}}<br />
<br />
=== Soundeffekte und Musik ===<br />
<br />
* [http://www.audiomicro.com/ AudioMicro] {{Kostenpflichtig}}<br />
* [http://www.freesound.org/ Freesound] {{Kostenfrei}} Frei lizensierte community-kreierte Sounds<br />
* [http://incompetech.com/m/c/royalty-free/ Incompetech] {{Kostenfrei}} Musik unter der Creative Commons Attribution Lizenz (CC-BY)<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12 OpenGameArt Musik] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=13 Sounds] {{Kostenfrei}} Frei lizensierte Audiodateien<br />
* [http://www.soundsnap.com/ Soundsnap] {{Kostenpflichtig}}<br />
* [http://www.bensound.com/ bensound] {{Kostenfrei}}<br />
* [https://www.jamendo.com/ Jamendo] {{Bedingt kostenpflichtig}}<br />
<br />
=== Schriftarten ===<br />
<br />
* [http://www.dafont.com/ Dafont.com] {{Kostenfrei}}<br />
* [http://www.myfont.de/ MyFont.de] {{Kostenfrei}}<br />
* [http://openfontlibrary.org/ OpenFontLibrary] {{Kostenfrei}} Frei lizensierte Schriftarten<br />
* [http://www.urbanfonts.com/ Urban Fonts] {{Kostenfrei}}<br />
<br />
== Sonstiges ==<br />
<br />
* [http://www.wotsit.org/ Wotsit.org] Große Datenbank mit Beschreibung von Dateiformaten (nützlich, wenn man ein bestimmtes Dateiformat lesen oder schreiben möchte)<br />
* [http://www.wsusoffline.net/ WSUS Offline Updater] erzeugt komplette Offline-Updates (CD/DVD(.iso)/USB-Sticks) aller Windows/Office 2003-2013/C++ Laufzeit/.NET-Framework-Versionen.<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Discord-chat-urlMediaWiki:Discord-chat-url2018-05-22T21:30:44Z<p>David Scherfgen: </p>
<hr />
<div>https://discord.gg/yqRX67X</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Irc-chat-urlMediaWiki:Irc-chat-url2018-05-01T12:49:47Z<p>David Scherfgen: </p>
<hr />
<div>https://webchat.euirc.net/?channels=#sppro</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Spiele_programmieren_lernenSpiele programmieren lernen2018-02-03T18:19:46Z<p>David Scherfgen: /* Lektüre für C++ */</p>
<hr />
<div>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.<br />
<br />
== Was braucht es, um Spieleprogrammierer zu werden? ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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).<br />
<br />
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!<br />
<br />
== Was ist ein realistisches Ziel? ==<br />
<br />
[[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.]]<br />
<br />
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.''<br />
<br />
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?<br />
<br />
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.<br />
<br />
== Die Wahl der Programmiersprache ==<br />
<br />
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).<br />
<br />
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.<br />
<br />
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:<br />
<br />
; Komfort und Einsteigerfreundlichkeit<br />
: 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.<br />
: 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.<br />
<br />
; Verfügbarkeit von Werkzeugen und Bibliotheken<br />
: 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.<br />
: 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).<br />
<br />
; Effizienz<br />
: 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.<br />
<br />
=== C++ ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 C++.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C++-Spielprojekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="cpp" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
#include <iostream><br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
int fakultaet(int n) {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw std::domain_error("Fakultät für negative Zahlen ist nicht definiert!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultaet(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
int main() {<br />
// Begrüßung<br />
std::cout << "Hallo Spieleprogrammierer!" << std::endl;<br />
std::cout << "Gib eine Zahl ein! ";<br />
<br />
// Zahl einlesen.<br />
int zahl;<br />
std::cin >> zahl;<br />
<br />
// Quadrat der Zahl ausgeben.<br />
std::cout << "Das Quadrat von " << zahl << " ist: " << (zahl * zahl) << std::endl;<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
std::cout << "Die Fakultät von " << zahl << " ist: " << fakultaet(zahl) << std::endl;<br />
}<br />
catch(const std::exception& e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
std::cout << "Fehler: " << e.what() << std::endl;<br />
}<br />
<br />
return 0; // Ende des Programms<br />
}<br />
</sourcecode><br />
<br />
=== C# ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 CSharp.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C#-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="csharp"><br />
// Benötigte Bibliothek einbinden.<br />
using System;<br />
<br />
namespace CSharpBeispielprogramm<br />
{<br />
class Program<br />
{<br />
// Die Hauptfunktion "Main":<br />
// Hier startet das eigentliche Programm.<br />
static void Main(string[] args)<br />
{<br />
// Begrüßung<br />
Console.WriteLine("Hallo Spieleprogrammierer!");<br />
Console.Write("Gib eine Zahl ein! ");<br />
<br />
// Zahl einlesen<br />
int zahl = int.Parse(Console.In.ReadLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
Console.WriteLine("Das Quadrat von {0} ist: {1}", zahl, zahl * zahl);<br />
<br />
try<br />
{<br />
// Fakultät der Zahl ausgeben.<br />
Console.WriteLine("Die Fakultät von {0} ist: {1}", zahl, fakultät(zahl));<br />
}<br />
catch (Exception e)<br />
{<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
Console.WriteLine("Fehler: {0}", e);<br />
}<br />
}<br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n)<br />
{<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if (n < 0) throw new ArgumentOutOfRangeException("n", "Darf nicht negativ sein!");<br />
<br />
if (n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Java ===<br />
<br />
[[Datei:Screenshot Eclipse Java.png|thumb|right|Screenshot der Entwicklungsumgebung ''Eclipse'' mit einem Java-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="java" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
import java.io.*;<br />
<br />
public class JavaBeispielprogramm {<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n) throws Exception {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw new Exception("n darf nicht negativ sein!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
public static void main(String[] args) throws Exception {<br />
// Begrüßung<br />
System.out.println("Hallo Spieleprogrammierer!");<br />
System.out.print("Gib eine Zahl ein: ");<br />
<br />
// Zahl einlesen.<br />
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />
int zahl = Integer.parseInt(in.readLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
System.out.println("Das Quadrat von " + zahl + " ist: " + (zahl * zahl));<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
System.out.println("Die Fakultät von " + zahl + " ist: " + fakultät(zahl));<br />
}<br />
catch(Exception e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
System.out.println("Fehler: " + e.toString());<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Python ===<br />
<br />
[[Datei:Screenshot Aptana Studio 3 Python.png|thumb|right|Screenshot der Entwicklungsumgebung ''Aptana Studio 3'' mit einem Python-Projekt.]]<br />
<br />
[[Datei:Screenshot IDLE.png|thumb|right|Screenshot der minimalistischen Entwicklungsumgebung ''IDLE'' für Python.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="python"><br />
# Die folgende Funktion berechnet n!, die Fakultät von n.<br />
<br />
def fakultaet(n):<br />
# Signalisiere einen Fehler, wenn n negativ ist.<br />
if n < 0: raise ValueError("n darf nicht negativ sein!")<br />
elif n == 0: return 1 # 0! = 1<br />
else: return n * fakultaet(n - 1) # Rekursion: n! = n * (n - 1)!<br />
<br />
# Hier startet das eigentliche Programm.<br />
print("Hallo Spieleprogrammierer!") # Begrüßung<br />
zahl = input("Gib eine Zahl ein: ") # Zahl einlesen.<br />
<br />
# Quadrat der Zahl ausgeben.<br />
print("Das Quadrat von %d ist: %d" % (zahl, zahl * zahl))<br />
try:<br />
# Fakultät der Zahl ausgeben.<br />
print("Die Fakultät von %d ist: %d" % (zahl, fakultaet(zahl)))<br />
except Exception as e:<br />
# Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
print("Fehler: %s" % e)<br />
</sourcecode><br />
<br />
== Lernen einer Programmiersprache ==<br />
<br />
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.<br />
<br />
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:<br />
<br />
* Versuche möglichst regelmäßig zu lernen. Nur so bleibst du am Ball.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
* Bearbeite eventuell angebotene Übungsaufgaben, und vergleiche sie ggf. mit den vom Autor vorgeschlagenen Lösungen.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
=== Lektüre für C++ ===<br />
<br />
<xh4>C++-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>C++-Tutorials</xh4><br />
<br />
* [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).<br />
<br />
* [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.<br />
<br />
* 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].<br />
<br />
=== Lektüre für C# ===<br />
<br />
<xh4>C#-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>C#-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Java ===<br />
<br />
<xh4>Java-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
* [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.<br />
<br />
<xh4>Java-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Python ===<br />
<br />
<xh4>Python-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>Python-Tutorials</xh4><br />
<br />
* [http://docs.python.org/tutorial/ "The Python Tutorial"]: Das offizielle, sehr umfangreiche Python-Tutorial.<br />
<br />
* [https://py-tutorial-de.readthedocs.org/de/python-3.3/ "Das Python-Tutorial"]: Eine deutsche Übersetzung des offiziellen Python-Tutorials.<br />
<br />
== Auswahl einer passenden Bibliothek ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Eine kleine Übersicht ===<br />
<br />
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.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Bibliothek !! Sprachen !! Kurzbeschreibung !! Weiterführende Links<br />
|-<br />
| [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. ||<br />
* [http://www.sfml-dev.org/tutorials/ Tutorials]<br />
* [http://www.sfml-dev.org/documentation/ Dokumentation]<br />
* [https://www.spieleprogrammierer.de/wiki/SFML_Einsteiger-Tipps SFML Einsteiger-Tipps]<br />
|-<br />
| [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. ||<br />
* [[SDL-Tutorial]]<br />
* [http://wiki.libsdl.org/moin.cgi/SDL1.2Tutorials Weitere Tutorials]<br />
* [http://www.libsdl.org/cgi/docwiki.cgi Dokumentation]<br />
|-<br />
| [http://pygame.org/ Pygame] || Python || Pygame basiert auf SDL, bietet aber noch zusätzliche Funktionalität. ||<br />
* [[Pygame-Tutorial]]<br />
* [http://www.pygame.org/docs/ Dokumentation und weitere Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://alleg.sourceforge.net/docs.html Tutorials]<br />
* [http://alleg.sourceforge.net/api.html Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://msdn.microsoft.com/en-us/bb188199 Tutorials und Video-Tutorials]<br />
* [http://msdn.microsoft.com/en-us/library/bb200104.aspx Weitere Einführungen und Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://hge.relishgames.com/doc/?tutorials__main.html Tutorials]<br />
* [http://hge.relishgames.com/doc/ Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://slick.cokeandcode.com/wiki/doku.php Dokumentation und Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://code.google.com/p/libgdx/wiki/TableOfContents?tm=6 Dokumentation und Tutorials]<br />
|}<br />
<br />
=== Erste Schritte mit einer Bibliothek zur Spieleprogrammierung ===<br />
<br />
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.<br />
<br />
== Spiele programmieren ==<br />
<br />
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.<br />
<br />
=== Ein simples Spiel zum Aufwärmen ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Kritischer Rückblick und die nächsten Spiele ===<br />
<br />
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.<br />
<br />
* Welche Aspekte des Spiels haben Spaß gemacht, welche nicht? Woran könnte das gelegen haben?<br />
* War das Spiel zu schwer oder zu leicht?<br />
* War die Steuerung intuitiv?<br />
* Wusste man immer, was man zu tun hat?<br />
* 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]).<br />
<br />
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.<br />
<br />
=== Wie geht es weiter? ===<br />
<br />
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?<br />
<br />
''Viel Erfolg!''<br />
<br />
[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Einsteiger]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:C-Sharp]]<br />
[[Kategorie:Java]]<br />
[[Kategorie:Python]]</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Link-SammlungLink-Sammlung2018-02-03T18:19:17Z<p>David Scherfgen: /* Literatur zur Spieleentwicklung */</p>
<hr />
<div>In diesem Artikel sollen Links gesammelt werden, die für die Spieleentwicklung nützlich sind.<br />
<br />
== Webseiten und Tutorials zur Spieleentwicklung ==<br />
<br />
* [http://www.gamedev.net/ GameDev.net] Große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gamasutra.com/ Gamasutra] Weitere große englischsprachige Webseite zum Thema Spieleentwicklung<br />
* [http://www.gpwiki.org/ Game Programming Wiki] Englischsprachiges Wiki zum Thema Spieleentwicklung<br />
* [http://gafferongames.com/ Game Development + Game Programming Tutorials von Glenn Fiedler] Hochqualitative Reihe von Artikeln und Tutorials zu technischen Aspekten der Spieleprogrammierung<br />
* [http://www.ludism.org/gamedesign/ Game Design Wiki] ist ein nicht-technisches Wiki zum Thema Game-Design<br />
* [http://chrishecker.com/ Chris Hecker's Homepage] enthält viele technische Artikel<br />
* [http://en.wikibooks.org/wiki/OpenGL_Programming Wikibooks OpenGL] enthält viele moderne, englische Tutorials über OpenGL<br />
* [http://www.spieleprogrammierung.net/ Spieleprogrammierung.net] bietet deutschsprachige Tutorials zu OpenGL, OpenAL und OpenCL<br />
* [http://www.gamedevelop.eu/ Gamedevelop.eu] enthält deutschsprachige Artikel und Tutorials zur Spieleentwicklung<br />
* [http://www.makinggames.de/ Makinggames.de] enhält interessante Artikel zum thema Spieleentwicklung<br />
* [http://gameprogrammingpatterns.com/ GameProgrammingPatterns.com] enthält wenige, aber ausführliche Artikel zu Design Patterns in der Spieleentwicklung<br />
* [http://natureofcode.com/ The Nature of Code] ist ein frei verfügbares, aber auch kaufbares Buch über Grundkonzepte und fortgeschrittene Themen der Spieleentwicklung<br />
<br />
== Literatur zur Spieleentwicklung ==<br />
* {{Amazon|3446446443|"C++ für Spieleprogrammierer" von Heiko Kalista}}<br />
* {{Amazon|3446405968|"3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen}}<br />
* "Game Programming Gems"-Reihe<br />
** {{Amazon|1584500492|"Game Programming Gems 1"}} und {{Amazon|3826609239|die deutsche Übersetzung}}<br />
** {{Amazon|1584500549|"Game Programming Gems 2"}}<br />
** {{Amazon|1584502339|"Game Programming Gems 3"}}<br />
** {{Amazon|1584502959|"Game Programming Gems 4"}} und {{Amazon|3446229442|die deutsche Übersetzung}}<br />
** {{Amazon|1584503521|"Game Programming Gems 5"}}<br />
** {{Amazon|1584504501|"Game Programming Gems 6"}}<br />
** {{Amazon|1584505273|"Game Programming Gems 7"}}<br />
** {{Amazon|1584507020|"Game Programming Gems 8"}}<br />
* "GPU Gems"-Reihe<br />
** {{Amazon|0321228324|"GPU Gems 1"}} [http://http.developer.nvidia.com/GPUGems/gpugems_pref01.html (kostenlos online lesbar)]<br />
** {{Amazon|0321335597|"GPU Gems 2"}} [http://http.developer.nvidia.com/GPUGems2/gpugems2_frontmatter.html (kostenlos online lesbar)]<br />
** {{Amazon|0321515269|"GPU Gems 3"}} und {{Amazon|B000UZQH52|die Kindle-eBook-Version}} [http://http.developer.nvidia.com/GPUGems3/gpugems3_pref01.html (kostenlos online lesbar)]<br />
* [http://www.gdcvault.com/gdmag Game Developer Magazine (alle Ausgaben von 1994-2013 gratis)]<br />
<br />
=== Objektorientierte Analyse, Design und Programmierung ===<br />
<br />
* {{Amazon|3897214954|Objektorientierte Analyse und Design von Kopf bis Fuß}}<br />
* {{Amazon|3540412867|Objektorientierter Softwareentwurf: Integration mit UML}}<br />
* {{Amazon|393258838X|UML @ Work}}, {{Amazon|3898641945|UML @ Work (Taschenbuch)}}<br />
* {{Amazon|3898642615|UML @ Work - Objektorientierte Modellierung mit UML 2}}<br />
* {{Amazon|3486588559|Analyse und Design mit UML 2.3: Objektorientierte Softwareentwicklung}}<br />
* [http://www.oreilly.de/catalog/9780596007126/ Head First Design Patterns] und die deutsche Übersetzung {{Amazon|3897214210|Entwurfsmuster von Kopf bis Fuß}}<br />
* {{Amazon|3772364888|JavaScript: Objektorientierung und Entwurfsmuster: Stabilen und sicheren Code mit JavaScript entwickeln}}<br />
<br />
== Komplette Spiele-Entwicklungssysteme ==<br />
<br />
* [http://www.unity3d.com/ Unity] {{Bedingt kostenpflichtig}}<br />
* [http://udk.com/ Unreal Development Kit] {{Bedingt kostenpflichtig}}<br />
* [http://www.yoyogames.com/gamemaker/ GameMaker] {{Bedingt kostenpflichtig}}<br />
* [http://www.conitec.com/german/gstudio/ Gamestudio] {{Bedingt kostenpflichtig}}<br />
* [http://jmonkeyengine.com/ jMonkeyEngine]<br />
* [http://mycryengine.com/ CryENGINE] {{Bedingt kostenpflichtig}}<br />
* [http://www.neoaxis.com/ NeoAxis Game Engine] {{Bedingt kostenpflichtig}}<br />
* [http://www.garagegames.com/products/torque-3d/ Torque3D] {{Kostenpflichtig}} und [http://www.garagegames.com/products/torque-2d/ Torque2D] {{Kostenpflichtig}}<br />
* [http://source.valvesoftware.com/ Source SDK] {{Kostenpflichtig}}<br />
* [http://www.terathon.com/c4engine/ C4 Engine] {{Kostenpflichtig}}<br />
* [http://stencyl.com Stencyl]<br />
* [http://www.scirra.com/construct-classic/ Construct Classic]<br />
* [http://www.scirra.com/construct2/ Construct 2] {{Bedingt kostenpflichtig}} (HTML5)<br />
* [http://www.clickteam.com/website/usa/multimedia-fusion-2.html Multimedia Fusion 2] {{Kostenpflichtig}}<br />
* [http://duality.fetzenet.de/ Duality] {{Kostenfrei}} (In Entwicklung)<br />
<br />
== Entwicklungsumgebungen, Compiler und Sprachen ==<br />
<br />
=== Entwicklungsumgebungen und Compiler ===<br />
* [http://www.microsoft.com/visualstudio/ Visual Studio] {{Kostenpflichtig}} und die kostenlosen [http://www.microsoft.com/germany/express/ Express Editions] (C++, C#, VB.NET)<br />
* [http://www.codeblocks.org/ Code::Blocks] (C++)<br />
* [http://www.eclipse.org/ Eclipse] (Java, C++, PHP, HTML, JavaScript, CSS, XML & Co.; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.netbeans.org/ Netbeans] (Java, C++, Fortran, PHP, Groovy, HTML, JavaScript, CSS, XML & Co.; siehe [http://netbeans.org/features/index.html Netbeans: Features]; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://developer.apple.com/technologies/tools/ Xcode] (C++, Objective-C, Assembler; 3<sup>rd</sup>-Party-Module für andere Sprachen vorhanden, beliebig erweiterbar)<br />
* [http://www.flashdevelop.org/ FlashDevelop] (AS3, HaXe, XML, MXML, HTML)<br />
* [http://www.monodevelop.com/ MonoDevelop] (C#, VB.NET, C++, Vala)<br />
* [http://www.icsharpcode.net/OpenSource/SD/Default.aspx SharpDevelop] (C#, VB.NET)<br />
<br />
=== Sprachen für die Java VM ===<br />
Siehe auch [http://en.wikipedia.org/wiki/List_of_JVM_languages List of JVM languages]<br />
* [http://java.com Java]<br />
* [http://www.jython.org Jython]<br />
* [http://groovy.codehaus.org/ Groovy]<br />
* [http://clojure.org/ Clojure]<br />
* [http://www.scala-lang.org/ Scala]<br />
* [http://jruby.org/ JRuby]<br />
<br />
=== Sprachen für .NET/CLI ===<br />
Siehe auch [http://de.wikipedia.org/wiki/Liste_von_.NET-Sprachen Liste von .NET-Sprachen]<br />
* [http://msdn.microsoft.com/de-de/vcsharp/aa336706 C#]<br />
* [http://msdn.microsoft.com/de-de/vbasic/ms789056 Visual Basic]<br />
* [http://ironpython.net/ IronPython]<br />
* [http://msdn.microsoft.com/en-us/library/3bf5fs13.aspx JScript]<br />
* [http://msdn.microsoft.com/en-us/vstudio/hh388569 F#]<br />
<br />
== Softwarebibliotheken und Programmierschnittstellen ==<br />
<br />
=== Frameworks für Multimedia und Spieleentwicklung ===<br />
<br />
* [http://www.libsdl.org/ SDL (Simple DirectMedia Layer)] (C++, .NET, Java, Python u.a.)<br />
* [http://www.sfml-dev.org/ SFML (Simple and Fast Multimedia Library)] (C++, .NET, Python)<br />
* [http://www.allegro.cc/ Allegro] (C++)<br />
* [http://msdn.microsoft.com/directx/ DirectX] (C++), [http://slimdx.org/ SlimDX]{{Wrapper|wrapped=DirectX}} (.NET) und [http://code.google.com/p/sharpdx/ SharpDX]{{Wrapper|wrapped=DirectX}} (.NET)<br />
* [http://hge.relishgames.com/ HGE (Haaf's Game Engine)] (C++)<br />
* [http://sourceforge.net/projects/popcapframework/ PopCap Games Framework] (C++)<br />
* [http://pygame.org/ Pygame] (Python)<br />
* [http://msdn.microsoft.com/en-us/aa937791.aspx XNA] (.NET)<br />
* [http://slick.cokeandcode.com/ Slick] (Java)<br />
* [http://libgdx.badlogicgames.com/ LibGDX] (Java)<br />
* [http://flashpunk.net/ FlashPunk] (Flash)<br />
* [http://flixel.org/ Flixel] (Flash)<br />
* [http://love2d.org/ LÖVE] (Lua)<br />
* [http://alternativaplatform.com/ AlternativaPlatform] (Flash)<br />
* [http://www.crystalspace3d.org/ CrystalSpace3D] (C++)<br />
* [http://clanlib.org/ ClanLib] (C++)<br />
* [http://impactjs.com/ Impact] {{Kostenpflichtig}} (JavaScript)<br />
* [http://lwjgl.org/ Lightweight Java Game Library (LWJGL)]{{Wrapper}} (Java)<br />
* [http://ardor3d.com/ Ardor3D] (Java)<br />
* [http://www.panda3d.org/ Panda3D] (Python, C++)<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.opengl.org/ OpenGL]<br />
* [http://www.ogre3d.org/ OGRE (Object-Oriented Graphics Rendering Engine)] Sehr ausgereifte objektorientierte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://irrlicht.sourceforge.net/ Irrlicht Engine] Kompakte 3D-Grafik-Engine (C++, .NET, Java, Python)<br />
* [http://openil.sourceforge.net/ DevIL] Bildverarbeitungsbibliothek (C++)<br />
* [http://opencv.willowgarage.com/ OpenCV] Computer Vision-Bibliothek (C++, .NET, Java, Python)<br />
* [http://www.starling-framework.org/ Starling Framework] GPU-beschleunigte 2D-Grafik (Flash)<br />
* [http://jogamp.org/ JOGL]{{Wrapper|wrapped=OpenGL}} (Java)<br />
* [http://www.opentk.com/ OpenTK]{{Wrapper}} (.NET)<br />
* [http://theora.org/ Theora] Freier Video-Codec<br />
* [http://assimp.sourceforge.net/ Open Asset Import Library] Bibliothek zum Laden, Optimieren und Speichern von 3D-Modellen in verschiedenen Formaten (C, C++)<br />
<br />
=== Audio ===<br />
<br />
* [http://www.fmod.org/ FMOD] {{Bedingt kostenpflichtig}} Portable Audio-Engine mit sehr großem Funktionsumfang (C++, .NET, Java, Python)<br />
* [http://www.un4seen.com/bass.html BASS] {{Bedingt kostenpflichtig}} (C++, .NET)<br />
* [http://connect.creativelabs.com/openal/ OpenAL]<br />
* [http://kcat.strangesoft.net/openal.html OpenAL Soft]<br />
* [http://jogamp.org/ JOAL]{{Wrapper|wrapped=OpenAL}} (Java)<br />
* [http://xiph.org/vorbis/ Vorbis] Freier Audio-Codec<br />
<br />
=== Physik ===<br />
<br />
Siehe auch [http://de.wikipedia.org/wiki/Physikengine#Physik-Engines ''Physikengine - Physik-Engines'' auf Wikipedia]<br />
<br />
* [http://www.bulletphysics.org/ Bullet] (C++), [http://code.google.com/p/bulletsharp/ BulletSharp]{{Wrapper}} (.NET) und [http://jbullet.advel.cz/ JBullet] (Java)<br />
* [http://developer.nvidia.com/physx PhysX] (C++) und [http://physxdotnet.codeplex.com/ PhysX.Net] (.NET)<br />
* [http://www.newtondynamics.com/ Newton Game Dynamics] (C++, .NET, Python, Pascal)<br />
* [http://opende.sourceforge.net/ ODE (Open Dynamics Engine)] (C++, .NET)<br />
* [http://www.havok.com/products/physics Havok Physics] (C++) {{Bedingt kostenpflichtig}}<br />
* [http://box2d.org/ Box2D] (C++), [http://jbox2d.org/ JBox2D] (Java), [http://code.google.com/p/box2dx/ Box2DX] (.NET), [http://box2dxna.codeplex.com/ Box2D.XNA] (.NET), [http://code.google.com/p/pybox2d/ pybox2d] (Python), [http://www.box2dflash.org/ Box2DFlash] (Flash) und [http://box2d-js.sourceforge.net/ Box2DJS] (JavaScript) - Leistungsstarke 2D-Physik-Engine, die von vielen Spielen genutzt wird<br />
<br />
=== Scripting ===<br />
<br />
* [http://www.lua.org/ Lua] und [http://sourceforge.net/projects/luabind/ Luabind] (C++-Schnittstelle)<br />
* [http://www.python.org/ Python] und [http://www.boost.org/doc/libs/release/libs/python/doc/index.html Boost.Python] (C++-Schnittstelle), [http://jepp.sourceforge.net/ JEPP], [http://jpype.sourceforge.net/ JPype], [http://pypi.python.org/pypi/JCC/ JCC]<br />
* [http://www.angelcode.com/angelscript/ AngelScript]<br />
* [http://squirrel-lang.org/ Squirrel]<br />
* [http://www.swig.org/ SWIG (Simplified Wrapper and Interface Generator)] vereinfacht die Integration einer Skriptsprache in ein Programm durch automatisches Generieren von Schnittstellen<br />
<br />
=== Netzwerk ===<br />
<br />
* [http://www.jenkinssoftware.com/ RakNet] (C++)<br />
* [http://think-async.com/Asio/ Asio C++ Library]<br />
* [http://syncsys.sourceforge.net/ SyncSys] (C++)<br />
* [http://code.google.com/p/kryonet/ kryonet] TCP- und UDP-Client/Server-Bibliothek inkl. Serialisierung. Speziell auf Spieleentwicklung ausgelegt. (Java)<br />
* [http://www.jboss.org/netty/ JBoss Netty] Ausgebaute komplexe Netzwerbibliothek mit Unterstützung von WebSocket und HTTP Tunneling. Besonders für MMO und Browsergames interessant. (Java)<br />
* [http://mina.apache.org/ Apache Mina] Alternative zu JBoss Netty. (Java)<br />
* [http://jersey.java.net/ Jersey] Referenzimplementierung des JAX-RS-Standards (JSR 311) zum Entwickeln von RESTful Web Services. Wenn ein Browsergame mit Flash oder JavaScript entwickelt wird, sollte man sich [http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e82 hier] mal anschauen wie bequem man Webservices entwickeln kann. (Java)<br />
* [http://code.google.com/p/lidgren-network-gen3/ Lidgren.Network] (.NET)<br />
* [http://www.zoidcom.com/ Zoidcom] (C++)<br />
<br />
=== GUI-Frameworks ===<br />
<br />
* [http://mygui.info/ MyGUI]<br />
* [http://www.cegui.org.uk/ CEGUI]<br />
* [http://www.cs.unc.edu/~rademach/glui/ GLUI]<br />
* [http://nifty-gui.lessvoid.com/ Nifty GUI] (Java)<br />
* [http://qt-project.org/ Qt] (C++)<br />
* [http://www.wxwidgets.org/ wxWidgets]<br />
* [http://www.gtk.org/ GTK+]<br />
* [http://developer.apple.com/cocoa/ Cocoa]<br />
* [http://fltk.org/ FLTK]<br />
* [http://code.google.com/p/gwen/ GWEN]<br />
* [http://sfgui.sfml-dev.de/ SFGUI]<br />
<br />
=== Daten ===<br />
<br />
* [http://www.grinninglizard.com/tinyxml/ TinyXml] und [http://code.google.com/p/ticpp/ ticpp] XML-Bibliothek zum Lesen und Schreiben von XML-Dateien<br />
* [http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx SharpZipLib] bietet Zugriff auf Archive im Format Zip, GZip, Tar und BZip<br />
* [http://icculus.org/physfs/ PhysicsFS] Virtuelles Dateisystem für Spiele, das auch Archive unterstützt (C++)<br />
* [http://zlib.net/ zlib] und [http://www.winimage.com/zLibDll/minizip.html Minizip] Bibliotheken zur Datenkompression und zum Lesen und Schreiben von Zip-Archiven<br />
* [http://www.jdom.org/ JDOM] (Java) Zugriff auf XML-Dateien<br />
* [http://www.sqlite.org/download.html SQLite] (C++, .NET) eingebettetes, relationales DBMS (der Python-Interpreter besitzt standardmäßig eine Implementierung)<br />
* [http://db.apache.org/derby/ Derby] (Java) eingebettetes, relationales DBMS<br />
<br />
=== Sonstige ===<br />
<br />
* [http://www.boost.org/ Boost C++ Libraries] Große Sammlung an C++-Bibliotheken für verschiedenste Zwecke (C++)<br />
* [http://pocoproject.org/ POCO] Weitere C++-Bibliothek für verschiedenste Zwecke (C++)<br />
* [http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx SharpUSBLib] bietet Low-Level Zugriff auf USB-Geräte (C#)<br />
* [http://sourceforge.net/projects/sharpcvslib/ SharpCvsLib] stellt einen CVS-Client dar (C#) ''(notwendig für Spieleprogrammierung?)''<br />
* [http://code.google.com/p/google-guice/ Google Guice] Leichtgewichtiges Dependency-Injection-Framework. Komplexere Anwendungen/Spiele können von [http://de.wikipedia.org/wiki/Dependency_Injection DI] profitieren. (Java)<br />
* [http://code.google.com/p/recastnavigation/ Recast+Detour] Navigation-Mesh- und Pathfinding-Toolset<br />
* [http://code.google.com/p/caliper/ Google Caliper] Microbenchmarking-Framework (Java)<br />
* [http://launch4j.sourceforge.net/ Launch4J] Werkzeug zum Wrappen von Java-Anwendungen in ausführbare Dateien für verschiedene Plattformen (Java)<br />
* [http://gamadu.com/artemis/ Artemis] Entity-System-Framework für Spiele (Java)<br />
* [http://www.grinninglizard.com/MicroPather/ MicroPather] A* Pathfinding für die Suche nach einem kürzesten und schnellsten Weg<br />
<br />
== Tools ==<br />
<br />
* [http://www.angelcode.com/products/bmfont/ Bitmap Font Generator] erzeugt Bitmap-Fonts mit vielfältigen Optionen<br />
* [http://code.google.com/p/fontbuilder/ Fontbuilder] erzeugt ebenfalls Bitmap-Fonts<br />
* [http://optipng.sourceforge.net/ OptiPNG] optimiert PNG-Dateien auf Größe durch Verbesserung der Kompression ohne Qualitätsverlust<br />
* [http://www.wholetomato.com/ Visual Assist X] bietet verbessertes Syntax-Highlighting und intelligente Codevervollständigung sowie Refactoring für Visual Studio<br />
* [http://www.codeandweb.com/texturepacker TexturePacker] vereinfacht das Erstellen von Spritesheets, direkter Export für viele Engines bereits enthalten<br />
<br />
=== Diagramm-Tools ===<br />
<br />
Eine Auflistung von UML-Tools ist unter [http://www.jeckle.de/umltools.html jeckle.de] zu finden.<br />
<br />
* [http://live.gnome.org/Dia Dia] Programm zum Erzeugen von (Klassen-)Diagrammen und Zeichnungen<br />
* [http://argouml.tigris.org/ ArgoUML] Programm zum Erzeugen von UML-Diagrammen<br />
* [http://www.microtool.de/objectif/de/index.asp ObjectiF] {{Kostenpflichtig}} Programm zum Erzeugen von UML-Diagrammen<br />
<br />
=== Versionsverwaltungssysteme ===<br />
<br />
* [http://subversion.tigris.org/ Subversion] Zentralisierte Versionsverwaltung<br />
* [http://git-scm.com/ Git] Verteilte Versionsverwaltung<br />
* [http://mercurial.selenic.com/ Mercurial] Verteilte Versionsverwaltung<br />
<br />
=== Level-Editoren und -Generatoren ===<br />
<br />
* [http://tide.codeplex.com/ tIDE (Tilemap Integrated Development Environment)] Sehr flexibler 2D-Tilemap-Editor mit Plugin-Unterstützung<br />
* [http://ogmoeditor.com/ Ogmo Editor] 2D-Tilemap-Editor<br />
* [http://www.mapeditor.org/ Tiled] 2D-Tilemap-Editor<br />
* [http://www.bundysoft.com/L3DT/ L3DT (Large 3D Terrain Generator)] {{Bedingt kostenpflichtig}}<br />
* [http://www.davidwaltersdevelopment.com/tools/gridcart/ Grid Cartographer] {{Bedingt kostenpflichtig}}<br />
<br />
=== Namensgeneratoren ===<br />
<br />
* [http://ebon.pyorre.net/ Everchanging Book of Names] {{Bedingt kostenpflichtig}}<br />
* [http://www.rinkworks.com/namegen/ Fantasy Name Generator]<br />
* [http://www.behindthename.com/random/ Behind the Name: Random Name Generator]<br />
* [http://www.dotomator.com/web20.html/ Dotomator: Web 2.0 Name Generator]<br />
<br />
== Software zur Content-Erstellung ==<br />
<br />
=== 3D-Modellierung ===<br />
<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?id=14642267&siteID=403786 3ds Max] {{Kostenpflichtig}}<br />
* [http://www.autodesk.de/adsk/servlet/pc/index?siteID=403786&id=14657512 Maya] {{Kostenpflichtig}}<br />
* [http://www.blender.org/ Blender] {{Kostenfrei}}<br />
* [http://www.maxon.net/ CINEMA 4D] {{Kostenpflichtig}}<br />
* [http://nevercenter.com/silo/ Silo] {{Kostenpflichtig}}<br />
* [http://3d-coat.com/ 3D-Coat] {{Kostenpflichtig}}<br />
* [http://www.pixologic.com/sculptris/ Sculptris]<br />
* [http://www.daz3d.com/i/products/hexagon? Hexagon 2] {{Kostenpflichtig}}<br />
* [http://www.makehuman.org/ Makehuman] {{Kostenfrei}} ist ein Open Source-Projekt zur flexiblen Erstellung menschlicher 3D-Modelle<br />
* [http://www.anim8or.com/ Anim8or] ist ein beliebtes Modellierungsprogramm mit Animationsmöglichkeiten<br />
* [https://www.daz3d.com/get_studio DAZ Studio] {{Kostenfrei}}<br />
<br />
=== Grafik ===<br />
<br />
* [http://www.adobe.com/de/products/photoshop.html Adobe Photoshop] {{Kostenpflichtig}}<br />
* [http://www.gimp.org/ GIMP (GNU Image Manipulation Program)]<br />
* [http://inkscape.org/ Inkscape]<br />
* [http://www.paint.net/ Paint.NET]<br />
* [http://www.cosmigo.com/promotion/ Cosmigo Pro Motion] {{Kostenpflichtig}}<br />
* [http://www.humanbalance.net/gale/us/ GraphicsGale] {{Kostenpflichtig}}<br />
* [http://www.aseprite.org/ Aseprite]<br />
* [http://www.piskelapp.com/ PiskelApp]<br />
* [http://renderhjs.net/shoebox/ ShoeBox]<br />
* [http://www.pickleeditor.com/ Pickle] {{Kostenpflichtig}}<br />
* [http://pyxeledit.com/ Pyxel Edit] {{Kostenpflichtig}}<br />
* [http://www.snakehillgames.com/spritelamp/ Sprite Lamp] {{Kostenpflichtig}}<br />
* [http://autotilegen.com/ AutoTileGen] {{Kostenpflichtig}}<br />
* [http://www.brashmonkey.com/spriter.htm Spriter] {{Kostenpflichtig}}<br />
* [http://hexraystudios.com/hexels/ Hexels]<br />
* [http://de.esotericsoftware.com/ Spine] {{Kostenpflichtig}}<br />
* [http://www.vitruality.com/tools/spartan/ Spartan]<br />
* [https://krita.org/ Krita]<br />
* [https://www.allegorithmic.com/ Allegorithmic Substance Designer / Painter] {{Kostenpflichtig}}<br />
* [http://icofx.ro/ IcoFX] {{Kostenpflichtig}}<br />
<br />
=== Audio ===<br />
<br />
* [http://audacity.sourceforge.net/ Audacity]<br />
* [http://lmms.sourceforge.net/ LMMS]<br />
* [http://flstudio.image-line.com/ FL Studio] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/products/audition.html Adobe Audition] {{Kostenpflichtig}}<br />
* [http://www.renoise.com/ Renoise] {{Kostenpflichtig}}<br />
* [http://www.drpetter.se/project_sfxr.html sfxr]<br />
* [http://goldwave.com/ GoldWave] {{Kostenpflichtig}}<br />
* [http://www.steinberg.net/de/products/cubase/start.html Cubase] {{Kostenpflichtig}}<br />
* [http://www.reaper.fm/ Reaper] {{Kostenpflichtig}}<br />
* [http://www.bitwig.com/en/bitwig-studio/overview.html Bitwig Studio] {{Kostenpflichtig}}<br />
* [http://famitracker.com/ Famitracker]<br />
<br />
=== Video ===<br />
<br />
==== Aufnahme ====<br />
<br />
* [http://www.mirillis.com/de Mirillis] {{Kostenpflichtig}}<br />
* [http://www.bandicam.com/de Bandicam] {{Bedingt kostenpflichtig}}<br />
* [http://exkode.com/dxtory-features-en.html Dxtory] {{Kostenpflichtig}}<br />
* [http://www.fraps.com Fraps] {{Kostenpflichtig}}<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.videolan.org/vlc/ VLC Media Player]<br />
* [http://camstudio.org/ CamStudio]<br />
* [http://www.playclaw.com/de/ PlayClaw] {{Kostenpflichtig}}<br />
* [https://obsproject.com/ Open Broadcast Software]<br />
<br />
==== Verarbeitung ====<br />
<br />
* [http://www.virtualdub.org/ VirtualDub]<br />
* [http://www.techsmith.de/camtasia.asp Camtasia] {{Kostenpflichtig}}<br />
* [http://www.sonycreativesoftware.com/vegassoftware Sony Vegas] {{Kostenpflichtig}}<br />
* [http://handbrake.fr Handbrake]<br />
* [http://www.lightworksbeta.com/ Lightworks]<br />
* [http://tmpgenc.pegasys-inc.com/de/product/tvmw5.html TMPGEnc Video Mastering Works 5] {{Kostenpflichtig}}<br />
* [http://www.adobe.com/de/products/premiere.html Adobe Premiere] {{Kostenpflichtig}}<br />
* [http://staxmedia.sourceforge.net/ StaxRip]<br />
* [http://sourceforge.net/projects/megui/ MeGUI]<br />
* [http://explore.live.com/windows-live-movie-maker Windows Live Movie Maker]<br />
<br />
== Fertiger Content ==<br />
<br />
Hier soll auf Seiten verwiesen werden, auf denen man (vorzugsweise kostenlose) Grafiken, 3D-Modelle, Soundeffekte und Musikstücke finden kann.<br />
<br />
* [http://kenney.itch.io/kenney-donation Kenney Donation Pack] ist eine Sammlung von über 6000 frei verwendbaren Assets, für die der Autor eine Spende verlangt<br />
* [http://content.gpwiki.org/index.php/Game_Content_Resources Umfangreiche Link-Sammlung im GPWiki]<br />
* [http://www.reinerstilesets.de Reiner's Tilesets] {{Kostenfrei}} enthält nicht nur Tilesets, sondern auch 3D-Modelle, Texturen, Soundeffekte und Tutorials<br />
<br />
=== 3D-Modelle ===<br />
<br />
* [http://www.3dcafe.com/ 3D Cafe] {{Bedingt kostenpflichtig}} bietet auch kostenlose 3D-Modelle, wenn man zuvor mindestens drei eigene Modelle auf die Seite geladen hat<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=10 OpenGameArt 3D] {{Kostenfrei}} Frei lizensierte 3D-Modelle<br />
* [http://www.blendswap.com/ blendswap] {{Kostenfrei}} Frei lizensierte Blender-Modelle<br />
* [http://www.daz3d.com/new-releases?dir=asc&order=price DAZ 3D Marketplace] {{Kostenpflichtig}}<br />
* [http://arteria3d.com/collections/audio/Medieval Arteria3d] {{Kostenpflichtig}}<br />
<br />
=== Grafiken und Texturen ===<br />
* [http://www.3d.sk/ 3D.SK] {{Kostenpflichtig}} Referenzbilder von Menschen speziell für 3D-Modellierung und Spieleentwicklung<br />
* [http://www.cgtextures.com/ CGTextures] {{Bedingt kostenpflichtig}} bietet eine große Sammlung kostenlos benutzbarer Texturen<br />
* [http://www.environment-textures.com/ Environment Textures] {{Kostenpflichtig}}<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=9 OpenGameArt 2D] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=14 Texturen] {{Kostenfrei}} Legale, frei lizensierte Grafiken<br />
* [http://www.lostgarden.com/ Lost Garden Art] {{Kostenfrei}}<br />
* [http://charas-project.net/ Charas Project] {{Kostenfrei}}<br />
* [http://spriters-resource.com/ The Spriters Resource] {{Kostenfrei}}<br />
* [https://vxresource.wordpress.com/ RPG Maker VX Resource Planet] {{Kostenfrei}}<br />
<br />
=== Soundeffekte und Musik ===<br />
<br />
* [http://www.audiomicro.com/ AudioMicro] {{Kostenpflichtig}}<br />
* [http://www.freesound.org/ Freesound] {{Kostenfrei}} Frei lizensierte community-kreierte Sounds<br />
* [http://incompetech.com/m/c/royalty-free/ Incompetech] {{Kostenfrei}} Musik unter der Creative Commons Attribution Lizenz (CC-BY)<br />
* [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12 OpenGameArt Musik] und [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=13 Sounds] {{Kostenfrei}} Frei lizensierte Audiodateien<br />
* [http://www.soundsnap.com/ Soundsnap] {{Kostenpflichtig}}<br />
* [http://www.bensound.com/ bensound] {{Kostenfrei}}<br />
<br />
=== Schriftarten ===<br />
<br />
* [http://www.dafont.com/ Dafont.com] {{Kostenfrei}}<br />
* [http://www.myfont.de/ MyFont.de] {{Kostenfrei}}<br />
* [http://openfontlibrary.org/ OpenFontLibrary] {{Kostenfrei}} Frei lizensierte Schriftarten<br />
* [http://www.urbanfonts.com/ Urban Fonts] {{Kostenfrei}}<br />
<br />
== Sonstiges ==<br />
<br />
* [http://www.wotsit.org/ Wotsit.org] Große Datenbank mit Beschreibung von Dateiformaten (nützlich, wenn man ein bestimmtes Dateiformat lesen oder schreiben möchte)<br />
* [http://www.wsusoffline.net/ WSUS Offline Updater] erzeugt komplette Offline-Updates (CD/DVD(.iso)/USB-Sticks) aller Windows/Office 2003-2013/C++ Laufzeit/.NET-Framework-Versionen.<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/2D-Kollisionserkennung2D-Kollisionserkennung2017-09-28T21:24:17Z<p>David Scherfgen: Anpassung für MathJax</p>
<hr />
<div>{{Baustelle}}<br />
[[Kategorie:Geometrie]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:C-Sharp]]<br />
[[Kategorie:Java]]<br />
[[Kategorie:Python]]<br />
In diesem Artikel geht es um 2D-Kollisionserkennung, also die Überprüfung, ob sich zwei Objekte berühren oder schneiden. Für Anwendungen, bei denen dies eine zentrale Rolle spielt, empfiehlt sich auch ggf. der Einsatz einer [[Link-Sammlung#Physik|Physik-Engine]]. Eine Physik-Engine kann Kollisionen nicht nur sehr effizient erkennen, sondern auch physikalisch korrekt darauf reagieren.<br />
<br />
== Erkennung anhand geometrischer Formen ==<br />
<br />
Häufig werden Spielobjekte durch einfache geometrische Formen (Kreise, Rechtecke, Polygone) angenähert, da eine Kollisionserkennung für solche Formen einfacher bzw. schneller durchgeführt werden kann. Dabei nimmt man in Kauf, dass die physikalische Form des Objekts von seiner sichtbaren Form abweicht. Im Folgenden werden Kollisionstests für zweidimensionale Formen behandelt.<br />
<br />
=== Kollision zwischen zwei achsenausgerichteten Rechtecken ===<br />
<br />
Die Prüfung einer Kollision zweier achsenausgerichteten (nicht rotierten) Rechtecken kann sehr effizient durchgeführt werden. Aufgrund der daraus resultierenden hohen Geschwindigkeit kann diese Prüfung komplexeren Prüfungen voran gestellt werden, um zu testen, ob zwei Objekte nah genug aneinander sind, damit eine Kollision möglich ist. Dazu testet man die sie umgebenden Rechtecke (''Bounding Rectangles'') auf Kollision.<br />
<br />
Wenn mindestens eine Kante eines Rechtecks ein anderes Rechteck überschneidet, dann liegt eine Kollision vor. Es werden die Positionen der einzelnen Eckpunkte der Rechtecke benötigt. In den Implementierungsbeispielen werden Rechtecke durch die Position der linken oberen Ecke, die Breite und die Höhe beschrieben.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool rectangleCollision(const Vector& position1, float width1, float height1,<br />
const Vector& position2, float width2, float height2)<br />
{<br />
return position1.x < position2.x + width2 &&<br />
position2.x < position1.x + width1 &&<br />
position1.y < position2.y + height2 &&<br />
position2.y < position1.y + height1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool rectangleCollision(Vector position1, float width1, float height1,<br />
Vector position2, float width2, float height2)<br />
{<br />
return position1.x < position2.x + width2 &&<br />
position2.x < position1.x + width1 &&<br />
position1.y < position2.y + height2 &&<br />
position2.y < position1.y + height1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def rectangleCollision(position1, width1, height1, position2, width2, height2):<br />
return position1[0] < position2[0] + width2 and<br />
position2[0] < position1[0] + width1 and<br />
position1[1] < position2[1] + height2 and<br />
position2[1] < position1[1] + height1<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean rectangleCollision(float[] position1, float width1, float height1,<br />
float[] position2, float width2, float height2) {<br />
return position1[0] < position2[0] + width2 &&<br />
position2[0] < position1[0] + width1 &&<br />
position1[1] < position2[1] + height2 &&<br />
position2[1] < position1[1] + height1;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Kreisen ===<br />
Wenn die Distanz zwischen den Mittelpunkten zweier Kreise kleiner ist als die Summe ihrer Radien, so liegt eine Kollision vor.<br />
Also benötigen wir zum Prüfen der Kollision die Positionen und Radien der beiden Kreise.<br />
Dabei rechnen wir mit Hilfe des [http://de.wikipedia.org/wiki/Satz_des_Pythagoras Satz des Pythagoras] die Distanz zwischen den beiden Kreisen aus und prüfen zum Schluss, ob diese kleiner ist als die Summe beider Radien.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool circleCollision(const Vector& position1, float radius1,<br />
const Vector& position2, float radius2)<br />
{<br />
const float dx = position1.x - position2.x;<br />
const float dy = position1.y - position2.y;<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return sqrt(dx * dx + dy * dy) <= radius1 + radius2;<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
const float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool circleCollision(Vector position1, float radius1,<br />
Vector position2, float radius2)<br />
{<br />
float dx = position1.x - position2.x;<br />
float dy = position1.y - position2.y;<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return (Math.Sqrt(dx * dx + dy * dy) <= Convert.ToDouble(radius1) + Convert.ToDouble(radius2));<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def circleCollision(position1, radius1, position2, radius2):<br />
dx = position1[0] - position2[0]<br />
dy = position1[1] - position2[1]<br />
<br />
# Langsame Version, benötigt Wurzel:<br />
# return math.sqrt(dx * dx + dy * dy) <= radius1 + radius2<br />
<br />
# Schnelle Version, vergleicht die Quadrate:<br />
radiusSum = radius1 + radius2<br />
return dx * dx + dy * dy <= radiusSum * radiusSum<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean circleCollision(float[] position1, float radius1,<br />
float[] position2, float radius2) {<br />
float dx = position1[0] - position2[0];<br />
float dy = position1[1] - position2[1];<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return Math.sqrt(dx * dx + dy * dy) <= radius1 + radius2;<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Geraden ===<br />
Auch wenn eine Kollisionsabfrage zwischen zwei Geraden für ein Spiel eher unüblich ist, werden wir diesen Fall betrachten, denn die Vorgehensweise können wir auch für andere Kollisionsabfragen verwenden. Falls zwei Geraden nicht parallel zueinander sind, so schneiden sie sich irgendwo, und somit liegt eine Kollision vor. In diesem Beispiel werden die Geraden durch zwei Punkte beschrieben (eine Darstellung mit einem Punkt und einer Richtung ist natürlich ebenso möglich). Angenommen zwei Punkte einer Geraden sind bekannt, so ist es möglich, einen beliebigen Punkt auf ihr wie folgt zu beschreiben:<br />
<br />
: <math>P_a = A_1 + u_a(A_2 - A_1)</math><br />
<br />
Wenn man nun die zwei Geraden mithilfe dieser Formel beschreibt und sie gleichsetzt (<math>P_a = P_b</math>), bekommt man folgende Gleichungen für <math>x</math> und <math>y</math> der Punkte <math>P_a</math> und <math>P_b</math>:<br />
<br />
: <math>\begin{align} x_{A_1} + u_a(x_{A_2} - x_{A_1}) & = x_{B_1} + u_b(x_{B_2} - x_{B_1}) \\ y_{A_1} + u_a(y_{A_2} - y_{A_1}) & = y_{B_1} + u_b(y_{B_2} - y_{B_1}) \end{align} </math><br />
<br />
Diese Gleichungen werden nun nach <math>u_a</math> und <math>u_b</math> aufgelöst:<br />
<br />
: <math>\begin{align} u_a & = \frac{(x_{B_2} - x_{B_1})(y_{A_1} - y_{B_1}) - (y_{B_2} - y_{B_1})(x_{A_1} - x_{B_1})}{(y_{B_2} - y_{B_1})(x_{A_2} - x_{A_1})-(x_{B_2} - x_{B_1})(y_{A_2} - y_{A_1})} \\ u_b & = \frac{(x_{A_2} - x_{A_1})(y_{A_1} - y_{B_1}) - (y_{A_2} - y_{A_1})(x_{A_1} - x_{B_1})}{(y_{B_2} - y_{B_1})(x_{A_2} - x_{A_1})-(x_{B_2} - x_{B_1})(y_{A_2} - y_{A_1})} \end{align}</math><br />
<br />
Man beachte nun die Nenner der beiden Gleichungen, denn sie sind identisch. Wenn nun der Nenner gleich Null ist, so sind <math>u_a</math> und <math>u_b</math> undefiniert, also sind die beiden Geraden parallel zueinander. Wenn die Geraden dann nicht identisch sind, liegt keine Kollision vor. Der Einfachheit halber ignorieren wir den Fall der identischen Geraden und geben "''keine Kollision''" aus. Beim Rechnen mit Fließkommazahlen muss beachtet werden, dass ein Vergleich mit Null auf Grund von Rechenungenauigkeiten nicht empfehlenswert ist. Darum sollte ein kleiner Grenzwert ε (im Code als Konstante <code>EPSILON</code> dargestellt) gewählt werden, unterhalb dessen die Geraden als parallel angenommen werden. Ein möglicher Wert wäre z.B. <math>10^{-8}</math>.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool lineCollision(const Vector& a1, const Vector& a2,<br />
const Vector& b1, const Vector& b2)<br />
{<br />
const float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
return abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool lineCollision(Vector a1, Vector a2,<br />
Vector b1, Vector b2)<br />
{<br />
float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
return Math.Abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def lineCollision(a1, a2, b1, b2):<br />
denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1])<br />
return abs(denom) > EPSILON<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean lineCollision(float[] a1, float[] a2,<br />
float[] b1, float[] b2)<br />
{<br />
float denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1]);<br />
return Math.abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Strecken ===<br />
<br />
Die Kollisionserkennung zwischen zwei Strecken erfolgt ähnlich wie bei den Geraden, nur mit einem kleinen Zusatz, denn Strecken haben einen Start- und Endpunkt. Deswegen werden Strecken auch als Geradenabschnitt bezeichnet. Es wird also wieder überprüft, ob die beiden Strecken parallel zu einander sind. Wenn dies der Fall ist und die Strecken sich auch nicht überlappen, liegt keine Kollision vor. Ansonsten muss noch überprüft werden, ob sich die Strecken in den angegebenen Abschnitten schneiden. Nur wenn das zutrifft, liegt eine Kollision vor.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool lineSegmentCollision(const Vector& a1, const Vector& a2,<br />
const Vector& b1, const Vector& b2)<br />
{<br />
const float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
if (abs(denom) < EPSILON) return false;<br />
<br />
const float ua = ((b2.x - b1.x) * (a1.y - b1.y) -<br />
(b2.y - b1.y) * (a1.x - b1.x)) / denom;<br />
const float ub = ((a2.x - a1.x) * (a1.y - b1.y) -<br />
(a2.y - a1.y) * (a1.x - b1.x)) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool lineSegmentCollision(Vector a1, Vector a2,<br />
Vector b1, Vector b2)<br />
{<br />
float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
if (abs(denom) < EPSILON) return false;<br />
<br />
float ua = ((b2.x - b1.x) * (a1.y - b1.y) -<br />
(b2.y - b1.y) * (a1.x - b1.x)) / denom;<br />
float ub = ((a2.x - a1.x) * (a1.y - b1.y) -<br />
(a2.y - a1.y) * (a1.x - b1.x)) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def lineSegmentCollision(a1, a2, b1, b2):<br />
denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1])<br />
if (abs(denom) < EPSILON):<br />
return false<br />
<br />
ua = ((b2[0] - b1[0]) * (a1[1] - b1[1]) -<br />
(b2[1] - b1[1]) * (a1[0] - b1[0])) / denom<br />
ub = ((a2[0] - a1[0]) * (a1[1] - b1[1]) -<br />
(a2[1] - a1[1]) * (a1[0] - b1[0])) / denom<br />
return ua >= 0 and ua <= 1 and ub >= 0 and ub <= 1<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean lineSegmentCollision(float[] a1, float[] a2,<br />
float[] b1, float[] b2)<br />
{<br />
float denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1]);<br />
if (Math.abs(denom) < EPSILON) return false;<br />
<br />
float ua = ((b2[0] - b1[0]) * (a1[1] - b1[1]) -<br />
(b2[1] - b1[1]) * (a1[0] - b1[0])) / denom;<br />
float ub = ((a2[0] - a1[0]) * (a1[1] - b1[1]) -<br />
(a2[1] - a1[1]) * (a1[0] - b1[0])) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen einem Kreis und einer Geraden ===<br />
<br />
==== Genereller Ansatz ====<br />
<br />
Der im Folgenden beschriebene Ansatz arbeitet mit Vektoren und funktioniert für beliebige Dimensionen (2D: Gerade und Kreis, 3D: Gerade und Kugel). Der Kreis habe den Mittelpunkt mit dem Ortsvektor <math>\vec c</math> und den Radius <math>r</math>. Dann lautet die Gleichung für die Ortsvektoren <math>\vec x</math> der Punkte auf dem Kreis:<br />
<br />
: <math>(\vec x - \vec c)^2 = r^2</math><br />
<br />
Sei <math>\vec o</math> der Ortsvektor eines beliebigen Punkts auf der Geraden und <math>\vec d</math> der Richtungsvektor der Geraden. Dann ist die parametrische Form der Geraden gegeben durch:<br />
<br />
: <math>{\vec x}(t) = \vec o + t \cdot \vec d</math><br />
<br />
Nun setzen wir <math>\vec x(t)</math> in die Kreisgleichung ein. Wir bringen die Gleichung in die richtige Form für die [http://de.wikipedia.org/wiki/Quadratische_Gleichung#p-q-Formel p-q-Formel], so dass wir nach <math>t</math> auflösen können:<br />
<br />
: <math>\begin{align} \left( {\vec x}(t) - \vec c \right) ^2 &= r^2 \\ \left( (\vec o + t \cdot \vec d) - \vec c \right)^2 &= r^2 \\ (\vec o + t \cdot \vec d)^2 - 2 \cdot (\vec o + t \cdot \vec d) \cdot \vec c + {\vec c}^2 &= r^2 \\ {\vec o}^2 + 2t \cdot \vec o \cdot \vec d + t^2 \cdot {\vec d}^2 - 2 \cdot \vec o \cdot \vec c - 2t \cdot \vec d \cdot \vec c + {\vec c}^2 &= r^2 \\ t^2 {\vec d}^2 + t (2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c) + {\vec o}^2 - 2 \cdot \vec o \cdot \vec c + {\vec c}^2 - r^2 &= 0 \\ t^2 {\vec d}^2 + t (2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c) + (\vec o - \vec c)^2 - r^2 &= 0 \\ t^2 + t \left( \frac{2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c}{{\vec d}^2} \right) + \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2} &= 0 \end{align}</math><br />
<br />
Durch Anwendung der p-q-Formel erhalten wir zwei Lösungen für <math>t</math>:<br />
<br />
: <math>\begin{align} t_1 &= \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} - \sqrt{ \left( \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} \right) ^2 - \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2}} \\ t_2 &= \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} + \sqrt{ \left( \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} \right) ^2 - \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2}} \end{align}</math><br />
<br />
Wenn der Richtungsvektor <math>\vec d</math> der Geraden normiert ist (Länge 1 hat), dann kann die Division durch <math>{\vec d}^2</math> weggelassen werden, was eine etwas effizientere Implementierung ermöglicht.<br />
<br />
Betrachten wir den Ausdruck unter der Wurzel, der bei beiden Lösungen gleich ist. Es gibt drei Fälle, die eintreten können:<br />
<br />
# ''Der Ausdruck ist negativ:'' Die Wurzel einer negativen Zahl ist für reelle Zahlen nicht definiert. In unserem Fall bedeutet das, dass die Gerade den Kreis nicht schneidet.<br />
# ''Der Ausdruck ist 0:'' In diesem Fall ist <math>t_1 = t_2</math>, was bedeutet, dass die Gerade den Kreis ''berührt'' (es gibt nur einen gemeinsamen Punkt, dessen Ortsvektor <math>\vec o + t_1 \cdot \vec d</math> ist).<br />
# ''Der Ausdruck ist größer als 0:'' Die Gerade schneidet den Kreis in den beiden Punkten mit den Ortsvektoren <math>\vec o + t_1 \cdot \vec d</math> und <math>\vec o + t_2 \cdot \vec d</math>.<br />
<br />
{{Spoiler|<xh5>Implementierung</xh5>|<br />
{{Spoiler|<br />
<xh6>Implementierung in C++</xh6><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
// c: Mittelpunkt des Kreises<br />
// r: Radius des Kreises<br />
// o: Ein Punkt auf der Geraden<br />
// d: Richtungsvektor der Geraden<br />
// p_outT: Optionaler Zeiger. Falls p_outT != 0 und es gibt eine Kollision,<br />
// dann enthalten p_outT[0] und p_outT[1] die beiden Lösungen t1 und t2.<br />
// Die Schnittpunkte sind o + t1 * d bzw. o + t2 * d.<br />
bool circleLineCollision(const Vector& c, float r,<br />
const Vector& o, const Vector& d,<br />
float* p_outT = 0)<br />
{<br />
// Kehrwert der Länge von d vorberechnen, um die Berechnung zu beschleunigen (Divisionen sind langsam!).<br />
const float invDSq = 1.0f / d.lengthSq();<br />
<br />
// Term vorberechnen, der mehrfach benötigt wird.<br />
const float p = (Vector::dot(d, c) - Vector::dot(o, d)) * invDSq;<br />
<br />
// Nun kann der Ausdruck unter der Wurzel berechnet werden (Diskriminante).<br />
const float discriminant = p * p - ((o - c).lengthSq() - r * r) * invDSq;<br />
<br />
if (discriminant < 0.0f)<br />
{<br />
// Keine Kollision!<br />
return false;<br />
}<br />
else<br />
{<br />
// Kollision! Wir gehen davon aus, dass es zwei Schnittpunkte gibt.<br />
// Der Benutzer kann später selber entscheiden, ob er diese als einen einzigen behandeln möchte,<br />
// falls sie nah genug beieinander liegen.<br />
if (p_outT)<br />
{<br />
// Die beiden Lösungen für t ausrechnen und ausgeben.<br />
const float squareRoot = sqrt(discriminant);<br />
p_outT[0] = p - squareRoot;<br />
p_outT[1] = p + squareRoot;<br />
}<br />
<br />
return true;<br />
}<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
==== Geometrischer Ansatz speziell für 2D ====<br />
<br />
[[Datei:Kollision kreis senkr-gerade.gif|miniatur|Veranschaulichung des Idealfalls mit senkrechter Geraden.]]<br />
Im Folgenden wird ein geometrischer Ansatz beschrieben, der für den zweidimensionalen Fall sehr anschaulich ist. Er lässt sich jedoch nicht ohne Weiteres auf mehr Dimensionen übertragen.<br />
<br />
Der einfachste Fall für eine Prüfung auf eine Kollision liegt vor, wenn die Gerade senkrecht oder waagerecht ist und der Mittelpunkt des Kreises, nachfolgend <math>M</math> genannt, dem Nullpunkt des Koordinatensystems entspricht oder die Gerade den Nullpunkt des Koordinatensystems schneidet. Ist die Gerade senkrecht, dann gibt es eine Kollision, wenn <math>-r \le P_x \le r</math> zutrifft. Ist die Gerade waagerecht, gibt es eine Kollision, wenn <math>-r \le P_y \le r</math> zutrifft. <math>r</math> steht in dem Fall für den Radius des Kreises, <math>P_x</math> für die x-Koordinate eines beliebigen Punkts auf der Geraden und <math>P_y</math> für die y-Koordinate eines beliebigen Punkts, <math>P</math> auf der Geraden.<br />
<br />
Nachfolgend soll der erste Fall als Idealfall genommen werden. In den Fällen, in denen der Kreis vom Nullpunkt versetzt oder die Gerade weder senkrecht noch waagerecht ist, wird zuerst die Umrechnung vorgenommen, sodass die Überprüfung erfolgen kann.<br />
<br />
===== Verschobener Kreis =====<br />
<br />
Wenn die Gerade senkrecht oder waagerecht ist, <math>M</math> aber nicht dem Nullpunkt des Koordinatensystems entspricht, dann muss von dem Punkt <math>P</math> der Geraden, der für die Kollisionsprüfung verwendet werden soll, <math>M</math> abgezogen werden. Diese Berechnung kann unabhängig davon durchgeführt werden, ob die Gerade waagerecht oder senkrecht ist. Da bei einer Subtraktion von <math>M</math> von <math>M</math> das Ergebnis immer der Nullpunkt des Koordinatensystems ist, entfällt diese Berechnung. Auf den über diese Rechnung erhaltenen Punkt kann wieder die jeweilige oben angeführte Überprüfung durchgeführt werden.<br />
<br />
===== Beliebige Gerade =====<br />
<br />
Ist die Gerade nicht senkrecht oder waagerecht, so muss diese erst gedreht werden, damit sie senkrecht oder waagerecht ist. Um einen Punkt um den Mittelpunkt des Koordinatensystems zu drehen, kann man die Berechnungen <math>P'_x = P_x \cdot cos(\alpha) - P_y \cdot sin(\alpha)</math> und <math>P'_y = P_x \cdot sin(\alpha) + P_y \cdot cos(\alpha)</math> verwenden. <math>P'</math> stellt dabei den Punkt nach der Drehung dar. Für diese Drehung muss also nicht der entsprechende Winkel selbst, sondern dessen Ergebnis der Sinus- und Kosinus-Funktion ermittelt werden. Wenn man einen weiteren Punkt der Geraden, nachfolgend <math>Q</math> genannt, nimmt, kann man diese über das dadurch darstellbare rechtwinklige (Steigungs-)Dreieck ermitteln. Die Rechnungen dafür lauten <math>sin(\alpha) = \tfrac{\text{Gegenkathete}}{\text{Hypotenuse}}</math> und <math>cos(\alpha) =\tfrac{\text{Ankathete}}{\text{Hypotenuse}}</math>. Da die Drehung gegen den Uhrzeigersinn geht, muss für eine steigende Gerade ein anderer Wert gewählt werden, als für eine fallende Gerade. Für eine steigende Gerade ist die Seite des Dreiecks, die sich durch die x-Koordinaten errechnet, die Gegenkathete und für eine fallende Gerade ist die Seite des Dreiecks, die sich durch die y-Koordinaten errechnet die Gegenkathete.<br />
<br />
Fasst man alle Berechnungen zusammen, erhält man die folgende Vorgehensweise. Es wird angenommen, dass zwei Punkte der Gerade <math>P</math> und <math>Q</math> gegeben sind.<br />
* Die Differenz der Punkte <math>P</math> und <math>Q</math>, <math>R</math> wird mit <math>R = \left| P - Q \right|</math> ermittelt.<br />
* Die Hypotenuse <math>H</math> wird ermittelt durch <math>H = \sqrt{{R_x}^2 + {R_y}^2}</math>.<br />
* Wenn <math>P_x < Q_x \land P_y < Q_y \lor P_x > Q_x \land P_z > Q_z</math> zutrifft:<br />
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \tfrac{R_y}{H}</math>.<br />
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \tfrac{R_x}{H}</math>.<br />
** Die x-Koordinate des gedrehten Punkts <math>x'</math> wird ermittelt mit <math>x' = P_xc - P_ys</math>.<br />
** Wenn <math>-r \le x \le r</math> zutrifft, liegt eine Kollision vor.<br />
* Sonst:<br />
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \tfrac{R_x}{H}</math>.<br />
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \tfrac{R_y}{H}</math>.<br />
** Die y-Koordinate des gedrehten Punkts <math>y'</math> wird ermittelt mit <math>y' = P_xs + P_yc</math>.<br />
** Wenn <math>-r \le y \le r</math> zutrifft, liegt eine Kollision vor.<br />
<br />
===Kollision Kreis-Strecke===<br />
Insbesondere für Kreis-Rechteckkollision ist es wichtig, den Punkt auf einer Strecke zu finden, der dem Mittelpunk der Kugel am nähesten liegt.<br />
<br />
====Allgemeiner Ansatz====<br />
Wir betrachten eine Strecke durch 2 Punkte <math>\boldsymbol{x}</math> und <math>\boldsymbol{y}</math> und einen Kreis mit radius <math>r</math> und Mittelpunkt <math>\boldsymbol{m}</math> ('''x''','''y''','''m''' Vektoren im <math>\mathbb{R}^n</math>). Der einfachheit halber definieren wir: <math>\boldsymbol{a} = \boldsymbol{y-x}</math> (Richtungsvektor der Geraden durch die Strecke, nicht normalisiert, sondern ist genau so lang wie die Strecke) und <math>\boldsymbol{b = m-x}</math> (Verbindungsvektor vom Startpunkt und dem Mittelpunkt)<br />
<br />
Daraus lässt sich der Punkt berechnen, an dem der Mittelpunkt der Geraden <math>g: \boldsymbol{v} = \boldsymbol{x}+\boldsymbol{a}\cdot t</math> am nähesten ist. Nun gilt:<br />
<math>t = \frac{\langle a,b\rangle}{\langle a,a\rangle}</math> (<math>\langle a,b\rangle</math> ist das Skalar/Punktprodukt von a unb b)<br />
Allerdings ist die Strecke nur der Teil der Geraden, für den <math>t\in [0,1]</math> ist. Also setzt man <br />
<math>t*=\begin{cases}0&t<0\\t& t\in [0,1]\\1& t > 1\end{cases}</math><br />
Der Punkt auf der Strecke, der dem Kreis am nähesten ist, ist dann <math>\boldsymbol{d} = \boldsymbol{x}+\boldsymbol{a}\cdot t*</math>. Wenn nun <math>||\boldsymbol{m}-\boldsymbol{x}||^2<r^2</math>, dann Kollidiert der Kreis im Punkt '''d''' mit der Strecke.<br />
<br />
=====Komplexität=====<br />
Diese Berechnungen benötigen 0 Quadratwurzeln, 3*n Multiplikationen und n Divisionen und lassen sich damit sehr schnell durchführen.<br />
<br />
===Kollision Rechteck-Kreis (2D)===<br />
Ein Rechteck fasst man als 4 Strecken auf. Man berechnet den Minimalen Abstand (und die Position des Basispunkts) des Kreises von allen 4 Seiten, nimmt von den 4 Abständen (bzw. deren Quadrate, um Wurzeln zu vermeiden) das Minimum. Wenn dieses kleiner als r² ist, dann kollidiert der Kreis mit dem Rechteck im dazugehörigen Basispunkt.<br />
<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
Vector2 PointLineDist(Vector2 point, Vector2 linestart, Vector2 lineend)<br />
{<br />
Vector2 a = lineend - linestart;<br />
Vector2 b = point - linestart;<br />
double t = dot(a, b)/(length(a)²);<br />
if (t < 0) t = 0;<br />
if (t > 1) t = 1;<br />
return linestart + a * t;<br />
}<br />
<br />
struct CollisionResult<br />
{<br />
bool isCollided;<br />
Vector2 collisionPoint;<br />
float distanceSq;<br />
}<br />
<br />
// Gibt zurück, ob eine Kollision stattfand und wenn ja, wo, und wie lang der (minimale, quadratische) Abstand zum Rechteck ist.<br />
CollisionResult RectangleCircleKollision(Rect rect, Circle circle)<br />
{<br />
float minDistSq = HUGE_VAL;<br />
Vector2 basePoint = Vector2(0,0);<br />
// Seiten durchgehen, Schleife kann (bzw muss, je nachdem wie Rect aussieht) entrollt werden<br />
for(int i=0; i<4 ;i++)<br />
{<br />
Vector2 base = PointLineDist(circle.mid, rect.points[i], rect.points[(i+1) % 4]);<br />
if(lengthsq(circle.mid-base)<minDistSq)<br />
{<br />
// Kürzerer Abstand, neu zuweisen.<br />
minDistSq = lengthsq(circle.mid - base);<br />
basePoint = base;<br />
}<br />
}<br />
return {minDistSq < circle.radius * circle.radius,<br />
basePoint,<br />
minDistSq};<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
====Beliebige Polygone im 2-dimensionalen====<br />
Derselbe code kann auch für Beliebige konvexe Polygone verwendet werden, wenn man Rect durch eine Polygonklasse ersetzt (und den Modulo-Operator anpasst)</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/2D-Kollisionserkennung2D-Kollisionserkennung2017-09-28T21:23:35Z<p>David Scherfgen: Anpassung für MathJax</p>
<hr />
<div>{{Baustelle}}<br />
[[Kategorie:Geometrie]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:C-Sharp]]<br />
[[Kategorie:Java]]<br />
[[Kategorie:Python]]<br />
In diesem Artikel geht es um 2D-Kollisionserkennung, also die Überprüfung, ob sich zwei Objekte berühren oder schneiden. Für Anwendungen, bei denen dies eine zentrale Rolle spielt, empfiehlt sich auch ggf. der Einsatz einer [[Link-Sammlung#Physik|Physik-Engine]]. Eine Physik-Engine kann Kollisionen nicht nur sehr effizient erkennen, sondern auch physikalisch korrekt darauf reagieren.<br />
<br />
== Erkennung anhand geometrischer Formen ==<br />
<br />
Häufig werden Spielobjekte durch einfache geometrische Formen (Kreise, Rechtecke, Polygone) angenähert, da eine Kollisionserkennung für solche Formen einfacher bzw. schneller durchgeführt werden kann. Dabei nimmt man in Kauf, dass die physikalische Form des Objekts von seiner sichtbaren Form abweicht. Im Folgenden werden Kollisionstests für zweidimensionale Formen behandelt.<br />
<br />
=== Kollision zwischen zwei achsenausgerichteten Rechtecken ===<br />
<br />
Die Prüfung einer Kollision zweier achsenausgerichteten (nicht rotierten) Rechtecken kann sehr effizient durchgeführt werden. Aufgrund der daraus resultierenden hohen Geschwindigkeit kann diese Prüfung komplexeren Prüfungen voran gestellt werden, um zu testen, ob zwei Objekte nah genug aneinander sind, damit eine Kollision möglich ist. Dazu testet man die sie umgebenden Rechtecke (''Bounding Rectangles'') auf Kollision.<br />
<br />
Wenn mindestens eine Kante eines Rechtecks ein anderes Rechteck überschneidet, dann liegt eine Kollision vor. Es werden die Positionen der einzelnen Eckpunkte der Rechtecke benötigt. In den Implementierungsbeispielen werden Rechtecke durch die Position der linken oberen Ecke, die Breite und die Höhe beschrieben.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool rectangleCollision(const Vector& position1, float width1, float height1,<br />
const Vector& position2, float width2, float height2)<br />
{<br />
return position1.x < position2.x + width2 &&<br />
position2.x < position1.x + width1 &&<br />
position1.y < position2.y + height2 &&<br />
position2.y < position1.y + height1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool rectangleCollision(Vector position1, float width1, float height1,<br />
Vector position2, float width2, float height2)<br />
{<br />
return position1.x < position2.x + width2 &&<br />
position2.x < position1.x + width1 &&<br />
position1.y < position2.y + height2 &&<br />
position2.y < position1.y + height1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def rectangleCollision(position1, width1, height1, position2, width2, height2):<br />
return position1[0] < position2[0] + width2 and<br />
position2[0] < position1[0] + width1 and<br />
position1[1] < position2[1] + height2 and<br />
position2[1] < position1[1] + height1<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean rectangleCollision(float[] position1, float width1, float height1,<br />
float[] position2, float width2, float height2) {<br />
return position1[0] < position2[0] + width2 &&<br />
position2[0] < position1[0] + width1 &&<br />
position1[1] < position2[1] + height2 &&<br />
position2[1] < position1[1] + height1;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Kreisen ===<br />
Wenn die Distanz zwischen den Mittelpunkten zweier Kreise kleiner ist als die Summe ihrer Radien, so liegt eine Kollision vor.<br />
Also benötigen wir zum Prüfen der Kollision die Positionen und Radien der beiden Kreise.<br />
Dabei rechnen wir mit Hilfe des [http://de.wikipedia.org/wiki/Satz_des_Pythagoras Satz des Pythagoras] die Distanz zwischen den beiden Kreisen aus und prüfen zum Schluss, ob diese kleiner ist als die Summe beider Radien.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool circleCollision(const Vector& position1, float radius1,<br />
const Vector& position2, float radius2)<br />
{<br />
const float dx = position1.x - position2.x;<br />
const float dy = position1.y - position2.y;<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return sqrt(dx * dx + dy * dy) <= radius1 + radius2;<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
const float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool circleCollision(Vector position1, float radius1,<br />
Vector position2, float radius2)<br />
{<br />
float dx = position1.x - position2.x;<br />
float dy = position1.y - position2.y;<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return (Math.Sqrt(dx * dx + dy * dy) <= Convert.ToDouble(radius1) + Convert.ToDouble(radius2));<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def circleCollision(position1, radius1, position2, radius2):<br />
dx = position1[0] - position2[0]<br />
dy = position1[1] - position2[1]<br />
<br />
# Langsame Version, benötigt Wurzel:<br />
# return math.sqrt(dx * dx + dy * dy) <= radius1 + radius2<br />
<br />
# Schnelle Version, vergleicht die Quadrate:<br />
radiusSum = radius1 + radius2<br />
return dx * dx + dy * dy <= radiusSum * radiusSum<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean circleCollision(float[] position1, float radius1,<br />
float[] position2, float radius2) {<br />
float dx = position1[0] - position2[0];<br />
float dy = position1[1] - position2[1];<br />
<br />
// Langsame Version, benötigt Wurzel:<br />
// return Math.sqrt(dx * dx + dy * dy) <= radius1 + radius2;<br />
<br />
// Schnelle Version, vergleicht die Quadrate:<br />
float radiusSum = radius1 + radius2;<br />
return dx * dx + dy * dy <= radiusSum * radiusSum;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Geraden ===<br />
Auch wenn eine Kollisionsabfrage zwischen zwei Geraden für ein Spiel eher unüblich ist, werden wir diesen Fall betrachten, denn die Vorgehensweise können wir auch für andere Kollisionsabfragen verwenden. Falls zwei Geraden nicht parallel zueinander sind, so schneiden sie sich irgendwo, und somit liegt eine Kollision vor. In diesem Beispiel werden die Geraden durch zwei Punkte beschrieben (eine Darstellung mit einem Punkt und einer Richtung ist natürlich ebenso möglich). Angenommen zwei Punkte einer Geraden sind bekannt, so ist es möglich, einen beliebigen Punkt auf ihr wie folgt zu beschreiben:<br />
<br />
: <math>P_a = A_1 + u_a(A_2 - A_1)</math><br />
<br />
Wenn man nun die zwei Geraden mithilfe dieser Formel beschreibt und sie gleichsetzt (<math>P_a = P_b</math>), bekommt man folgende Gleichungen für <math>x</math> und <math>y</math> der Punkte <math>P_a</math> und <math>P_b</math>:<br />
<br />
: <math>\begin{align} x_{A_1} + u_a(x_{A_2} - x_{A_1}) & = x_{B_1} + u_b(x_{B_2} - x_{B_1}) \\ y_{A_1} + u_a(y_{A_2} - y_{A_1}) & = y_{B_1} + u_b(y_{B_2} - y_{B_1}) \end{align} </math><br />
<br />
Diese Gleichungen werden nun nach <math>u_a</math> und <math>u_b</math> aufgelöst:<br />
<br />
: <math>\begin{align} u_a & = \frac{(x_{B_2} - x_{B_1})(y_{A_1} - y_{B_1}) - (y_{B_2} - y_{B_1})(x_{A_1} - x_{B_1})}{(y_{B_2} - y_{B_1})(x_{A_2} - x_{A_1})-(x_{B_2} - x_{B_1})(y_{A_2} - y_{A_1})} \\ u_b & = \frac{(x_{A_2} - x_{A_1})(y_{A_1} - y_{B_1}) - (y_{A_2} - y_{A_1})(x_{A_1} - x_{B_1})}{(y_{B_2} - y_{B_1})(x_{A_2} - x_{A_1})-(x_{B_2} - x_{B_1})(y_{A_2} - y_{A_1})} \end{align}</math><br />
<br />
Man beachte nun die Nenner der beiden Gleichungen, denn sie sind identisch. Wenn nun der Nenner gleich Null ist, so sind <math>u_a</math> und <math>u_b</math> undefiniert, also sind die beiden Geraden parallel zueinander. Wenn die Geraden dann nicht identisch sind, liegt keine Kollision vor. Der Einfachheit halber ignorieren wir den Fall der identischen Geraden und geben "''keine Kollision''" aus. Beim Rechnen mit Fließkommazahlen muss beachtet werden, dass ein Vergleich mit Null auf Grund von Rechenungenauigkeiten nicht empfehlenswert ist. Darum sollte ein kleiner Grenzwert ε (im Code als Konstante <code>EPSILON</code> dargestellt) gewählt werden, unterhalb dessen die Geraden als parallel angenommen werden. Ein möglicher Wert wäre z.B. <math>10^{-8}</math>.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool lineCollision(const Vector& a1, const Vector& a2,<br />
const Vector& b1, const Vector& b2)<br />
{<br />
const float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
return abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool lineCollision(Vector a1, Vector a2,<br />
Vector b1, Vector b2)<br />
{<br />
float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
return Math.Abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def lineCollision(a1, a2, b1, b2):<br />
denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1])<br />
return abs(denom) > EPSILON<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean lineCollision(float[] a1, float[] a2,<br />
float[] b1, float[] b2)<br />
{<br />
float denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1]);<br />
return Math.abs(denom) > EPSILON;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen zwei Strecken ===<br />
<br />
Die Kollisionserkennung zwischen zwei Strecken erfolgt ähnlich wie bei den Geraden, nur mit einem kleinen Zusatz, denn Strecken haben einen Start- und Endpunkt. Deswegen werden Strecken auch als Geradenabschnitt bezeichnet. Es wird also wieder überprüft, ob die beiden Strecken parallel zu einander sind. Wenn dies der Fall ist und die Strecken sich auch nicht überlappen, liegt keine Kollision vor. Ansonsten muss noch überprüft werden, ob sich die Strecken in den angegebenen Abschnitten schneiden. Nur wenn das zutrifft, liegt eine Kollision vor.<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
bool lineSegmentCollision(const Vector& a1, const Vector& a2,<br />
const Vector& b1, const Vector& b2)<br />
{<br />
const float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
if (abs(denom) < EPSILON) return false;<br />
<br />
const float ua = ((b2.x - b1.x) * (a1.y - b1.y) -<br />
(b2.y - b1.y) * (a1.x - b1.x)) / denom;<br />
const float ub = ((a2.x - a1.x) * (a1.y - b1.y) -<br />
(a2.y - a1.y) * (a1.x - b1.x)) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in C#</xh5><br />
|<br />
<sourcecode lang="csharp" tab="4"><br />
bool lineSegmentCollision(Vector a1, Vector a2,<br />
Vector b1, Vector b2)<br />
{<br />
float denom = (b2.y - b1.y) * (a2.x - a1.x) -<br />
(b2.x - b1.x) * (a2.y - a1.y);<br />
if (abs(denom) < EPSILON) return false;<br />
<br />
float ua = ((b2.x - b1.x) * (a1.y - b1.y) -<br />
(b2.y - b1.y) * (a1.x - b1.x)) / denom;<br />
float ub = ((a2.x - a1.x) * (a1.y - b1.y) -<br />
(a2.y - a1.y) * (a1.x - b1.x)) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Python</xh5><br />
|<br />
<sourcecode lang="python" tab="4"><br />
def lineSegmentCollision(a1, a2, b1, b2):<br />
denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1])<br />
if (abs(denom) < EPSILON):<br />
return false<br />
<br />
ua = ((b2[0] - b1[0]) * (a1[1] - b1[1]) -<br />
(b2[1] - b1[1]) * (a1[0] - b1[0])) / denom<br />
ub = ((a2[0] - a1[0]) * (a1[1] - b1[1]) -<br />
(a2[1] - a1[1]) * (a1[0] - b1[0])) / denom<br />
return ua >= 0 and ua <= 1 and ub >= 0 and ub <= 1<br />
</sourcecode><br />
}}<br />
<br />
{{Spoiler|<br />
<xh5>Implementierung in Java</xh5><br />
|<br />
<sourcecode lang="java" tab="4"><br />
boolean lineSegmentCollision(float[] a1, float[] a2,<br />
float[] b1, float[] b2)<br />
{<br />
float denom = (b2[1] - b1[1]) * (a2[0] - a1[0]) -<br />
(b2[0] - b1[0]) * (a2[1] - a1[1]);<br />
if (Math.abs(denom) < EPSILON) return false;<br />
<br />
float ua = ((b2[0] - b1[0]) * (a1[1] - b1[1]) -<br />
(b2[1] - b1[1]) * (a1[0] - b1[0])) / denom;<br />
float ub = ((a2[0] - a1[0]) * (a1[1] - b1[1]) -<br />
(a2[1] - a1[1]) * (a1[0] - b1[0])) / denom;<br />
return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
=== Kollision zwischen einem Kreis und einer Geraden ===<br />
<br />
==== Genereller Ansatz ====<br />
<br />
Der im Folgenden beschriebene Ansatz arbeitet mit Vektoren und funktioniert für beliebige Dimensionen (2D: Gerade und Kreis, 3D: Gerade und Kugel). Der Kreis habe den Mittelpunkt mit dem Ortsvektor <math>\vec c</math> und den Radius <math>r</math>. Dann lautet die Gleichung für die Ortsvektoren <math>\vec x</math> der Punkte auf dem Kreis:<br />
<br />
: <math>(\vec x - \vec c)^2 = r^2</math><br />
<br />
Sei <math>\vec o</math> der Ortsvektor eines beliebigen Punkts auf der Geraden und <math>\vec d</math> der Richtungsvektor der Geraden. Dann ist die parametrische Form der Geraden gegeben durch:<br />
<br />
: <math>{\vec x}(t) = \vec o + t \cdot \vec d</math><br />
<br />
Nun setzen wir <math>\vec x(t)</math> in die Kreisgleichung ein. Wir bringen die Gleichung in die richtige Form für die [http://de.wikipedia.org/wiki/Quadratische_Gleichung#p-q-Formel p-q-Formel], so dass wir nach <math>t</math> auflösen können:<br />
<br />
: <math>\begin{align}<br />
\left( {\vec x}(t) - \vec c \right) ^2 &= r^2 \\<br />
\left( (\vec o + t \cdot \vec d) - \vec c \right)^2 &= r^2 \\<br />
(\vec o + t \cdot \vec d)^2 - 2 \cdot (\vec o + t \cdot \vec d) \cdot \vec c + {\vec c}^2 &= r^2 \\<br />
{\vec o}^2 + 2t \cdot \vec o \cdot \vec d + t^2 \cdot {\vec d}^2 - 2 \cdot \vec o \cdot \vec c - 2t \cdot \vec d \cdot \vec c + {\vec c}^2 &= r^2 \\<br />
t^2 {\vec d}^2 + t (2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c) + {\vec o}^2 - 2 \cdot \vec o \cdot \vec c + {\vec c}^2 - r^2 &= 0 \\<br />
t^2 {\vec d}^2 + t (2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c) + (\vec o - \vec c)^2 - r^2 &= 0 \\<br />
t^2 + t \left( \frac{2 \cdot \vec o \cdot \vec d - 2 \cdot \vec d \cdot \vec c}{{\vec d}^2} \right) + \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2} &= 0<br />
\end{align}</math><br />
<br />
Durch Anwendung der p-q-Formel erhalten wir zwei Lösungen für <math>t</math>:<br />
<br />
: <math>\begin{align}<br />
t_1 &= \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} - \sqrt{ \left( \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} \right) ^2 - \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2}} \\<br />
t_2 &= \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} + \sqrt{ \left( \frac{\vec d \cdot \vec c - \vec o \cdot \vec d}{{\vec d}^2} \right) ^2 - \frac{(\vec o - \vec c)^2 - r^2}{{\vec d}^2}}<br />
\end{align}</math><br />
<br />
Wenn der Richtungsvektor <math>\vec d</math> der Geraden normiert ist (Länge 1 hat), dann kann die Division durch <math>{\vec d}^2</math> weggelassen werden, was eine etwas effizientere Implementierung ermöglicht.<br />
<br />
Betrachten wir den Ausdruck unter der Wurzel, der bei beiden Lösungen gleich ist. Es gibt drei Fälle, die eintreten können:<br />
<br />
# ''Der Ausdruck ist negativ:'' Die Wurzel einer negativen Zahl ist für reelle Zahlen nicht definiert. In unserem Fall bedeutet das, dass die Gerade den Kreis nicht schneidet.<br />
# ''Der Ausdruck ist 0:'' In diesem Fall ist <math>t_1 = t_2</math>, was bedeutet, dass die Gerade den Kreis ''berührt'' (es gibt nur einen gemeinsamen Punkt, dessen Ortsvektor <math>\vec o + t_1 \cdot \vec d</math> ist).<br />
# ''Der Ausdruck ist größer als 0:'' Die Gerade schneidet den Kreis in den beiden Punkten mit den Ortsvektoren <math>\vec o + t_1 \cdot \vec d</math> und <math>\vec o + t_2 \cdot \vec d</math>.<br />
<br />
{{Spoiler|<xh5>Implementierung</xh5>|<br />
{{Spoiler|<br />
<xh6>Implementierung in C++</xh6><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
// c: Mittelpunkt des Kreises<br />
// r: Radius des Kreises<br />
// o: Ein Punkt auf der Geraden<br />
// d: Richtungsvektor der Geraden<br />
// p_outT: Optionaler Zeiger. Falls p_outT != 0 und es gibt eine Kollision,<br />
// dann enthalten p_outT[0] und p_outT[1] die beiden Lösungen t1 und t2.<br />
// Die Schnittpunkte sind o + t1 * d bzw. o + t2 * d.<br />
bool circleLineCollision(const Vector& c, float r,<br />
const Vector& o, const Vector& d,<br />
float* p_outT = 0)<br />
{<br />
// Kehrwert der Länge von d vorberechnen, um die Berechnung zu beschleunigen (Divisionen sind langsam!).<br />
const float invDSq = 1.0f / d.lengthSq();<br />
<br />
// Term vorberechnen, der mehrfach benötigt wird.<br />
const float p = (Vector::dot(d, c) - Vector::dot(o, d)) * invDSq;<br />
<br />
// Nun kann der Ausdruck unter der Wurzel berechnet werden (Diskriminante).<br />
const float discriminant = p * p - ((o - c).lengthSq() - r * r) * invDSq;<br />
<br />
if (discriminant < 0.0f)<br />
{<br />
// Keine Kollision!<br />
return false;<br />
}<br />
else<br />
{<br />
// Kollision! Wir gehen davon aus, dass es zwei Schnittpunkte gibt.<br />
// Der Benutzer kann später selber entscheiden, ob er diese als einen einzigen behandeln möchte,<br />
// falls sie nah genug beieinander liegen.<br />
if (p_outT)<br />
{<br />
// Die beiden Lösungen für t ausrechnen und ausgeben.<br />
const float squareRoot = sqrt(discriminant);<br />
p_outT[0] = p - squareRoot;<br />
p_outT[1] = p + squareRoot;<br />
}<br />
<br />
return true;<br />
}<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
==== Geometrischer Ansatz speziell für 2D ====<br />
<br />
[[Datei:Kollision kreis senkr-gerade.gif|miniatur|Veranschaulichung des Idealfalls mit senkrechter Geraden.]]<br />
Im Folgenden wird ein geometrischer Ansatz beschrieben, der für den zweidimensionalen Fall sehr anschaulich ist. Er lässt sich jedoch nicht ohne Weiteres auf mehr Dimensionen übertragen.<br />
<br />
Der einfachste Fall für eine Prüfung auf eine Kollision liegt vor, wenn die Gerade senkrecht oder waagerecht ist und der Mittelpunkt des Kreises, nachfolgend <math>M</math> genannt, dem Nullpunkt des Koordinatensystems entspricht oder die Gerade den Nullpunkt des Koordinatensystems schneidet. Ist die Gerade senkrecht, dann gibt es eine Kollision, wenn <math>-r \le P_x \le r</math> zutrifft. Ist die Gerade waagerecht, gibt es eine Kollision, wenn <math>-r \le P_y \le r</math> zutrifft. <math>r</math> steht in dem Fall für den Radius des Kreises, <math>P_x</math> für die x-Koordinate eines beliebigen Punkts auf der Geraden und <math>P_y</math> für die y-Koordinate eines beliebigen Punkts, <math>P</math> auf der Geraden.<br />
<br />
Nachfolgend soll der erste Fall als Idealfall genommen werden. In den Fällen, in denen der Kreis vom Nullpunkt versetzt oder die Gerade weder senkrecht noch waagerecht ist, wird zuerst die Umrechnung vorgenommen, sodass die Überprüfung erfolgen kann.<br />
<br />
===== Verschobener Kreis =====<br />
<br />
Wenn die Gerade senkrecht oder waagerecht ist, <math>M</math> aber nicht dem Nullpunkt des Koordinatensystems entspricht, dann muss von dem Punkt <math>P</math> der Geraden, der für die Kollisionsprüfung verwendet werden soll, <math>M</math> abgezogen werden. Diese Berechnung kann unabhängig davon durchgeführt werden, ob die Gerade waagerecht oder senkrecht ist. Da bei einer Subtraktion von <math>M</math> von <math>M</math> das Ergebnis immer der Nullpunkt des Koordinatensystems ist, entfällt diese Berechnung. Auf den über diese Rechnung erhaltenen Punkt kann wieder die jeweilige oben angeführte Überprüfung durchgeführt werden.<br />
<br />
===== Beliebige Gerade =====<br />
<br />
Ist die Gerade nicht senkrecht oder waagerecht, so muss diese erst gedreht werden, damit sie senkrecht oder waagerecht ist. Um einen Punkt um den Mittelpunkt des Koordinatensystems zu drehen, kann man die Berechnungen <math>P'_x = P_x \cdot cos(\alpha) - P_y \cdot sin(\alpha)</math> und <math>P'_y = P_x \cdot sin(\alpha) + P_y \cdot cos(\alpha)</math> verwenden. <math>P'</math> stellt dabei den Punkt nach der Drehung dar. Für diese Drehung muss also nicht der entsprechende Winkel selbst, sondern dessen Ergebnis der Sinus- und Kosinus-Funktion ermittelt werden. Wenn man einen weiteren Punkt der Geraden, nachfolgend <math>Q</math> genannt, nimmt, kann man diese über das dadurch darstellbare rechtwinklige (Steigungs-)Dreieck ermitteln. Die Rechnungen dafür lauten <math>sin(\alpha) = \tfrac{\text{Gegenkathete}}{\text{Hypotenuse}}</math> und <math>cos(\alpha) =\tfrac{\text{Ankathete}}{\text{Hypotenuse}}</math>. Da die Drehung gegen den Uhrzeigersinn geht, muss für eine steigende Gerade ein anderer Wert gewählt werden, als für eine fallende Gerade. Für eine steigende Gerade ist die Seite des Dreiecks, die sich durch die x-Koordinaten errechnet, die Gegenkathete und für eine fallende Gerade ist die Seite des Dreiecks, die sich durch die y-Koordinaten errechnet die Gegenkathete.<br />
<br />
Fasst man alle Berechnungen zusammen, erhält man die folgende Vorgehensweise. Es wird angenommen, dass zwei Punkte der Gerade <math>P</math> und <math>Q</math> gegeben sind.<br />
* Die Differenz der Punkte <math>P</math> und <math>Q</math>, <math>R</math> wird mit <math>R = \left| P - Q \right|</math> ermittelt.<br />
* Die Hypotenuse <math>H</math> wird ermittelt durch <math>H = \sqrt{{R_x}^2 + {R_y}^2}</math>.<br />
* Wenn <math>P_x < Q_x \land P_y < Q_y \lor P_x > Q_x \land P_z > Q_z</math> zutrifft:<br />
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \tfrac{R_y}{H}</math>.<br />
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \tfrac{R_x}{H}</math>.<br />
** Die x-Koordinate des gedrehten Punkts <math>x'</math> wird ermittelt mit <math>x' = P_xc - P_ys</math>.<br />
** Wenn <math>-r \le x \le r</math> zutrifft, liegt eine Kollision vor.<br />
* Sonst:<br />
** Das Ergebnis des Kosinus, <math>c</math>, wird ermittelt mit <math>c = \tfrac{R_x}{H}</math>.<br />
** Das Ergebnis des Sinus, <math>s</math>, wird ermittelt mit <math>s = \tfrac{R_y}{H}</math>.<br />
** Die y-Koordinate des gedrehten Punkts <math>y'</math> wird ermittelt mit <math>y' = P_xs + P_yc</math>.<br />
** Wenn <math>-r \le y \le r</math> zutrifft, liegt eine Kollision vor.<br />
<br />
===Kollision Kreis-Strecke===<br />
Insbesondere für Kreis-Rechteckkollision ist es wichtig, den Punkt auf einer Strecke zu finden, der dem Mittelpunk der Kugel am nähesten liegt.<br />
<br />
====Allgemeiner Ansatz====<br />
Wir betrachten eine Strecke durch 2 Punkte <math>\boldsymbol{x}</math> und <math>\boldsymbol{y}</math> und einen Kreis mit radius <math>r</math> und Mittelpunkt <math>\boldsymbol{m}</math> ('''x''','''y''','''m''' Vektoren im <math>\mathbb{R}^n</math>). Der einfachheit halber definieren wir: <math>\boldsymbol{a} = \boldsymbol{y-x}</math> (Richtungsvektor der Geraden durch die Strecke, nicht normalisiert, sondern ist genau so lang wie die Strecke) und <math>\boldsymbol{b = m-x}</math> (Verbindungsvektor vom Startpunkt und dem Mittelpunkt)<br />
<br />
Daraus lässt sich der Punkt berechnen, an dem der Mittelpunkt der Geraden <math>g: \boldsymbol{v} = \boldsymbol{x}+\boldsymbol{a}\cdot t</math> am nähesten ist. Nun gilt:<br />
<math>t = \frac{\langle a,b\rangle}{\langle a,a\rangle}</math> (<math>\langle a,b\rangle</math> ist das Skalar/Punktprodukt von a unb b)<br />
Allerdings ist die Strecke nur der Teil der Geraden, für den <math>t\in [0,1]</math> ist. Also setzt man <br />
<math>t*=\begin{cases}0&t<0\\t& t\in [0,1]\\1& t > 1\end{cases}</math><br />
Der Punkt auf der Strecke, der dem Kreis am nähesten ist, ist dann <math>\boldsymbol{d} = \boldsymbol{x}+\boldsymbol{a}\cdot t*</math>. Wenn nun <math>||\boldsymbol{m}-\boldsymbol{x}||^2<r^2</math>, dann Kollidiert der Kreis im Punkt '''d''' mit der Strecke.<br />
<br />
=====Komplexität=====<br />
Diese Berechnungen benötigen 0 Quadratwurzeln, 3*n Multiplikationen und n Divisionen und lassen sich damit sehr schnell durchführen.<br />
<br />
===Kollision Rechteck-Kreis (2D)===<br />
Ein Rechteck fasst man als 4 Strecken auf. Man berechnet den Minimalen Abstand (und die Position des Basispunkts) des Kreises von allen 4 Seiten, nimmt von den 4 Abständen (bzw. deren Quadrate, um Wurzeln zu vermeiden) das Minimum. Wenn dieses kleiner als r² ist, dann kollidiert der Kreis mit dem Rechteck im dazugehörigen Basispunkt.<br />
<br />
<br />
{{Spoiler|<xh4>Implementierung</xh4>|<br />
{{Spoiler|<br />
<xh5>Implementierung in C++</xh5><br />
|<br />
<sourcecode lang="cpp" tab="4"><br />
Vector2 PointLineDist(Vector2 point, Vector2 linestart, Vector2 lineend)<br />
{<br />
Vector2 a = lineend - linestart;<br />
Vector2 b = point - linestart;<br />
double t = dot(a, b)/(length(a)²);<br />
if (t < 0) t = 0;<br />
if (t > 1) t = 1;<br />
return linestart + a * t;<br />
}<br />
<br />
struct CollisionResult<br />
{<br />
bool isCollided;<br />
Vector2 collisionPoint;<br />
float distanceSq;<br />
}<br />
<br />
// Gibt zurück, ob eine Kollision stattfand und wenn ja, wo, und wie lang der (minimale, quadratische) Abstand zum Rechteck ist.<br />
CollisionResult RectangleCircleKollision(Rect rect, Circle circle)<br />
{<br />
float minDistSq = HUGE_VAL;<br />
Vector2 basePoint = Vector2(0,0);<br />
// Seiten durchgehen, Schleife kann (bzw muss, je nachdem wie Rect aussieht) entrollt werden<br />
for(int i=0; i<4 ;i++)<br />
{<br />
Vector2 base = PointLineDist(circle.mid, rect.points[i], rect.points[(i+1) % 4]);<br />
if(lengthsq(circle.mid-base)<minDistSq)<br />
{<br />
// Kürzerer Abstand, neu zuweisen.<br />
minDistSq = lengthsq(circle.mid - base);<br />
basePoint = base;<br />
}<br />
}<br />
return {minDistSq < circle.radius * circle.radius,<br />
basePoint,<br />
minDistSq};<br />
}<br />
</sourcecode><br />
}}<br />
}}<br />
<br />
====Beliebige Polygone im 2-dimensionalen====<br />
Derselbe code kann auch für Beliebige konvexe Polygone verwendet werden, wenn man Rect durch eine Polygonklasse ersetzt (und den Modulo-Operator anpasst)</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Zielen_f%C3%BCr_FortgeschritteneZielen für Fortgeschrittene2017-09-28T21:22:18Z<p>David Scherfgen: Anpassung für MathJax</p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Fortgeschrittene]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:Geometrie]]<br />
In fast jedem Computerspiel wird früher oder später das eine oder andere Geschoss abgefeuert. Wenn vom Computer gesteuerte Charaktere, Flugzeuge oder Raumschiffe in der Lage sein sollen, ihre Gegner halbwegs zuverlässig zu treffen, dann sollte man sich Gedanken darüber machen, wie man das Geschoss genau so abfeuert, dass es sein Ziel vermutlich treffen wird.<br />
<br />
Eine Alternative ist, den Geschossen einfach eine unendlich schnelle Geschwindigkeit zu verleihen, so dass die Bewegung des Schützen, des Ziels und des Geschosses und auch die Gravitation keine Rolle mehr spielen. Wer jedoch Wert auf ein Minimum an Realismus legt, der muss all diese Parameter berücksichtigen, denn sonst wird der größte Teil der Schüsse daneben gehen.<br />
<br />
Intuitiv ist klar: Je schneller das Ziel sich relativ zum Schützen bewegt, desto weiter muss er vorhalten, um zu treffen. Aber wie weit genau? Diese Frage lässt sich mit ein wenig Mathematik beantworten. In diesem Artikel wird ein Algorithmus vorgestellt, mit dem das möglich ist.<br />
<br />
== Die Ausgangssituation ==<br />
<br />
Folgende Parameter müssen bekannt sein:<br />
<br />
* Position und Bewegungsvektor (enthält Bewegungsrichtung und Geschwindigkeit) des Schützen<br />
* Position und Bewegungsvektor des Ziels<br />
* Mündungsgeschwindigkeit des Projektils<br />
* Gravitationsvektor<br />
<br />
Wir gehen für die Berechnungen davon aus, dass das Ziel seine Flugrichtung und Geschwindigkeit nicht oder nur geringfügig ändert, während das Projektil seinen Weg zurücklegt. Außerdem soll das Projektil durch die Gravitation ständig nach unten (oder in eine beliebige andere Richtung) gezogen werden, so dass seine Flugbahn keine Gerade, sondern eine ''Parabel'' bildet. Bei der Flugbahn des Ziels gehen wir jedoch von einer geraden Linie aus, da es sich meist um ein Flugzeug oder ein ähnliches Objekt handeln wird, das darauf ausgelegt ist, der Gravitation entgegenzuwirken und in einer geraden Linie mit gleichbleibender Geschwindigkeit zu fliegen. Die Reibung, die das Geschoss durch die Luft erfährt und die es kontinuierlich langsamer werden lässt, wird von dem Algorithmus jedoch nicht berücksichtigt, da die Berechnungen andernfalls viel komplizierter würden. Bei relativ kurzen Entfernungen zum Ziel fällt dieser Umstand nicht allzusehr ins Gewicht.<br />
<br />
Unser Ziel soll es nun sein, aus diesen Parametern die Richtung zu ermitteln, in die das Geschoss abgefeuert werden muss, um zu treffen. Die Abschussgeschwindigkeit ist dabei festgelegt, es geht also nur um die Richtung. Zusätzlich werden wir den voraussichtlichen Ort und den Zeitpunkt des Treffers berechnen.<br />
<br />
== Bezeichnungen ==<br />
<br />
Im Folgenden werden folgende Bezeichnungen für die Parameter verwendet:<br />
<br />
* <math>\vec v_T</math> ist der Bewegungsvektor des Ziels zum Zeitpunkt des Schusses, ''relativ zum Schützen'' (Differenz zwischen Bewegungsvektor des Ziels und der des Schützen). Die Dimension des Vektors spielt keine Rolle (üblich wäre 2 oder 3).<br />
* <math>\vec p_T</math> ist die Position des Ziels zum Zeitpunkt des Schusses, ebenfalls relativ zum Schützen.<br />
* <math>\vec d_H</math> ist die Richtung, in der das Projektil abgefeuert werden muss, um das Ziel zu treffen. Diesen Vektor zu berechnen ist unser Ziel.<br />
* <math>v_0</math> ist die Mündungsgeschwindigkeit des Projektils.<br />
* <math>t</math> bezeichnet allgemein die Zeit, wobei die Schussabgabe zum Zeitpunkt <math>t = 0</math> erfolgt.<br />
<br />
Warum arbeiten wir mit einem relativen Bewegungs- und Positionsvektor? Da wir die Reibung vernachlässigen, macht es beispielsweise keinen Unterschied, ob sich der Schütze mit <math>20 \mathrm{\tfrac{m}{s}}</math> nach links bewegt und das Ziel mit <math>50 \mathrm{\tfrac{m}{s}}</math>, oder ob der Schütze still steht und sich das Ziel mit <math>30 \mathrm{\tfrac{m}{s}}</math> von ihm weg bewegt. Was zählt, ist die Position und die Bewegung des Ziels ''relativ zum Schützen''. Wir betrachten also alles aus seiner Sicht, wobei er den Mittelpunkt der Welt (den Koordinatenursprung) darstellt und alles sich um ihn bewegt. Das vereinfacht die spätere Rechnung.<br />
<br />
== Berechnung des Trefferzeitpunkts ==<br />
<br />
[[Datei:Aufenthaltskreise ohne Gravitation.png|thumb|300px|right|Aufenthaltskreise für t = 1, 2, 3, ..., 10 Sekunden mit einer Mündungsgeschwindigkeit von 50 m/s, ohne Berücksichtigung der Gravitation.]]<br />
<br />
Wir beginnen mit einer Gleichung, die alle Positionen beschreibt, die ein vom Schützen abgefeuertes Projektil zu einem bestimmten Zeitpunkt einnehmen kann. Vernachlässigen wir dabei erst einmal die Gravitation, die das Projektil nach unten zieht.<br />
<br />
Nehmen wir also an, der Schütze würde unendlich viele Geschosse gleichzeitig in alle erdenklichen Richtungen abfeuern. Nach einer Sekunde halten wir das Universum an und betrachten die Positionen der Geschosse. Sie haben in dieser einen Sekunde alle dieselbe Distanz zurückgelegt und befinden sich damit auf einer Kugel (im dreidimensionalen Fall), in deren Mittelpunkt sich der Schütze befindet. Der Radius der Kugel entspricht genau dieser Distanz, und die können wir einfach berechnen, indem wir die vergangene Zeit mit der Geschossgeschwindigkeit multiplizieren, also <math>v_0 \cdot t</math> berechnen. Wenn die Geschosse beispielsweise <math>300 \mathrm{\tfrac{m}{s}}</math> schnell sind, dann hat die Kugel nach einer Sekunde einen Radius von <math>300 \mathrm{m}</math>, nach zwei Sekunden <math>600 \mathrm{m}</math>, nach fünf Sekunden <math>1500 \mathrm{m}</math>, und so weiter. Würden wir die Reibung berücksichtigen, ließe sich der Radius nicht mehr so leicht ausrechnen, da die Geschosse gebremst würden.<br />
<br />
Was haben wir dadurch gewonnen? Wir können jetzt für jeden Zeitpunkt ausrechnen, welche Stellen der Schütze treffen kann. Bei den weiteren Betrachtungen werden wir den zweidimensionalen Fall bevorzugen, da er sich grafisch leichter darstellen lässt. Hier haben wir es nicht mit Kugeln, sondern mit Kreisen zu tun. Für das Verfahren an sich ist es jedoch, wie gesagt, völlig unerheblich, welche Dimension die Vektoren haben.<br />
<br />
Wir wollen diese Kreise von nun an ''Aufenthaltskreise'' nennen, da sie genau die Punkte beschreiben, auf denen sich nach Ablauf einer bestimmten Zeit ein Geschoss befinden kann. Als nächstes müssen diese Kreise mathematisch dargestellt werden. Da wir alles vom Schützen aus betrachten, ist der Mittelpunkt der Kreise jeweils der Koordinatenursprung. Der Radius beträgt <math>v_0 \cdot t</math>, denn dies ist die Distanz, die ein Geschoss in der Zeit <math>t</math> zurücklegt.<br />
<br />
Die Formel für den Aufenthaltskreis zum Zeitpunkt <math>t</math> lautet also:<br />
<br />
: <math>k(t): \vec x^2 = (t \cdot v_0)^2</math><br />
<br />
[[Datei:Aufenthaltskreise mit Gravitation.png|thumb|300px|right|Aufenthaltskreise mit Berücksichtigung der Gravitation.]]<br />
<br />
Wenn wir jetzt die Gravitation mit einbeziehen, dann wird die ursprüngliche gleichförmige Bewegung der Projektile von einer gleichmäßig beschleunigten Bewegung in Richtung des Gravitationsvektors überlagert. Dies hat zur Folge, dass die Kreise nicht mehr konzentrisch sind, sondern sich mit der Zeit nach unten bewegen. Sie werden jedoch nicht gestreckt. Diese Kreise werden nun beschrieben durch:<br />
<br />
: <math>k_G(t): (\vec x - \tfrac{1}{2} \vec g \cdot t^2)^2 = (t \cdot v_0)^2</math><br />
<br />
Wie man in der Abbildung erkennen kann, gibt es keine Möglichkeit, Punkte oberhalb der Grenze von ungefähr <math>y = 140</math> zu treffen, da dort keine Kreise verlaufen. Das liegt daran, dass die Gravitation die Geschosse daran hindert, höher zu steigen. Die Projektile verlieren ihre vertikale Geschwindigkeit nach oben und gehen in den Fall über. Eine höhere Mündungsgeschwindigkeit <math>v_0</math> würde die Reichweite vergrößern.<br />
<br />
Betrachten wir nun die geradlinige Bewegung des Ziels. Dessen Position zum Zeitpunkt <math>t</math> lässt sich ganz leicht wie folgt berechnen:<br />
<br />
: <math>\vec x(t) = \vec p_T + t \cdot \vec v_T</math><br />
<br />
Diese Gleichung beschreibt eine einfache Gerade. Wir wollen jetzt den Zeitpunkt <math>t_H</math> ermitteln, zu dem ein Projektil das Ziel treffen kann, um dann später daraus die Abschussrichtung zu berechnen. Zu dem gesuchten Zeitpunkt <math>t_H</math> muss sich das Ziel also genau auf dem dazugehörigen Aufenthaltskreis <math>k_G(t_H)</math> befinden, denn dieser Kreis beschreibt alle möglichen Orte, an denen sich ein Projektil zu diesem Zeitpunkt befinden kann. Um den Zeitpunkt berechnen zu können, müssen wir die beiden Gleichungen ineinander einsetzen:<br />
<br />
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math><br />
<br />
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende quartische Gleichung:<br />
<br />
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math><br />
<br />
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für quartische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:<br />
<br />
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).<br />
# Es gibt mindestens eine positive reelle Lösung. Das heißt, dass es eine oder mehrere Möglichkeiten gibt, wie das Projektil abgefeuert werden könnte, so dass es das Ziel irgendwann trifft. Manche dieser Möglichkeiten könnten etwas ungewöhnlich erscheinen, würde man sie in die Tat umsetzen. Der Schütze würde das Geschoss beispielsweise im hohen Bogen auf das Ziel befördern, obwohl es sich direkt vor ihm befindet (eine solche Lösung wäre dann interessant, wenn der direkte Weg zum Ziel durch ein Hindernis versperrt ist). Negative Lösungen sind deswegen uninteressant, da die Lösungen schließlich für den voraussichtlichen Trefferzeitpunkt stehen, und ein negativer Wert würde bedeuten, dass das Ziel in der Vergangenheit getroffen wurde.<br />
<br />
Für unsere Zwecke sind wir daher an der ''kleinsten positiven Lösung'' dieser Gleichung interessiert, denn mit dieser Lösung bleibt dem Ziel die kürzeste Zeit zum Ausweichen.<br />
<br />
== Wohin zielen? ==<br />
<br />
Wenn wir die kleinste positive Lösung <math>t_H</math> gefunden haben, können wir als nächstes den Ort des Treffers <math>\vec p_H</math> berechnen (immer relativ zum Schützen). Dazu müssen wir nur <math>t_H</math> in die Gleichung für die Flugbahn des Ziels einsetzen:<br />
<br />
: <math>\vec p_H = \vec p_T + t_H \cdot \vec v_T</math><br />
<br />
Damit kennen wir den Ort und den Zeitpunkt eines möglichen Treffers, aber wir kennen noch nicht die Richtung <math>\vec d_H</math>, in die das Projektil vom Schützen abgefeuert werden muss, damit es zu diesem Treffer kommen kann. Glücklicherweise ist das nun nicht mehr besonders schwierig. Zuerst stellen wir eine Gleichung für die Flugbahn des Geschosses relativ zum Schützen auf, wenn es von ihm in die Richtung <math>\vec d</math> abgeschossen wurde:<br />
<br />
: <math>\vec x(t) = \vec d \cdot v_0 \cdot t + \tfrac{1}{2} \vec g \cdot t^2</math><br />
<br />
Die Bewegung des Geschosses besteht also aus zwei Bewegungen, die sich überlagern: Die Komponente <math>\vec d \cdot v_0 \cdot t</math> ist die gleichförmige Bewegung, die das Geschoss durch den Abschuss erhalten hat, und <math>\tfrac{1}{2} \vec g \cdot t^2</math> ist die gleichmäßig beschleunigte Bewegung, die es durch die Gravitation erfährt.<br />
<br />
Da wir vorhin bereits den Zeitpunkt des Treffers <math>t_H</math> und auch den Ort <math>\vec p_H</math> berechnet haben, können wir beides in die Gleichung einsetzen und nach <math>\vec d</math> auflösen:<br />
<br />
: <math>\begin{align} \vec x(t_H) &= \vec p_H \\ \vec d \cdot v_0 \cdot t_H + \tfrac{1}{2} \vec g \cdot {t_H}^2 &= \vec p_H \\ \vec d &= \frac{\vec p_H - \tfrac{1}{2} \vec g \cdot {t_H}^2}{v_0 \cdot t_H} \end{align}</math><br />
<br />
Mit dem Vektor <math>\vec d</math> kennen wir jetzt die Richtung, in die der Schütze von sich aus gesehen das Geschoss abfeuern muss, um das Ziel (wahrscheinlich) zu treffen. Dieser Vektor ist automatisch normiert, hat also die Länge 1. Da wir bei allen Überlegungen die Position und die Bewegung des Schützen nicht benötigt haben, weil wir mit relativen Positionen und Geschwindigkeiten gearbeitet haben, müssen wir, um den endgültigen ''absoluten'' Bewegungsvektor <math>\vec v_P</math> des Projektils zu erhalten, den Bewegungsvektor <math>\vec v_S</math> des Schützen wieder hinzuaddieren:<br />
<br />
: <math>\vec v_P = \vec v_S + \vec d \cdot v_0</math><br />
<br />
== Implementierung in C++ ==<br />
<br />
In der folgenden Beispielimplementierung wird zum Lösen der quartischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[https://github.com/toastedcrumpets/DynamO/blob/master/src/magnet/magnet/math/quartic.hpp ''dynamo - Event driven molecular dynamics simulator'']. Marcus Bannerman. 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot()</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).<br />
<br />
<sourcecode lang=cpp tab=4><br />
/* Parameter:<br />
* ----------<br />
* shooterPosition: [in] Position des Schützen<br />
* shooterVelocity: [in] Bewegungsvektor des Schützen<br />
* targetPosition: [in] Position des Ziels<br />
* targetVelocity: [in] Bewegungsvektor des Ziels<br />
* projectileSpeed: [in] Geschossgeschwindigkeit<br />
* gravity: [in] Gravitationsvektor<br />
* outHitPosition: [out] Position des voraussichtlichen Treffers (absolut)<br />
* outHitTime: [out] Zeitpunkt des voraussichtlichen Treffers<br />
* outShootDir: [out] Richtung, in die das Projektil abgefeuert werden muss<br />
*<br />
* Rückgabewert: true, wenn das Ziel getroffen werden kann,<br />
* false, wenn es nicht getroffen werden kann.<br />
*/<br />
bool computeHitWithGravity(const Vector& shooterPosition,<br />
const Vector& shooterVelocity,<br />
const Vector& targetPosition,<br />
const Vector& targetVelocity,<br />
double projectileSpeed,<br />
const Vector& gravity,<br />
Vector& outHitPosition,<br />
double& outHitTime,<br />
Vector& outShootDir)<br />
{<br />
// Relative Zielposition und -geschwindigkeit berechnen.<br />
const Vector targetRelPosition = targetPosition - shooterPosition;<br />
const Vector targetRelVelocity = targetVelocity - shooterVelocity;<br />
<br />
// Koeffizienten der quartischen Gleichung berechnen.<br />
const double A = 0.25 * gravity.lengthSq();<br />
const double B = -Vector::dot(targetRelVelocity, gravity);<br />
const double C = targetRelVelocity.lengthSq() - projectileSpeed * projectileSpeed - Vector::dot(targetRelPosition, gravity);<br />
const double D = 2 * Vector::dot(targetRelPosition, targetRelVelocity);<br />
const double E = targetRelPosition.lengthSq();<br />
<br />
// Reelle Lösungen der Gleichung bestimmen.<br />
// Wichtig: magnet::math::quarticSolve geht davon aus, dass A = 1 ist.<br />
// Also dividieren wir alle übrigen Koeffizienten durch A.<br />
double r[4];<br />
size_t n = magnet::math::quarticSolve(B / A, C / A, D / A, E / A, r[0], r[1], r[2], r[3]);<br />
<br />
// Gibt es Lösungen?<br />
if(!n)<br />
{<br />
// Keine Lösung - das Ziel kann nicht getroffen werden.<br />
return false;<br />
}<br />
<br />
// Die kleinste positive Lösung suchen.<br />
double smallestPositive = -1.0;<br />
for(size_t i = 0; i < n; i++)<br />
{<br />
if(r[i] > 0.0 &&<br />
(smallestPositive == -1.0 || r[i] < smallestPositive))<br />
{<br />
smallestPositive = r[i];<br />
}<br />
}<br />
<br />
// Gab es überhaupt eine positive Lösung?<br />
if(smallestPositive == -1.0)<br />
{<br />
// Nein - kein Treffer möglich!<br />
return false;<br />
}<br />
<br />
// Wir übernehmen die gefundene Lösung.<br />
const double t = smallestPositive;<br />
<br />
// Ort des Treffers (relativ zum Schützen) berechnen.<br />
const Vector hitRelPosition = targetRelPosition + t * targetRelVelocity;<br />
<br />
// Richtung des Abschusses berechnen.<br />
const Vector shootDir = (hitRelPosition - 0.5 * gravity * t * t) / (projectileSpeed * t);<br />
<br />
// Gefundene Werte ausgeben.<br />
outHitTime = t;<br />
outHitPosition = targetPosition + t * targetVelocity;<br />
outShootDir = shootDir;<br />
<br />
return true;<br />
}<br />
</sourcecode><br />
<br />
== Mögliche Erweiterungen ==<br />
<br />
Wie bereits erwähnt, berücksichtigt das hier vorgestellte Verfahren nicht den Luftwiderstand, der ein Geschoss ständig langsamer werden lässt. Eine andere Erweiterung besteht darin, nicht nur die momentane Geschwindigkeit des Ziels (die erste Ableitung der Position), sondern auch seine momentane Beschleunigung (die zweite Ableitung) in die Berechnung einzubeziehen. Damit würde das Ziel nicht nur garantiert getroffen, wenn es seinen Kurs nicht ändert, sondern es würde ausreichen, dass es seine ''Beschleunigung'' nicht ändert. Solche Erweiterungen führen zu Gleichungen noch höheren Grades, die algebraisch nicht mehr gelöst werden können, sondern nur noch numerisch.<br />
<br />
Eine Alternative zur direkten Berechnung ist die Verwendung von [http://de.wikipedia.org/wiki/Monte-Carlo-Simulation Monte-Carlo-Simulation]. Dabei könnte man die Bewegung des Ziels probabilistisch modellieren, eventuell sogar "intelligent" auf der Basis vergangener Beobachtungen, und so eine Abschussrichtung mit maximaler Trefferwahrscheinlichkeit finden.<br />
<br />
== Einzelnachweise ==<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Neuronale_Netze_f%C3%BCr_k%C3%BCnstliche_IntelligenzNeuronale Netze für künstliche Intelligenz2017-09-28T21:13:52Z<p>David Scherfgen: Anpassung für MathJax</p>
<hr />
<div>{{Baustelle}}<br />
==Einstieg==<br />
Künstliche Intelligenz, gehört zu einem der faszinierendsten Teilgebieten der Informatik. In kaum einem anderem Gebiet wird so eine Resonanz hervorgerufen wie in diesem. Es gab schon zahlreiche Hollywood-Produktionen zu diesem Thema und es gibt auch zahlreiche Hoffnungen und Ängste, die mit utopischen Fantasien sowie mit weit hergeholten Schreckensszenarien assoziiert sind.<br />
In diesem Artikel wird über einen winzigen Teil dieses Gebiets gesprochen, über Neuronale Netze.<br />
<br />
[[Datei:Nn_00.png]]<br />
<br />
Im Grunde genommen ist ein Neuronales Netz eine Struktur mehrerer künstlicher Neuronen, die gemeinsame Eingabedaten und ein gewisse Anzahl an Ausgabesignalen erzeugen. Das wichtigste ist wohl die Lernfähigkeit dieser Systeme, so kann man sie beispielsweise zur Gesichtserkennung nutzen, zum umwandeln von handschriftlichen in 'maschinellen' Text oder aber auch als "Gehirn" für Wesen in einem Spiel. Entgegen einem evolutionären Algorithmus, der sich eher für Optimierungsprobleme eignet, wie etwa Autofahren von A nach B durch eine kurvige Straße, sind Neuronale Netze besonders gut darin, Muster zu erkennen. Natürlich gibt es verschiedene Arten von Neuronalen Netzen, der Grundaufbau bleibt jedoch stets gleich. Es gibt je eine so genannte "Input-Layer", "Hidden-Layer" und eine "Output-Layer".<br />
<br />
==Künstliche Neuronen==<br />
Künstliche Neuronen sind das Modell auf dem Neuronale Netze basieren. Das einfachste neuronale Netz ist eines mit einem einzelnen, künstlichem Neuron als Output-Layer, auch Perzeptron genannt. Sie sind den Synapsen nachempfunden und haben auch eine ähnliche Funktionsweise. Die Hidden-Layer wäre hier leer.<br />
Wir wollen uns erst einmal anhand eines solchen Neuronalen Netzes die Funktionsweise näher bringen. Nehmen wir an, wir wollen das logische Und umsetzen, wir bekommen also zwei Inputs mit jeweils den Werten Eins oder Null und wollen anhand dessen, sobald beide Inputs den Wert Eins annehmen, Eins als Output ausgeben, ansonsten eben Null. Unser Netz sieht also so aus:<br />
[[Datei:Nn_01.png]]<br />
<br />
Unser Neuron, hier rot, weil es ja gleichzeitig der Output ist, bekommt einen Vektor, der den Input repräsentiert, macht irgendwas magisches mit diesem Input und gibt uns hoffentlich den richtigen Output. Jeder "Pfeil", jede Linie zu einem anderen künstlichen Neuron in diesen Grafiken, repräsentiert die Verbindung zu dem anderem, dass das andere den Output des letzten erhält. Dieser wird mit einer Gewichtung multipliziert. Der "magische" Prozess des Neurons ist nun, jede Komponente des Eingabevektors auf zu addieren und die Summe all dessen in eine so genannte Aktivierungsfunktion zu stecken. Diese Funktion kann man sich praktisch für jedes Neuron neu aussuchen. In unserem Beispielfall macht z.B. die Vorzeichenfunktion Sinn. Also<br />
<math>f\left(x\right)=\left\{<br />
\begin{array}{l l}<br />
-1 & \quad \text{, wenn }x > 0\\<br />
0 & \quad \text{, wenn }x = 0\\<br />
+1 & \quad \text{, wenn }x < 0<br />
\end{array} \right\}<br />
</math><br />
<br />
==Aufbau Neuronaler Netze==<br />
Ein neuronales Netz besteht aus mehreren diese Neuronen die in der Regel in verschieden Schichten angeordnet werden.<br />
<br />
==Lernverhalten==<br />
<br />
==Lernregeln==</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Discord-chat-urlMediaWiki:Discord-chat-url2017-02-11T12:29:28Z<p>David Scherfgen: </p>
<hr />
<div>https://discord.gg/apQSw4h</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2017-02-06T18:46:24Z<p>David Scherfgen: /* Wichtige Seiten */</p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://www.spieleprogrammierer.de/index.php?page=MibbitChat IRC-Chat]''': Der IRC-Channel zur Website: <tt>#sppro</tt> auf [http://www.euirc.net/ euIRC].<br />
* '''[https://discord.gg/KGGgGVy Discord-Chat]''': Der Discord-Server zur Website.<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/HauptseiteHauptseite2017-02-06T18:45:14Z<p>David Scherfgen: </p>
<hr />
<div>{{DISPLAYTITLE:Herzlich Willkommen!}}<br />
Schön, dass du den Weg zum '''Spieleprogrammierer-Wiki''' gefunden hast. Bitte nimm dir die Zeit, diese Seite aufmerksam durchzulesen. Wenn du Fehler in einem Text findest oder allgemein zur Verbesserung und Weiterentwicklung des Wikis beitragen möchtest, dann zögere nicht, Seiten zu bearbeiten oder neu zu erstellen (→ [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]).<br />
<br />
== Registrierung in Wiki und Forum ==<br />
<br />
Unsere Website besteht aus einem Wiki (dort bist du gerade) und einem [https://www.spieleprogrammierer.de/ Forum]. Du kannst Inhalte im Wiki und im Forum immer lesen. Um Artikel erstellen/bearbeiten oder im Forum schreiben zu können, musst du jedoch ''registriert und angemeldet sein''. Die entsprechenden Links findest du ganz oben in der Kopfzeile jeder Seite. Keine Angst: Die Registrierung ist völlig kostenlos.<br />
<br />
== Wie fange ich an? ==<br />
<br />
Das kommt ganz darauf an:<br />
<br />
; Du willst Spiele programmieren lernen, hast aber noch gar keinen Überblick?<br />
: ''Lies dir unseren Artikel für Einsteiger "[[Spiele programmieren lernen]]" durch!'' Aller Anfang ist schwer, und es gibt unzählige Möglichkeiten, wie man mit der Programmierung eigener Spiele anfangen kann, wobei alle ihre Vor- und Nachteile haben. Darum haben wir diesen ausführlichen Artikel geschrieben, der hoffentlich die wichtigsten Fragen beantwortet. Er soll dir einen Überblick verschaffen und dich in die Lage versetzen, gezielt nach weiteren Informationen zu suchen.<br />
<br />
; Du bist schon Spieleprogrammierer und suchst nach etwas bestimmtem?<br />
: Dann benutze am besten die Suchfunktion rechts oben, um einen passenden Artikel zu finden. Wenn du nicht fündig wirst, jedoch glaubst, dass auch andere Besucher daran interessiert sein könnten, dann setze deinen Wunschartikel auf die [[SpproWiki:Wunschliste|Wunschliste]]. Ansonsten solltest du eher einen Thread im [https://www.spieleprogrammierer.de/ Forum] erstellen.<br />
<br />
; Du möchtest gerne etwas schreiben?<br />
: Gute Autoren sind stets willkommen. Wir freuen uns über jeden gut geschriebenen und thematisch passenden Artikel. Vielleicht möchtest du dir eines der Themen von der [[SpproWiki:Wunschliste|Wunschliste]] vornehmen? Wenn du stattdessen lieber vorhandene Artikel verbessern möchtest, schau dir die Listen der [[:Kategorie:Unvollständige Seite|unvollständigen]] und [[:Kategorie:Zu verbessernde Seite|zu verbessernden]] Seiten an. Lies dir vor dem Schreiben oder Bearbeiten eines Artikels auf jeden Fall den [[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]] durch.<br />
<br />
; Du willst einfach nur stöbern?<br />
: Hier findest du die [[Spezial:Alle Seiten|Liste aller Seiten]] und die [[Spezial:Kategorien|Liste aller Kategorien]].<br />
<br />
== Wichtige Seiten ==<br />
<br />
* '''[https://www.spieleprogrammierer.de Forum]''': Das Diskussionsforum. Hier kannst du Fragen stellen, dich mit anderen austauschen und diskutieren.<br />
* '''[https://www.spieleprogrammierer.de/index.php?page=MibbitChat IRC-Chat]''': Der IRC-Channel zur Website: <tt>#sppro</tt> auf [http://www.euirc.net/ euIRC].<br />
* '''[https://discord.gg/KGGgGVy]''': Der Discord-Server zur Website.<br />
* '''[[Spezial:Alle Seiten|Alle Seiten]]''': Zeigt eine Liste aller Seiten an.<br />
* '''[[Spezial:Kategorien|Kategorien]]''': Erlaubt das Anzeigen von Seiten geordnet nach Thema.<br />
* '''[[SpproWiki:Wunschliste|Wunschliste]]''': Erweiterbare Liste von Themen, zu denen Artikel geschrieben werden sollen.<br />
* '''[[Link-Sammlung]]''': Eine große Sammlung hilfreicher Links zur Spieleentwicklung!<br />
* '''[[Spezial:Letzte Änderungen|Letzte Änderungen]]''': Zeigt Artikel an, die kürzlich geändert wurden.<br />
* '''[[Hilfe:Inhaltsverzeichnis|Hilfe zum Wiki]]''': Alles über die Bedienung des Wikis und über das Schreiben von Artikeln.<br />
* '''[[Hilfe:Leitfaden für Autoren|Leitfaden für Autoren]]''': Wichtige Richtlinien, an die du dich als Wiki-Autor halten solltest.<br />
* '''[[SpproWiki:Über|Über das Wiki]]''': Informationen über das Wiki: Wie ist es aufgebaut, welche Themen deckt es ab?</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Discord-chat-urlMediaWiki:Discord-chat-url2017-02-06T18:36:15Z<p>David Scherfgen: Die Seite wurde neu angelegt: „https://discord.gg/KGGgGVy“</p>
<hr />
<div>https://discord.gg/KGGgGVy</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Discord-chatMediaWiki:Discord-chat2017-02-06T18:35:42Z<p>David Scherfgen: Die Seite wurde neu angelegt: „Discord-Chat“</p>
<hr />
<div>Discord-Chat</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Irc-chatMediaWiki:Irc-chat2017-02-06T18:35:05Z<p>David Scherfgen: </p>
<hr />
<div>IRC-Chat</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:SidebarMediaWiki:Sidebar2017-02-06T18:34:44Z<p>David Scherfgen: </p>
<hr />
<div>* navigation<br />
** mainpage|mainpage-description<br />
** forum-url|forum<br />
** irc-chat-url|irc-chat<br />
** discord-chat-url|discord-chat<br />
** Spezial:Alle Seiten|allarticles<br />
** Spezial:Kategorien|categories<br />
** SpproWiki:Wunschliste|Wunschliste<br />
** Link-Sammlung|Link-Sammlung<br />
** Kategorie:Tutorial|Tutorials<br />
** recentchanges-url|recentchanges<br />
** helppage|help<br />
* TOOLBOX</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Irc-chatMediaWiki:Irc-chat2017-02-06T18:34:31Z<p>David Scherfgen: verschob „MediaWiki:Chat“ nach „MediaWiki:Irc-chat“</p>
<hr />
<div>Chat</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Irc-chat-urlMediaWiki:Irc-chat-url2017-02-06T18:34:08Z<p>David Scherfgen: verschob „MediaWiki:Chat-url“ nach „MediaWiki:Irc-chat-url“</p>
<hr />
<div>https://www.spieleprogrammierer.de/index.php?page=MibbitChat</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Zielen_f%C3%BCr_FortgeschritteneZielen für Fortgeschrittene2017-01-06T17:50:31Z<p>David Scherfgen: /* Implementierung in C++ */</p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Fortgeschrittene]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:Geometrie]]<br />
In fast jedem Computerspiel wird früher oder später das eine oder andere Geschoss abgefeuert. Wenn vom Computer gesteuerte Charaktere, Flugzeuge oder Raumschiffe in der Lage sein sollen, ihre Gegner halbwegs zuverlässig zu treffen, dann sollte man sich Gedanken darüber machen, wie man das Geschoss genau so abfeuert, dass es sein Ziel vermutlich treffen wird.<br />
<br />
Eine Alternative ist, den Geschossen einfach eine unendlich schnelle Geschwindigkeit zu verleihen, so dass die Bewegung des Schützen, des Ziels und des Geschosses und auch die Gravitation keine Rolle mehr spielen. Wer jedoch Wert auf ein Minimum an Realismus legt, der muss all diese Parameter berücksichtigen, denn sonst wird der größte Teil der Schüsse daneben gehen.<br />
<br />
Intuitiv ist klar: Je schneller das Ziel sich relativ zum Schützen bewegt, desto weiter muss er vorhalten, um zu treffen. Aber wie weit genau? Diese Frage lässt sich mit ein wenig Mathematik beantworten. In diesem Artikel wird ein Algorithmus vorgestellt, mit dem das möglich ist.<br />
<br />
== Die Ausgangssituation ==<br />
<br />
Folgende Parameter müssen bekannt sein:<br />
<br />
* Position und Bewegungsvektor (enthält Bewegungsrichtung und Geschwindigkeit) des Schützen<br />
* Position und Bewegungsvektor des Ziels<br />
* Mündungsgeschwindigkeit des Projektils<br />
* Gravitationsvektor<br />
<br />
Wir gehen für die Berechnungen davon aus, dass das Ziel seine Flugrichtung und Geschwindigkeit nicht oder nur geringfügig ändert, während das Projektil seinen Weg zurücklegt. Außerdem soll das Projektil durch die Gravitation ständig nach unten (oder in eine beliebige andere Richtung) gezogen werden, so dass seine Flugbahn keine Gerade, sondern eine ''Parabel'' bildet. Bei der Flugbahn des Ziels gehen wir jedoch von einer geraden Linie aus, da es sich meist um ein Flugzeug oder ein ähnliches Objekt handeln wird, das darauf ausgelegt ist, der Gravitation entgegenzuwirken und in einer geraden Linie mit gleichbleibender Geschwindigkeit zu fliegen. Die Reibung, die das Geschoss durch die Luft erfährt und die es kontinuierlich langsamer werden lässt, wird von dem Algorithmus jedoch nicht berücksichtigt, da die Berechnungen andernfalls viel komplizierter würden. Bei relativ kurzen Entfernungen zum Ziel fällt dieser Umstand nicht allzusehr ins Gewicht.<br />
<br />
Unser Ziel soll es nun sein, aus diesen Parametern die Richtung zu ermitteln, in die das Geschoss abgefeuert werden muss, um zu treffen. Die Abschussgeschwindigkeit ist dabei festgelegt, es geht also nur um die Richtung. Zusätzlich werden wir den voraussichtlichen Ort und den Zeitpunkt des Treffers berechnen.<br />
<br />
== Bezeichnungen ==<br />
<br />
Im Folgenden werden folgende Bezeichnungen für die Parameter verwendet:<br />
<br />
* <math>\vec v_T</math> ist der Bewegungsvektor des Ziels zum Zeitpunkt des Schusses, ''relativ zum Schützen'' (Differenz zwischen Bewegungsvektor des Ziels und der des Schützen). Die Dimension des Vektors spielt keine Rolle (üblich wäre 2 oder 3).<br />
* <math>\vec p_T</math> ist die Position des Ziels zum Zeitpunkt des Schusses, ebenfalls relativ zum Schützen.<br />
* <math>\vec d_H</math> ist die Richtung, in der das Projektil abgefeuert werden muss, um das Ziel zu treffen. Diesen Vektor zu berechnen ist unser Ziel.<br />
* <math>v_0</math> ist die Mündungsgeschwindigkeit des Projektils.<br />
* <math>t</math> bezeichnet allgemein die Zeit, wobei die Schussabgabe zum Zeitpunkt <math>t = 0</math> erfolgt.<br />
<br />
Warum arbeiten wir mit einem relativen Bewegungs- und Positionsvektor? Da wir die Reibung vernachlässigen, macht es beispielsweise keinen Unterschied, ob sich der Schütze mit <math>20 \mathrm{\tfrac{m}{s}}</math> nach links bewegt und das Ziel mit <math>50 \mathrm{\tfrac{m}{s}}</math>, oder ob der Schütze still steht und sich das Ziel mit <math>30 \mathrm{\tfrac{m}{s}}</math> von ihm weg bewegt. Was zählt, ist die Position und die Bewegung des Ziels ''relativ zum Schützen''. Wir betrachten also alles aus seiner Sicht, wobei er den Mittelpunkt der Welt (den Koordinatenursprung) darstellt und alles sich um ihn bewegt. Das vereinfacht die spätere Rechnung.<br />
<br />
== Berechnung des Trefferzeitpunkts ==<br />
<br />
[[Datei:Aufenthaltskreise ohne Gravitation.png|thumb|300px|right|Aufenthaltskreise für t = 1, 2, 3, ..., 10 Sekunden mit einer Mündungsgeschwindigkeit von 50 m/s, ohne Berücksichtigung der Gravitation.]]<br />
<br />
Wir beginnen mit einer Gleichung, die alle Positionen beschreibt, die ein vom Schützen abgefeuertes Projektil zu einem bestimmten Zeitpunkt einnehmen kann. Vernachlässigen wir dabei erst einmal die Gravitation, die das Projektil nach unten zieht.<br />
<br />
Nehmen wir also an, der Schütze würde unendlich viele Geschosse gleichzeitig in alle erdenklichen Richtungen abfeuern. Nach einer Sekunde halten wir das Universum an und betrachten die Positionen der Geschosse. Sie haben in dieser einen Sekunde alle dieselbe Distanz zurückgelegt und befinden sich damit auf einer Kugel (im dreidimensionalen Fall), in deren Mittelpunkt sich der Schütze befindet. Der Radius der Kugel entspricht genau dieser Distanz, und die können wir einfach berechnen, indem wir die vergangene Zeit mit der Geschossgeschwindigkeit multiplizieren, also <math>v_0 \cdot t</math> berechnen. Wenn die Geschosse beispielsweise <math>300 \mathrm{\tfrac{m}{s}}</math> schnell sind, dann hat die Kugel nach einer Sekunde einen Radius von <math>300 \mathrm{m}</math>, nach zwei Sekunden <math>600 \mathrm{m}</math>, nach fünf Sekunden <math>1500 \mathrm{m}</math>, und so weiter. Würden wir die Reibung berücksichtigen, ließe sich der Radius nicht mehr so leicht ausrechnen, da die Geschosse gebremst würden.<br />
<br />
Was haben wir dadurch gewonnen? Wir können jetzt für jeden Zeitpunkt ausrechnen, welche Stellen der Schütze treffen kann. Bei den weiteren Betrachtungen werden wir den zweidimensionalen Fall bevorzugen, da er sich grafisch leichter darstellen lässt. Hier haben wir es nicht mit Kugeln, sondern mit Kreisen zu tun. Für das Verfahren an sich ist es jedoch, wie gesagt, völlig unerheblich, welche Dimension die Vektoren haben.<br />
<br />
Wir wollen diese Kreise von nun an ''Aufenthaltskreise'' nennen, da sie genau die Punkte beschreiben, auf denen sich nach Ablauf einer bestimmten Zeit ein Geschoss befinden kann. Als nächstes müssen diese Kreise mathematisch dargestellt werden. Da wir alles vom Schützen aus betrachten, ist der Mittelpunkt der Kreise jeweils der Koordinatenursprung. Der Radius beträgt <math>v_0 \cdot t</math>, denn dies ist die Distanz, die ein Geschoss in der Zeit <math>t</math> zurücklegt.<br />
<br />
Die Formel für den Aufenthaltskreis zum Zeitpunkt <math>t</math> lautet also:<br />
<br />
: <math>k(t): \vec x^2 = (t \cdot v_0)^2</math><br />
<br />
[[Datei:Aufenthaltskreise mit Gravitation.png|thumb|300px|right|Aufenthaltskreise mit Berücksichtigung der Gravitation.]]<br />
<br />
Wenn wir jetzt die Gravitation mit einbeziehen, dann wird die ursprüngliche gleichförmige Bewegung der Projektile von einer gleichmäßig beschleunigten Bewegung in Richtung des Gravitationsvektors überlagert. Dies hat zur Folge, dass die Kreise nicht mehr konzentrisch sind, sondern sich mit der Zeit nach unten bewegen. Sie werden jedoch nicht gestreckt. Diese Kreise werden nun beschrieben durch:<br />
<br />
: <math>k_G(t): (\vec x - \tfrac{1}{2} \vec g \cdot t^2)^2 = (t \cdot v_0)^2</math><br />
<br />
Wie man in der Abbildung erkennen kann, gibt es keine Möglichkeit, Punkte oberhalb der Grenze von ungefähr <math>y = 140</math> zu treffen, da dort keine Kreise verlaufen. Das liegt daran, dass die Gravitation die Geschosse daran hindert, höher zu steigen. Die Projektile verlieren ihre vertikale Geschwindigkeit nach oben und gehen in den Fall über. Eine höhere Mündungsgeschwindigkeit <math>v_0</math> würde die Reichweite vergrößern.<br />
<br />
Betrachten wir nun die geradlinige Bewegung des Ziels. Dessen Position zum Zeitpunkt <math>t</math> lässt sich ganz leicht wie folgt berechnen:<br />
<br />
: <math>\vec x(t) = \vec p_T + t \cdot \vec v_T</math><br />
<br />
Diese Gleichung beschreibt eine einfache Gerade. Wir wollen jetzt den Zeitpunkt <math>t_H</math> ermitteln, zu dem ein Projektil das Ziel treffen kann, um dann später daraus die Abschussrichtung zu berechnen. Zu dem gesuchten Zeitpunkt <math>t_H</math> muss sich das Ziel also genau auf dem dazugehörigen Aufenthaltskreis <math>k_G(t_H)</math> befinden, denn dieser Kreis beschreibt alle möglichen Orte, an denen sich ein Projektil zu diesem Zeitpunkt befinden kann. Um den Zeitpunkt berechnen zu können, müssen wir die beiden Gleichungen ineinander einsetzen:<br />
<br />
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math><br />
<br />
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende quartische Gleichung:<br />
<br />
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math><br />
<br />
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für quartische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:<br />
<br />
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).<br />
# Es gibt mindestens eine positive reelle Lösung. Das heißt, dass es eine oder mehrere Möglichkeiten gibt, wie das Projektil abgefeuert werden könnte, so dass es das Ziel irgendwann trifft. Manche dieser Möglichkeiten könnten etwas ungewöhnlich erscheinen, würde man sie in die Tat umsetzen. Der Schütze würde das Geschoss beispielsweise im hohen Bogen auf das Ziel befördern, obwohl es sich direkt vor ihm befindet (eine solche Lösung wäre dann interessant, wenn der direkte Weg zum Ziel durch ein Hindernis versperrt ist). Negative Lösungen sind deswegen uninteressant, da die Lösungen schließlich für den voraussichtlichen Trefferzeitpunkt stehen, und ein negativer Wert würde bedeuten, dass das Ziel in der Vergangenheit getroffen wurde.<br />
<br />
Für unsere Zwecke sind wir daher an der ''kleinsten positiven Lösung'' dieser Gleichung interessiert, denn mit dieser Lösung bleibt dem Ziel die kürzeste Zeit zum Ausweichen.<br />
<br />
== Wohin zielen? ==<br />
<br />
Wenn wir die kleinste positive Lösung <math>t_H</math> gefunden haben, können wir als nächstes den Ort des Treffers <math>\vec p_H</math> berechnen (immer relativ zum Schützen). Dazu müssen wir nur <math>t_H</math> in die Gleichung für die Flugbahn des Ziels einsetzen:<br />
<br />
: <math>\vec p_H = \vec p_T + t_H \cdot \vec v_T</math><br />
<br />
Damit kennen wir den Ort und den Zeitpunkt eines möglichen Treffers, aber wir kennen noch nicht die Richtung <math>\vec d_H</math>, in die das Projektil vom Schützen abgefeuert werden muss, damit es zu diesem Treffer kommen kann. Glücklicherweise ist das nun nicht mehr besonders schwierig. Zuerst stellen wir eine Gleichung für die Flugbahn des Geschosses relativ zum Schützen auf, wenn es von ihm in die Richtung <math>\vec d</math> abgeschossen wurde:<br />
<br />
: <math>\vec x(t) = \vec d \cdot v_0 \cdot t + \tfrac{1}{2} \vec g \cdot t^2</math><br />
<br />
Die Bewegung des Geschosses besteht also aus zwei Bewegungen, die sich überlagern: Die Komponente <math>\vec d \cdot v_0 \cdot t</math> ist die gleichförmige Bewegung, die das Geschoss durch den Abschuss erhalten hat, und <math>\tfrac{1}{2} \vec g \cdot t^2</math> ist die gleichmäßig beschleunigte Bewegung, die es durch die Gravitation erfährt.<br />
<br />
Da wir vorhin bereits den Zeitpunkt des Treffers <math>t_H</math> und auch den Ort <math>\vec p_H</math> berechnet haben, können wir beides in die Gleichung einsetzen und nach <math>\vec d</math> auflösen:<br />
<br />
: <math>\begin{align}<br />
\vec x(t_H) &= \vec p_H \\<br />
\vec d \cdot v_0 \cdot t_H + \tfrac{1}{2} \vec g \cdot {t_H}^2 &= \vec p_H \\<br />
\vec d &= \frac{\vec p_H - \tfrac{1}{2} \vec g \cdot {t_H}^2}{v_0 \cdot t_H}<br />
\end{align}</math><br />
<br />
Mit dem Vektor <math>\vec d</math> kennen wir jetzt die Richtung, in die der Schütze von sich aus gesehen das Geschoss abfeuern muss, um das Ziel (wahrscheinlich) zu treffen. Dieser Vektor ist automatisch normiert, hat also die Länge 1. Da wir bei allen Überlegungen die Position und die Bewegung des Schützen nicht benötigt haben, weil wir mit relativen Positionen und Geschwindigkeiten gearbeitet haben, müssen wir, um den endgültigen ''absoluten'' Bewegungsvektor <math>\vec v_P</math> des Projektils zu erhalten, den Bewegungsvektor <math>\vec v_S</math> des Schützen wieder hinzuaddieren:<br />
<br />
: <math>\vec v_P = \vec v_S + \vec d \cdot v_0</math><br />
<br />
== Implementierung in C++ ==<br />
<br />
In der folgenden Beispielimplementierung wird zum Lösen der quartischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[https://github.com/toastedcrumpets/DynamO/blob/master/src/magnet/magnet/math/quartic.hpp ''dynamo - Event driven molecular dynamics simulator'']. Marcus Bannerman. 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot()</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).<br />
<br />
<sourcecode lang=cpp tab=4><br />
/* Parameter:<br />
* ----------<br />
* shooterPosition: [in] Position des Schützen<br />
* shooterVelocity: [in] Bewegungsvektor des Schützen<br />
* targetPosition: [in] Position des Ziels<br />
* targetVelocity: [in] Bewegungsvektor des Ziels<br />
* projectileSpeed: [in] Geschossgeschwindigkeit<br />
* gravity: [in] Gravitationsvektor<br />
* outHitPosition: [out] Position des voraussichtlichen Treffers (absolut)<br />
* outHitTime: [out] Zeitpunkt des voraussichtlichen Treffers<br />
* outShootDir: [out] Richtung, in die das Projektil abgefeuert werden muss<br />
*<br />
* Rückgabewert: true, wenn das Ziel getroffen werden kann,<br />
* false, wenn es nicht getroffen werden kann.<br />
*/<br />
bool computeHitWithGravity(const Vector& shooterPosition,<br />
const Vector& shooterVelocity,<br />
const Vector& targetPosition,<br />
const Vector& targetVelocity,<br />
double projectileSpeed,<br />
const Vector& gravity,<br />
Vector& outHitPosition,<br />
double& outHitTime,<br />
Vector& outShootDir)<br />
{<br />
// Relative Zielposition und -geschwindigkeit berechnen.<br />
const Vector targetRelPosition = targetPosition - shooterPosition;<br />
const Vector targetRelVelocity = targetVelocity - shooterVelocity;<br />
<br />
// Koeffizienten der quartischen Gleichung berechnen.<br />
const double A = 0.25 * gravity.lengthSq();<br />
const double B = -Vector::dot(targetRelVelocity, gravity);<br />
const double C = targetRelVelocity.lengthSq() - projectileSpeed * projectileSpeed - Vector::dot(targetRelPosition, gravity);<br />
const double D = 2 * Vector::dot(targetRelPosition, targetRelVelocity);<br />
const double E = targetRelPosition.lengthSq();<br />
<br />
// Reelle Lösungen der Gleichung bestimmen.<br />
// Wichtig: magnet::math::quarticSolve geht davon aus, dass A = 1 ist.<br />
// Also dividieren wir alle übrigen Koeffizienten durch A.<br />
double r[4];<br />
size_t n = magnet::math::quarticSolve(B / A, C / A, D / A, E / A, r[0], r[1], r[2], r[3]);<br />
<br />
// Gibt es Lösungen?<br />
if(!n)<br />
{<br />
// Keine Lösung - das Ziel kann nicht getroffen werden.<br />
return false;<br />
}<br />
<br />
// Die kleinste positive Lösung suchen.<br />
double smallestPositive = -1.0;<br />
for(size_t i = 0; i < n; i++)<br />
{<br />
if(r[i] > 0.0 &&<br />
(smallestPositive == -1.0 || r[i] < smallestPositive))<br />
{<br />
smallestPositive = r[i];<br />
}<br />
}<br />
<br />
// Gab es überhaupt eine positive Lösung?<br />
if(smallestPositive == -1.0)<br />
{<br />
// Nein - kein Treffer möglich!<br />
return false;<br />
}<br />
<br />
// Wir übernehmen die gefundene Lösung.<br />
const double t = smallestPositive;<br />
<br />
// Ort des Treffers (relativ zum Schützen) berechnen.<br />
const Vector hitRelPosition = targetRelPosition + t * targetRelVelocity;<br />
<br />
// Richtung des Abschusses berechnen.<br />
const Vector shootDir = (hitRelPosition - 0.5 * gravity * t * t) / (projectileSpeed * t);<br />
<br />
// Gefundene Werte ausgeben.<br />
outHitTime = t;<br />
outHitPosition = targetPosition + t * targetVelocity;<br />
outShootDir = shootDir;<br />
<br />
return true;<br />
}<br />
</sourcecode><br />
<br />
== Mögliche Erweiterungen ==<br />
<br />
Wie bereits erwähnt, berücksichtigt das hier vorgestellte Verfahren nicht den Luftwiderstand, der ein Geschoss ständig langsamer werden lässt. Eine andere Erweiterung besteht darin, nicht nur die momentane Geschwindigkeit des Ziels (die erste Ableitung der Position), sondern auch seine momentane Beschleunigung (die zweite Ableitung) in die Berechnung einzubeziehen. Damit würde das Ziel nicht nur garantiert getroffen, wenn es seinen Kurs nicht ändert, sondern es würde ausreichen, dass es seine ''Beschleunigung'' nicht ändert. Solche Erweiterungen führen zu Gleichungen noch höheren Grades, die algebraisch nicht mehr gelöst werden können, sondern nur noch numerisch.<br />
<br />
Eine Alternative zur direkten Berechnung ist die Verwendung von [http://de.wikipedia.org/wiki/Monte-Carlo-Simulation Monte-Carlo-Simulation]. Dabei könnte man die Bewegung des Ziels probabilistisch modellieren, eventuell sogar "intelligent" auf der Basis vergangener Beobachtungen, und so eine Abschussrichtung mit maximaler Trefferwahrscheinlichkeit finden.<br />
<br />
== Einzelnachweise ==<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Zielen_f%C3%BCr_FortgeschritteneZielen für Fortgeschrittene2016-10-19T08:50:23Z<p>David Scherfgen: Code-Referenz aktualisiert</p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Fortgeschrittene]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:Geometrie]]<br />
In fast jedem Computerspiel wird früher oder später das eine oder andere Geschoss abgefeuert. Wenn vom Computer gesteuerte Charaktere, Flugzeuge oder Raumschiffe in der Lage sein sollen, ihre Gegner halbwegs zuverlässig zu treffen, dann sollte man sich Gedanken darüber machen, wie man das Geschoss genau so abfeuert, dass es sein Ziel vermutlich treffen wird.<br />
<br />
Eine Alternative ist, den Geschossen einfach eine unendlich schnelle Geschwindigkeit zu verleihen, so dass die Bewegung des Schützen, des Ziels und des Geschosses und auch die Gravitation keine Rolle mehr spielen. Wer jedoch Wert auf ein Minimum an Realismus legt, der muss all diese Parameter berücksichtigen, denn sonst wird der größte Teil der Schüsse daneben gehen.<br />
<br />
Intuitiv ist klar: Je schneller das Ziel sich relativ zum Schützen bewegt, desto weiter muss er vorhalten, um zu treffen. Aber wie weit genau? Diese Frage lässt sich mit ein wenig Mathematik beantworten. In diesem Artikel wird ein Algorithmus vorgestellt, mit dem das möglich ist.<br />
<br />
== Die Ausgangssituation ==<br />
<br />
Folgende Parameter müssen bekannt sein:<br />
<br />
* Position und Bewegungsvektor (enthält Bewegungsrichtung und Geschwindigkeit) des Schützen<br />
* Position und Bewegungsvektor des Ziels<br />
* Mündungsgeschwindigkeit des Projektils<br />
* Gravitationsvektor<br />
<br />
Wir gehen für die Berechnungen davon aus, dass das Ziel seine Flugrichtung und Geschwindigkeit nicht oder nur geringfügig ändert, während das Projektil seinen Weg zurücklegt. Außerdem soll das Projektil durch die Gravitation ständig nach unten (oder in eine beliebige andere Richtung) gezogen werden, so dass seine Flugbahn keine Gerade, sondern eine ''Parabel'' bildet. Bei der Flugbahn des Ziels gehen wir jedoch von einer geraden Linie aus, da es sich meist um ein Flugzeug oder ein ähnliches Objekt handeln wird, das darauf ausgelegt ist, der Gravitation entgegenzuwirken und in einer geraden Linie mit gleichbleibender Geschwindigkeit zu fliegen. Die Reibung, die das Geschoss durch die Luft erfährt und die es kontinuierlich langsamer werden lässt, wird von dem Algorithmus jedoch nicht berücksichtigt, da die Berechnungen andernfalls viel komplizierter würden. Bei relativ kurzen Entfernungen zum Ziel fällt dieser Umstand nicht allzusehr ins Gewicht.<br />
<br />
Unser Ziel soll es nun sein, aus diesen Parametern die Richtung zu ermitteln, in die das Geschoss abgefeuert werden muss, um zu treffen. Die Abschussgeschwindigkeit ist dabei festgelegt, es geht also nur um die Richtung. Zusätzlich werden wir den voraussichtlichen Ort und den Zeitpunkt des Treffers berechnen.<br />
<br />
== Bezeichnungen ==<br />
<br />
Im Folgenden werden folgende Bezeichnungen für die Parameter verwendet:<br />
<br />
* <math>\vec v_T</math> ist der Bewegungsvektor des Ziels zum Zeitpunkt des Schusses, ''relativ zum Schützen'' (Differenz zwischen Bewegungsvektor des Ziels und der des Schützen). Die Dimension des Vektors spielt keine Rolle (üblich wäre 2 oder 3).<br />
* <math>\vec p_T</math> ist die Position des Ziels zum Zeitpunkt des Schusses, ebenfalls relativ zum Schützen.<br />
* <math>\vec d_H</math> ist die Richtung, in der das Projektil abgefeuert werden muss, um das Ziel zu treffen. Diesen Vektor zu berechnen ist unser Ziel.<br />
* <math>v_0</math> ist die Mündungsgeschwindigkeit des Projektils.<br />
* <math>t</math> bezeichnet allgemein die Zeit, wobei die Schussabgabe zum Zeitpunkt <math>t = 0</math> erfolgt.<br />
<br />
Warum arbeiten wir mit einem relativen Bewegungs- und Positionsvektor? Da wir die Reibung vernachlässigen, macht es beispielsweise keinen Unterschied, ob sich der Schütze mit <math>20 \mathrm{\tfrac{m}{s}}</math> nach links bewegt und das Ziel mit <math>50 \mathrm{\tfrac{m}{s}}</math>, oder ob der Schütze still steht und sich das Ziel mit <math>30 \mathrm{\tfrac{m}{s}}</math> von ihm weg bewegt. Was zählt, ist die Position und die Bewegung des Ziels ''relativ zum Schützen''. Wir betrachten also alles aus seiner Sicht, wobei er den Mittelpunkt der Welt (den Koordinatenursprung) darstellt und alles sich um ihn bewegt. Das vereinfacht die spätere Rechnung.<br />
<br />
== Berechnung des Trefferzeitpunkts ==<br />
<br />
[[Datei:Aufenthaltskreise ohne Gravitation.png|thumb|300px|right|Aufenthaltskreise für t = 1, 2, 3, ..., 10 Sekunden mit einer Mündungsgeschwindigkeit von 50 m/s, ohne Berücksichtigung der Gravitation.]]<br />
<br />
Wir beginnen mit einer Gleichung, die alle Positionen beschreibt, die ein vom Schützen abgefeuertes Projektil zu einem bestimmten Zeitpunkt einnehmen kann. Vernachlässigen wir dabei erst einmal die Gravitation, die das Projektil nach unten zieht.<br />
<br />
Nehmen wir also an, der Schütze würde unendlich viele Geschosse gleichzeitig in alle erdenklichen Richtungen abfeuern. Nach einer Sekunde halten wir das Universum an und betrachten die Positionen der Geschosse. Sie haben in dieser einen Sekunde alle dieselbe Distanz zurückgelegt und befinden sich damit auf einer Kugel (im dreidimensionalen Fall), in deren Mittelpunkt sich der Schütze befindet. Der Radius der Kugel entspricht genau dieser Distanz, und die können wir einfach berechnen, indem wir die vergangene Zeit mit der Geschossgeschwindigkeit multiplizieren, also <math>v_0 \cdot t</math> berechnen. Wenn die Geschosse beispielsweise <math>300 \mathrm{\tfrac{m}{s}}</math> schnell sind, dann hat die Kugel nach einer Sekunde einen Radius von <math>300 \mathrm{m}</math>, nach zwei Sekunden <math>600 \mathrm{m}</math>, nach fünf Sekunden <math>1500 \mathrm{m}</math>, und so weiter. Würden wir die Reibung berücksichtigen, ließe sich der Radius nicht mehr so leicht ausrechnen, da die Geschosse gebremst würden.<br />
<br />
Was haben wir dadurch gewonnen? Wir können jetzt für jeden Zeitpunkt ausrechnen, welche Stellen der Schütze treffen kann. Bei den weiteren Betrachtungen werden wir den zweidimensionalen Fall bevorzugen, da er sich grafisch leichter darstellen lässt. Hier haben wir es nicht mit Kugeln, sondern mit Kreisen zu tun. Für das Verfahren an sich ist es jedoch, wie gesagt, völlig unerheblich, welche Dimension die Vektoren haben.<br />
<br />
Wir wollen diese Kreise von nun an ''Aufenthaltskreise'' nennen, da sie genau die Punkte beschreiben, auf denen sich nach Ablauf einer bestimmten Zeit ein Geschoss befinden kann. Als nächstes müssen diese Kreise mathematisch dargestellt werden. Da wir alles vom Schützen aus betrachten, ist der Mittelpunkt der Kreise jeweils der Koordinatenursprung. Der Radius beträgt <math>v_0 \cdot t</math>, denn dies ist die Distanz, die ein Geschoss in der Zeit <math>t</math> zurücklegt.<br />
<br />
Die Formel für den Aufenthaltskreis zum Zeitpunkt <math>t</math> lautet also:<br />
<br />
: <math>k(t): \vec x^2 = (t \cdot v_0)^2</math><br />
<br />
[[Datei:Aufenthaltskreise mit Gravitation.png|thumb|300px|right|Aufenthaltskreise mit Berücksichtigung der Gravitation.]]<br />
<br />
Wenn wir jetzt die Gravitation mit einbeziehen, dann wird die ursprüngliche gleichförmige Bewegung der Projektile von einer gleichmäßig beschleunigten Bewegung in Richtung des Gravitationsvektors überlagert. Dies hat zur Folge, dass die Kreise nicht mehr konzentrisch sind, sondern sich mit der Zeit nach unten bewegen. Sie werden jedoch nicht gestreckt. Diese Kreise werden nun beschrieben durch:<br />
<br />
: <math>k_G(t): (\vec x - \tfrac{1}{2} \vec g \cdot t^2)^2 = (t \cdot v_0)^2</math><br />
<br />
Wie man in der Abbildung erkennen kann, gibt es keine Möglichkeit, Punkte oberhalb der Grenze von ungefähr <math>y = 140</math> zu treffen, da dort keine Kreise verlaufen. Das liegt daran, dass die Gravitation die Geschosse daran hindert, höher zu steigen. Die Projektile verlieren ihre vertikale Geschwindigkeit nach oben und gehen in den Fall über. Eine höhere Mündungsgeschwindigkeit <math>v_0</math> würde die Reichweite vergrößern.<br />
<br />
Betrachten wir nun die geradlinige Bewegung des Ziels. Dessen Position zum Zeitpunkt <math>t</math> lässt sich ganz leicht wie folgt berechnen:<br />
<br />
: <math>\vec x(t) = \vec p_T + t \cdot \vec v_T</math><br />
<br />
Diese Gleichung beschreibt eine einfache Gerade. Wir wollen jetzt den Zeitpunkt <math>t_H</math> ermitteln, zu dem ein Projektil das Ziel treffen kann, um dann später daraus die Abschussrichtung zu berechnen. Zu dem gesuchten Zeitpunkt <math>t_H</math> muss sich das Ziel also genau auf dem dazugehörigen Aufenthaltskreis <math>k_G(t_H)</math> befinden, denn dieser Kreis beschreibt alle möglichen Orte, an denen sich ein Projektil zu diesem Zeitpunkt befinden kann. Um den Zeitpunkt berechnen zu können, müssen wir die beiden Gleichungen ineinander einsetzen:<br />
<br />
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math><br />
<br />
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende quartische Gleichung:<br />
<br />
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math><br />
<br />
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für quartische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:<br />
<br />
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).<br />
# Es gibt mindestens eine positive reelle Lösung. Das heißt, dass es eine oder mehrere Möglichkeiten gibt, wie das Projektil abgefeuert werden könnte, so dass es das Ziel irgendwann trifft. Manche dieser Möglichkeiten könnten etwas ungewöhnlich erscheinen, würde man sie in die Tat umsetzen. Der Schütze würde das Geschoss beispielsweise im hohen Bogen auf das Ziel befördern, obwohl es sich direkt vor ihm befindet (eine solche Lösung wäre dann interessant, wenn der direkte Weg zum Ziel durch ein Hindernis versperrt ist). Negative Lösungen sind deswegen uninteressant, da die Lösungen schließlich für den voraussichtlichen Trefferzeitpunkt stehen, und ein negativer Wert würde bedeuten, dass das Ziel in der Vergangenheit getroffen wurde.<br />
<br />
Für unsere Zwecke sind wir daher an der ''kleinsten positiven Lösung'' dieser Gleichung interessiert, denn mit dieser Lösung bleibt dem Ziel die kürzeste Zeit zum Ausweichen.<br />
<br />
== Wohin zielen? ==<br />
<br />
Wenn wir die kleinste positive Lösung <math>t_H</math> gefunden haben, können wir als nächstes den Ort des Treffers <math>\vec p_H</math> berechnen (immer relativ zum Schützen). Dazu müssen wir nur <math>t_H</math> in die Gleichung für die Flugbahn des Ziels einsetzen:<br />
<br />
: <math>\vec p_H = \vec p_T + t_H \cdot \vec v_T</math><br />
<br />
Damit kennen wir den Ort und den Zeitpunkt eines möglichen Treffers, aber wir kennen noch nicht die Richtung <math>\vec d_H</math>, in die das Projektil vom Schützen abgefeuert werden muss, damit es zu diesem Treffer kommen kann. Glücklicherweise ist das nun nicht mehr besonders schwierig. Zuerst stellen wir eine Gleichung für die Flugbahn des Geschosses relativ zum Schützen auf, wenn es von ihm in die Richtung <math>\vec d</math> abgeschossen wurde:<br />
<br />
: <math>\vec x(t) = \vec d \cdot v_0 \cdot t + \tfrac{1}{2} \vec g \cdot t^2</math><br />
<br />
Die Bewegung des Geschosses besteht also aus zwei Bewegungen, die sich überlagern: Die Komponente <math>\vec d \cdot v_0 \cdot t</math> ist die gleichförmige Bewegung, die das Geschoss durch den Abschuss erhalten hat, und <math>\tfrac{1}{2} \vec g \cdot t^2</math> ist die gleichmäßig beschleunigte Bewegung, die es durch die Gravitation erfährt.<br />
<br />
Da wir vorhin bereits den Zeitpunkt des Treffers <math>t_H</math> und auch den Ort <math>\vec p_H</math> berechnet haben, können wir beides in die Gleichung einsetzen und nach <math>\vec d</math> auflösen:<br />
<br />
: <math>\begin{align}<br />
\vec x(t_H) &= \vec p_H \\<br />
\vec d \cdot v_0 \cdot t_H + \tfrac{1}{2} \vec g \cdot {t_H}^2 &= \vec p_H \\<br />
\vec d &= \frac{\vec p_H - \tfrac{1}{2} \vec g \cdot {t_H}^2}{v_0 \cdot t_H}<br />
\end{align}</math><br />
<br />
Mit dem Vektor <math>\vec d</math> kennen wir jetzt die Richtung, in die der Schütze von sich aus gesehen das Geschoss abfeuern muss, um das Ziel (wahrscheinlich) zu treffen. Dieser Vektor ist automatisch normiert, hat also die Länge 1. Da wir bei allen Überlegungen die Position und die Bewegung des Schützen nicht benötigt haben, weil wir mit relativen Positionen und Geschwindigkeiten gearbeitet haben, müssen wir, um den endgültigen ''absoluten'' Bewegungsvektor <math>\vec v_P</math> des Projektils zu erhalten, den Bewegungsvektor <math>\vec v_S</math> des Schützen wieder hinzuaddieren:<br />
<br />
: <math>\vec v_P = \vec v_S + \vec d \cdot v_0</math><br />
<br />
== Implementierung in C++ ==<br />
<br />
In der folgenden Beispielimplementierung wird zum Lösen der quartischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[https://github.com/toastedcrumpets/DynamO/blob/master/src/magnet/magnet/math/quartic.hpp ''dynamo - Event driven molecular dynamics simulator'']. Marcus Bannerman. 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).<br />
<br />
<sourcecode lang=cpp tab=4><br />
/* Parameter:<br />
* ----------<br />
* shooterPosition: [in] Position des Schützen<br />
* shooterVelocity: [in] Bewegungsvektor des Schützen<br />
* targetPosition: [in] Position des Ziels<br />
* targetVelocity: [in] Bewegungsvektor des Ziels<br />
* projectileSpeed: [in] Geschossgeschwindigkeit<br />
* gravity: [in] Gravitationsvektor<br />
* outHitPosition: [out] Position des voraussichtlichen Treffers (absolut)<br />
* outHitTime: [out] Zeitpunkt des voraussichtlichen Treffers<br />
* outShootDir: [out] Richtung, in die das Projektil abgefeuert werden muss<br />
*<br />
* Rückgabewert: true, wenn das Ziel getroffen werden kann,<br />
* false, wenn es nicht getroffen werden kann.<br />
*/<br />
bool computeHitWithGravity(const Vector& shooterPosition,<br />
const Vector& shooterVelocity,<br />
const Vector& targetPosition,<br />
const Vector& targetVelocity,<br />
double projectileSpeed,<br />
const Vector& gravity,<br />
Vector& outHitPosition,<br />
double& outHitTime,<br />
Vector& outShootDir)<br />
{<br />
// Relative Zielposition und -geschwindigkeit berechnen.<br />
const Vector targetRelPosition = targetPosition - shooterPosition;<br />
const Vector targetRelVelocity = targetVelocity - shooterVelocity;<br />
<br />
// Koeffizienten der quartischen Gleichung berechnen.<br />
const double A = 0.25 * gravity.lengthSq();<br />
const double B = -Vector::dot(targetRelVelocity, gravity);<br />
const double C = targetRelVelocity.lengthSq() - projectileSpeed * projectileSpeed - Vector::dot(targetRelPosition, gravity);<br />
const double D = 2 * Vector::dot(targetRelPosition, targetRelVelocity);<br />
const double E = targetRelPosition.lengthSq();<br />
<br />
// Reelle Lösungen der Gleichung bestimmen.<br />
// Wichtig: magnet::math::quarticSolve geht davon aus, dass A = 1 ist.<br />
// Also dividieren wir alle übrigen Koeffizienten durch A.<br />
double r[4];<br />
size_t n = magnet::math::quarticSolve(B / A, C / A, D / A, E / A, r[0], r[1], r[2], r[3]);<br />
<br />
// Gibt es Lösungen?<br />
if(!n)<br />
{<br />
// Keine Lösung - das Ziel kann nicht getroffen werden.<br />
return false;<br />
}<br />
<br />
// Die kleinste positive Lösung suchen.<br />
double smallestPositive = -1.0;<br />
for(size_t i = 0; i < n; i++)<br />
{<br />
if(r[i] > 0.0 &&<br />
(smallestPositive == -1.0 || r[i] < smallestPositive))<br />
{<br />
smallestPositive = r[i];<br />
}<br />
}<br />
<br />
// Gab es überhaupt eine positive Lösung?<br />
if(smallestPositive == -1.0)<br />
{<br />
// Nein - kein Treffer möglich!<br />
return false;<br />
}<br />
<br />
// Wir übernehmen die gefundene Lösung.<br />
const double t = smallestPositive;<br />
<br />
// Ort des Treffers (relativ zum Schützen) berechnen.<br />
const Vector hitRelPosition = targetRelPosition + t * targetRelVelocity;<br />
<br />
// Richtung des Abschusses berechnen.<br />
const Vector shootDir = (hitRelPosition - 0.5 * gravity * t * t) / (projectileSpeed * t);<br />
<br />
// Gefundene Werte ausgeben.<br />
outHitTime = t;<br />
outHitPosition = targetPosition + t * targetVelocity;<br />
outShootDir = shootDir;<br />
<br />
return true;<br />
}<br />
</sourcecode><br />
<br />
== Mögliche Erweiterungen ==<br />
<br />
Wie bereits erwähnt, berücksichtigt das hier vorgestellte Verfahren nicht den Luftwiderstand, der ein Geschoss ständig langsamer werden lässt. Eine andere Erweiterung besteht darin, nicht nur die momentane Geschwindigkeit des Ziels (die erste Ableitung der Position), sondern auch seine momentane Beschleunigung (die zweite Ableitung) in die Berechnung einzubeziehen. Damit würde das Ziel nicht nur garantiert getroffen, wenn es seinen Kurs nicht ändert, sondern es würde ausreichen, dass es seine ''Beschleunigung'' nicht ändert. Solche Erweiterungen führen zu Gleichungen noch höheren Grades, die algebraisch nicht mehr gelöst werden können, sondern nur noch numerisch.<br />
<br />
Eine Alternative zur direkten Berechnung ist die Verwendung von [http://de.wikipedia.org/wiki/Monte-Carlo-Simulation Monte-Carlo-Simulation]. Dabei könnte man die Bewegung des Ziels probabilistisch modellieren, eventuell sogar "intelligent" auf der Basis vergangener Beobachtungen, und so eine Abschussrichtung mit maximaler Trefferwahrscheinlichkeit finden.<br />
<br />
== Einzelnachweise ==<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Zielen_f%C3%BCr_FortgeschritteneZielen für Fortgeschrittene2016-10-19T08:43:05Z<p>David Scherfgen: "biquadratisch" durch "quartisch" ersetzt</p>
<hr />
<div>[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Fortgeschrittene]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:Geometrie]]<br />
In fast jedem Computerspiel wird früher oder später das eine oder andere Geschoss abgefeuert. Wenn vom Computer gesteuerte Charaktere, Flugzeuge oder Raumschiffe in der Lage sein sollen, ihre Gegner halbwegs zuverlässig zu treffen, dann sollte man sich Gedanken darüber machen, wie man das Geschoss genau so abfeuert, dass es sein Ziel vermutlich treffen wird.<br />
<br />
Eine Alternative ist, den Geschossen einfach eine unendlich schnelle Geschwindigkeit zu verleihen, so dass die Bewegung des Schützen, des Ziels und des Geschosses und auch die Gravitation keine Rolle mehr spielen. Wer jedoch Wert auf ein Minimum an Realismus legt, der muss all diese Parameter berücksichtigen, denn sonst wird der größte Teil der Schüsse daneben gehen.<br />
<br />
Intuitiv ist klar: Je schneller das Ziel sich relativ zum Schützen bewegt, desto weiter muss er vorhalten, um zu treffen. Aber wie weit genau? Diese Frage lässt sich mit ein wenig Mathematik beantworten. In diesem Artikel wird ein Algorithmus vorgestellt, mit dem das möglich ist.<br />
<br />
== Die Ausgangssituation ==<br />
<br />
Folgende Parameter müssen bekannt sein:<br />
<br />
* Position und Bewegungsvektor (enthält Bewegungsrichtung und Geschwindigkeit) des Schützen<br />
* Position und Bewegungsvektor des Ziels<br />
* Mündungsgeschwindigkeit des Projektils<br />
* Gravitationsvektor<br />
<br />
Wir gehen für die Berechnungen davon aus, dass das Ziel seine Flugrichtung und Geschwindigkeit nicht oder nur geringfügig ändert, während das Projektil seinen Weg zurücklegt. Außerdem soll das Projektil durch die Gravitation ständig nach unten (oder in eine beliebige andere Richtung) gezogen werden, so dass seine Flugbahn keine Gerade, sondern eine ''Parabel'' bildet. Bei der Flugbahn des Ziels gehen wir jedoch von einer geraden Linie aus, da es sich meist um ein Flugzeug oder ein ähnliches Objekt handeln wird, das darauf ausgelegt ist, der Gravitation entgegenzuwirken und in einer geraden Linie mit gleichbleibender Geschwindigkeit zu fliegen. Die Reibung, die das Geschoss durch die Luft erfährt und die es kontinuierlich langsamer werden lässt, wird von dem Algorithmus jedoch nicht berücksichtigt, da die Berechnungen andernfalls viel komplizierter würden. Bei relativ kurzen Entfernungen zum Ziel fällt dieser Umstand nicht allzusehr ins Gewicht.<br />
<br />
Unser Ziel soll es nun sein, aus diesen Parametern die Richtung zu ermitteln, in die das Geschoss abgefeuert werden muss, um zu treffen. Die Abschussgeschwindigkeit ist dabei festgelegt, es geht also nur um die Richtung. Zusätzlich werden wir den voraussichtlichen Ort und den Zeitpunkt des Treffers berechnen.<br />
<br />
== Bezeichnungen ==<br />
<br />
Im Folgenden werden folgende Bezeichnungen für die Parameter verwendet:<br />
<br />
* <math>\vec v_T</math> ist der Bewegungsvektor des Ziels zum Zeitpunkt des Schusses, ''relativ zum Schützen'' (Differenz zwischen Bewegungsvektor des Ziels und der des Schützen). Die Dimension des Vektors spielt keine Rolle (üblich wäre 2 oder 3).<br />
* <math>\vec p_T</math> ist die Position des Ziels zum Zeitpunkt des Schusses, ebenfalls relativ zum Schützen.<br />
* <math>\vec d_H</math> ist die Richtung, in der das Projektil abgefeuert werden muss, um das Ziel zu treffen. Diesen Vektor zu berechnen ist unser Ziel.<br />
* <math>v_0</math> ist die Mündungsgeschwindigkeit des Projektils.<br />
* <math>t</math> bezeichnet allgemein die Zeit, wobei die Schussabgabe zum Zeitpunkt <math>t = 0</math> erfolgt.<br />
<br />
Warum arbeiten wir mit einem relativen Bewegungs- und Positionsvektor? Da wir die Reibung vernachlässigen, macht es beispielsweise keinen Unterschied, ob sich der Schütze mit <math>20 \mathrm{\tfrac{m}{s}}</math> nach links bewegt und das Ziel mit <math>50 \mathrm{\tfrac{m}{s}}</math>, oder ob der Schütze still steht und sich das Ziel mit <math>30 \mathrm{\tfrac{m}{s}}</math> von ihm weg bewegt. Was zählt, ist die Position und die Bewegung des Ziels ''relativ zum Schützen''. Wir betrachten also alles aus seiner Sicht, wobei er den Mittelpunkt der Welt (den Koordinatenursprung) darstellt und alles sich um ihn bewegt. Das vereinfacht die spätere Rechnung.<br />
<br />
== Berechnung des Trefferzeitpunkts ==<br />
<br />
[[Datei:Aufenthaltskreise ohne Gravitation.png|thumb|300px|right|Aufenthaltskreise für t = 1, 2, 3, ..., 10 Sekunden mit einer Mündungsgeschwindigkeit von 50 m/s, ohne Berücksichtigung der Gravitation.]]<br />
<br />
Wir beginnen mit einer Gleichung, die alle Positionen beschreibt, die ein vom Schützen abgefeuertes Projektil zu einem bestimmten Zeitpunkt einnehmen kann. Vernachlässigen wir dabei erst einmal die Gravitation, die das Projektil nach unten zieht.<br />
<br />
Nehmen wir also an, der Schütze würde unendlich viele Geschosse gleichzeitig in alle erdenklichen Richtungen abfeuern. Nach einer Sekunde halten wir das Universum an und betrachten die Positionen der Geschosse. Sie haben in dieser einen Sekunde alle dieselbe Distanz zurückgelegt und befinden sich damit auf einer Kugel (im dreidimensionalen Fall), in deren Mittelpunkt sich der Schütze befindet. Der Radius der Kugel entspricht genau dieser Distanz, und die können wir einfach berechnen, indem wir die vergangene Zeit mit der Geschossgeschwindigkeit multiplizieren, also <math>v_0 \cdot t</math> berechnen. Wenn die Geschosse beispielsweise <math>300 \mathrm{\tfrac{m}{s}}</math> schnell sind, dann hat die Kugel nach einer Sekunde einen Radius von <math>300 \mathrm{m}</math>, nach zwei Sekunden <math>600 \mathrm{m}</math>, nach fünf Sekunden <math>1500 \mathrm{m}</math>, und so weiter. Würden wir die Reibung berücksichtigen, ließe sich der Radius nicht mehr so leicht ausrechnen, da die Geschosse gebremst würden.<br />
<br />
Was haben wir dadurch gewonnen? Wir können jetzt für jeden Zeitpunkt ausrechnen, welche Stellen der Schütze treffen kann. Bei den weiteren Betrachtungen werden wir den zweidimensionalen Fall bevorzugen, da er sich grafisch leichter darstellen lässt. Hier haben wir es nicht mit Kugeln, sondern mit Kreisen zu tun. Für das Verfahren an sich ist es jedoch, wie gesagt, völlig unerheblich, welche Dimension die Vektoren haben.<br />
<br />
Wir wollen diese Kreise von nun an ''Aufenthaltskreise'' nennen, da sie genau die Punkte beschreiben, auf denen sich nach Ablauf einer bestimmten Zeit ein Geschoss befinden kann. Als nächstes müssen diese Kreise mathematisch dargestellt werden. Da wir alles vom Schützen aus betrachten, ist der Mittelpunkt der Kreise jeweils der Koordinatenursprung. Der Radius beträgt <math>v_0 \cdot t</math>, denn dies ist die Distanz, die ein Geschoss in der Zeit <math>t</math> zurücklegt.<br />
<br />
Die Formel für den Aufenthaltskreis zum Zeitpunkt <math>t</math> lautet also:<br />
<br />
: <math>k(t): \vec x^2 = (t \cdot v_0)^2</math><br />
<br />
[[Datei:Aufenthaltskreise mit Gravitation.png|thumb|300px|right|Aufenthaltskreise mit Berücksichtigung der Gravitation.]]<br />
<br />
Wenn wir jetzt die Gravitation mit einbeziehen, dann wird die ursprüngliche gleichförmige Bewegung der Projektile von einer gleichmäßig beschleunigten Bewegung in Richtung des Gravitationsvektors überlagert. Dies hat zur Folge, dass die Kreise nicht mehr konzentrisch sind, sondern sich mit der Zeit nach unten bewegen. Sie werden jedoch nicht gestreckt. Diese Kreise werden nun beschrieben durch:<br />
<br />
: <math>k_G(t): (\vec x - \tfrac{1}{2} \vec g \cdot t^2)^2 = (t \cdot v_0)^2</math><br />
<br />
Wie man in der Abbildung erkennen kann, gibt es keine Möglichkeit, Punkte oberhalb der Grenze von ungefähr <math>y = 140</math> zu treffen, da dort keine Kreise verlaufen. Das liegt daran, dass die Gravitation die Geschosse daran hindert, höher zu steigen. Die Projektile verlieren ihre vertikale Geschwindigkeit nach oben und gehen in den Fall über. Eine höhere Mündungsgeschwindigkeit <math>v_0</math> würde die Reichweite vergrößern.<br />
<br />
Betrachten wir nun die geradlinige Bewegung des Ziels. Dessen Position zum Zeitpunkt <math>t</math> lässt sich ganz leicht wie folgt berechnen:<br />
<br />
: <math>\vec x(t) = \vec p_T + t \cdot \vec v_T</math><br />
<br />
Diese Gleichung beschreibt eine einfache Gerade. Wir wollen jetzt den Zeitpunkt <math>t_H</math> ermitteln, zu dem ein Projektil das Ziel treffen kann, um dann später daraus die Abschussrichtung zu berechnen. Zu dem gesuchten Zeitpunkt <math>t_H</math> muss sich das Ziel also genau auf dem dazugehörigen Aufenthaltskreis <math>k_G(t_H)</math> befinden, denn dieser Kreis beschreibt alle möglichen Orte, an denen sich ein Projektil zu diesem Zeitpunkt befinden kann. Um den Zeitpunkt berechnen zu können, müssen wir die beiden Gleichungen ineinander einsetzen:<br />
<br />
: <math>\left((\vec p_T + t_H \cdot \vec v_T) - \tfrac{1}{2} \vec g \cdot {t_H}^2\right)^2 = (t_H \cdot v_0)^2</math><br />
<br />
Jetzt muss diese Gleichung nach <math>t_H</math> aufgelöst werden. Die Arbeit besteht im Wesentlichen im Ausmultiplizieren der Quadrate. Wenn man anschließend die verschiedenen Potenzen von <math>t_H</math> ausklammert, ergibt sich folgende quartische Gleichung:<br />
<br />
: <math>{t_H}^4 \cdot (\tfrac{1}{4} \vec g^2) + {t_H}^3 \cdot (-\vec v_T \cdot \vec g) + {t_H}^2 \cdot (\vec {v_T}^2 - {v_0}^2 - \vec p_T \cdot \vec g) + t_H \cdot (2 \vec p_T \cdot \vec v_T) + \vec {p_T}^2 = 0</math><br />
<br />
So wie es die "pq-Formel" zum Lösen quadratischer Gleichungen gibt, existieren auch für quartische Gleichungen direkte Lösungsverfahren, allerdings sind diese bei weitem nicht so einfach. Wir nehmen für den Moment einmal an, dass wir die Gleichung bereits lösen können. Dann können folgende Fälle auftreten:<br />
<br />
# Die Gleichung besitzt keine positive reelle Lösung. Für unseren Fall bedeutet das, dass das Ziel schlichtweg nicht getroffen werden kann, sofern es seinen momentanen Kurs beibehält (und auf dieser Annahme beruht das Verfahren).<br />
# Es gibt mindestens eine positive reelle Lösung. Das heißt, dass es eine oder mehrere Möglichkeiten gibt, wie das Projektil abgefeuert werden könnte, so dass es das Ziel irgendwann trifft. Manche dieser Möglichkeiten könnten etwas ungewöhnlich erscheinen, würde man sie in die Tat umsetzen. Der Schütze würde das Geschoss beispielsweise im hohen Bogen auf das Ziel befördern, obwohl es sich direkt vor ihm befindet (eine solche Lösung wäre dann interessant, wenn der direkte Weg zum Ziel durch ein Hindernis versperrt ist). Negative Lösungen sind deswegen uninteressant, da die Lösungen schließlich für den voraussichtlichen Trefferzeitpunkt stehen, und ein negativer Wert würde bedeuten, dass das Ziel in der Vergangenheit getroffen wurde.<br />
<br />
Für unsere Zwecke sind wir daher an der ''kleinsten positiven Lösung'' dieser Gleichung interessiert, denn mit dieser Lösung bleibt dem Ziel die kürzeste Zeit zum Ausweichen.<br />
<br />
== Wohin zielen? ==<br />
<br />
Wenn wir die kleinste positive Lösung <math>t_H</math> gefunden haben, können wir als nächstes den Ort des Treffers <math>\vec p_H</math> berechnen (immer relativ zum Schützen). Dazu müssen wir nur <math>t_H</math> in die Gleichung für die Flugbahn des Ziels einsetzen:<br />
<br />
: <math>\vec p_H = \vec p_T + t_H \cdot \vec v_T</math><br />
<br />
Damit kennen wir den Ort und den Zeitpunkt eines möglichen Treffers, aber wir kennen noch nicht die Richtung <math>\vec d_H</math>, in die das Projektil vom Schützen abgefeuert werden muss, damit es zu diesem Treffer kommen kann. Glücklicherweise ist das nun nicht mehr besonders schwierig. Zuerst stellen wir eine Gleichung für die Flugbahn des Geschosses relativ zum Schützen auf, wenn es von ihm in die Richtung <math>\vec d</math> abgeschossen wurde:<br />
<br />
: <math>\vec x(t) = \vec d \cdot v_0 \cdot t + \tfrac{1}{2} \vec g \cdot t^2</math><br />
<br />
Die Bewegung des Geschosses besteht also aus zwei Bewegungen, die sich überlagern: Die Komponente <math>\vec d \cdot v_0 \cdot t</math> ist die gleichförmige Bewegung, die das Geschoss durch den Abschuss erhalten hat, und <math>\tfrac{1}{2} \vec g \cdot t^2</math> ist die gleichmäßig beschleunigte Bewegung, die es durch die Gravitation erfährt.<br />
<br />
Da wir vorhin bereits den Zeitpunkt des Treffers <math>t_H</math> und auch den Ort <math>\vec p_H</math> berechnet haben, können wir beides in die Gleichung einsetzen und nach <math>\vec d</math> auflösen:<br />
<br />
: <math>\begin{align}<br />
\vec x(t_H) &= \vec p_H \\<br />
\vec d \cdot v_0 \cdot t_H + \tfrac{1}{2} \vec g \cdot {t_H}^2 &= \vec p_H \\<br />
\vec d &= \frac{\vec p_H - \tfrac{1}{2} \vec g \cdot {t_H}^2}{v_0 \cdot t_H}<br />
\end{align}</math><br />
<br />
Mit dem Vektor <math>\vec d</math> kennen wir jetzt die Richtung, in die der Schütze von sich aus gesehen das Geschoss abfeuern muss, um das Ziel (wahrscheinlich) zu treffen. Dieser Vektor ist automatisch normiert, hat also die Länge 1. Da wir bei allen Überlegungen die Position und die Bewegung des Schützen nicht benötigt haben, weil wir mit relativen Positionen und Geschwindigkeiten gearbeitet haben, müssen wir, um den endgültigen ''absoluten'' Bewegungsvektor <math>\vec v_P</math> des Projektils zu erhalten, den Bewegungsvektor <math>\vec v_S</math> des Schützen wieder hinzuaddieren:<br />
<br />
: <math>\vec v_P = \vec v_S + \vec d \cdot v_0</math><br />
<br />
== Implementierung in C++ ==<br />
<br />
In der folgenden Beispielimplementierung wird zum Lösen der quartischen Gleichung die Funktion <tt>magnet::math::quarticSolve</tt> verwendet, deren Implementierung unter der unten angegebenen Referenz<ref>[http://marcusbannerman.co.uk/index.php/component/content/article/42-articles/87-quartic-and-cubic-root-finder-in-c.html ''Quartic and cubic root finder in C++'']. Marcus Bannerman. MarcusBannerman.co.uk. 11. Oktober 2011.</ref> zu finden ist. Es wird außerdem davon ausgegangen, dass <tt>Vector</tt> eine Vektorklasse ist, auf der die üblichen Operationen definiert sind. Die statische Methode <tt>dot</tt> muss das Skalarprodukt zweier Vektoren berechnen, die Methode <tt>lengthSq()</tt> das Quadrat der Vektorlänge (das Skalarprodukt mit sich selbst).<br />
<br />
<sourcecode lang=cpp tab=4><br />
/* Parameter:<br />
* ----------<br />
* shooterPosition: [in] Position des Schützen<br />
* shooterVelocity: [in] Bewegungsvektor des Schützen<br />
* targetPosition: [in] Position des Ziels<br />
* targetVelocity: [in] Bewegungsvektor des Ziels<br />
* projectileSpeed: [in] Geschossgeschwindigkeit<br />
* gravity: [in] Gravitationsvektor<br />
* outHitPosition: [out] Position des voraussichtlichen Treffers (absolut)<br />
* outHitTime: [out] Zeitpunkt des voraussichtlichen Treffers<br />
* outShootDir: [out] Richtung, in die das Projektil abgefeuert werden muss<br />
*<br />
* Rückgabewert: true, wenn das Ziel getroffen werden kann,<br />
* false, wenn es nicht getroffen werden kann.<br />
*/<br />
bool computeHitWithGravity(const Vector& shooterPosition,<br />
const Vector& shooterVelocity,<br />
const Vector& targetPosition,<br />
const Vector& targetVelocity,<br />
double projectileSpeed,<br />
const Vector& gravity,<br />
Vector& outHitPosition,<br />
double& outHitTime,<br />
Vector& outShootDir)<br />
{<br />
// Relative Zielposition und -geschwindigkeit berechnen.<br />
const Vector targetRelPosition = targetPosition - shooterPosition;<br />
const Vector targetRelVelocity = targetVelocity - shooterVelocity;<br />
<br />
// Koeffizienten der quartischen Gleichung berechnen.<br />
const double A = 0.25 * gravity.lengthSq();<br />
const double B = -Vector::dot(targetRelVelocity, gravity);<br />
const double C = targetRelVelocity.lengthSq() - projectileSpeed * projectileSpeed - Vector::dot(targetRelPosition, gravity);<br />
const double D = 2 * Vector::dot(targetRelPosition, targetRelVelocity);<br />
const double E = targetRelPosition.lengthSq();<br />
<br />
// Reelle Lösungen der Gleichung bestimmen.<br />
// Wichtig: magnet::math::quarticSolve geht davon aus, dass A = 1 ist.<br />
// Also dividieren wir alle übrigen Koeffizienten durch A.<br />
double r[4];<br />
size_t n = magnet::math::quarticSolve(B / A, C / A, D / A, E / A, r[0], r[1], r[2], r[3]);<br />
<br />
// Gibt es Lösungen?<br />
if(!n)<br />
{<br />
// Keine Lösung - das Ziel kann nicht getroffen werden.<br />
return false;<br />
}<br />
<br />
// Die kleinste positive Lösung suchen.<br />
double smallestPositive = -1.0;<br />
for(size_t i = 0; i < n; i++)<br />
{<br />
if(r[i] > 0.0 &&<br />
(smallestPositive == -1.0 || r[i] < smallestPositive))<br />
{<br />
smallestPositive = r[i];<br />
}<br />
}<br />
<br />
// Gab es überhaupt eine positive Lösung?<br />
if(smallestPositive == -1.0)<br />
{<br />
// Nein - kein Treffer möglich!<br />
return false;<br />
}<br />
<br />
// Wir übernehmen die gefundene Lösung.<br />
const double t = smallestPositive;<br />
<br />
// Ort des Treffers (relativ zum Schützen) berechnen.<br />
const Vector hitRelPosition = targetRelPosition + t * targetRelVelocity;<br />
<br />
// Richtung des Abschusses berechnen.<br />
const Vector shootDir = (hitRelPosition - 0.5 * gravity * t * t) / (projectileSpeed * t);<br />
<br />
// Gefundene Werte ausgeben.<br />
outHitTime = t;<br />
outHitPosition = targetPosition + t * targetVelocity;<br />
outShootDir = shootDir;<br />
<br />
return true;<br />
}<br />
</sourcecode><br />
<br />
== Mögliche Erweiterungen ==<br />
<br />
Wie bereits erwähnt, berücksichtigt das hier vorgestellte Verfahren nicht den Luftwiderstand, der ein Geschoss ständig langsamer werden lässt. Eine andere Erweiterung besteht darin, nicht nur die momentane Geschwindigkeit des Ziels (die erste Ableitung der Position), sondern auch seine momentane Beschleunigung (die zweite Ableitung) in die Berechnung einzubeziehen. Damit würde das Ziel nicht nur garantiert getroffen, wenn es seinen Kurs nicht ändert, sondern es würde ausreichen, dass es seine ''Beschleunigung'' nicht ändert. Solche Erweiterungen führen zu Gleichungen noch höheren Grades, die algebraisch nicht mehr gelöst werden können, sondern nur noch numerisch.<br />
<br />
Eine Alternative zur direkten Berechnung ist die Verwendung von [http://de.wikipedia.org/wiki/Monte-Carlo-Simulation Monte-Carlo-Simulation]. Dabei könnte man die Bewegung des Ziels probabilistisch modellieren, eventuell sogar "intelligent" auf der Basis vergangener Beobachtungen, und so eine Abschussrichtung mit maximaler Trefferwahrscheinlichkeit finden.<br />
<br />
== Einzelnachweise ==<br />
<br />
<references /></div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2016-04-20T07:28:21Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* '''Achte auf fremdes Urheberrecht. "Fan-Projekte", die unerlaubt Markennamen verwenden, Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/SFML_Einsteiger-TippsSFML Einsteiger-Tipps2015-11-02T13:05:26Z<p>David Scherfgen: Rückgabewert vergessen</p>
<hr />
<div><br />
Beim Lernen von C++ wird unter anderem gern auf SFML zurückgegriffen, weil man damit spielerisch die Welt von C++ erkunden kann und nicht auf die Konsole angewiesen ist. SFML bietet diverse Klassen zur einfachen Erstellung von Fenstern, Anzeige von Grafiken, Abspielen von Sounds, Verwendung von Netzwerk und mehr. Doch oft sind diese Dinge mit höherem Verständnis von C++ verknüpft als es zunächst den Anschein hat. SFML setzt voraus, dass der C++ Entwickler die grundlegenden Konzepte von Speicherverwaltung, Konstruktoren und Destruktoren, sowie Pointern und Referenzen verstanden hat. So lauern bei der Verwendung von SFML einige Fallstricke, die man beachten muss.<br />
<br />
<div class="warning"><br />
'''Bitte beachte, dass viele Beispiele hier zeigen, wie man es nicht machen sollte!'''<br />
</div><br />
<br />
== Fehler #1: Falsche Verwendung von sf::Texture ==<br />
Dieses Problem ist eines der häufigsten, welches sich bei Einsteigern findet. Da das Wissen um Pointer und Referenzen noch nicht gefestigt wurde, wird zu simplen Values gegriffen, was dann zu Fehlern führt.<br />
=== Textur als einfacher Member ===<br />
Der einfachste Fall, der bei falscher Verwendung von Texturen auftritt, führt einfach nur zu massiver Speicher- und CPU-Belastung. Dabei wird die Textur oft als Member einer Klasse deklariert, wie z.B. wie folgt:<br />
<sourcecode lang="cpp" tab="4"><br />
class Player<br />
{<br />
sf::Texture m_Texture;<br />
sf::Sprite m_Image;<br />
<br />
public:<br />
Player()<br />
{<br />
m_Texture.loadFromFile("player.png");<br />
m_Image = sf::Sprite(m_Texture);<br />
}<br />
<br />
void draw(sf::RenderTarget& target)<br />
{<br />
target.draw(m_Image);<br />
}<br />
...<br />
};<br />
</sourcecode><br />
Auf den ersten Blick wirkt diese Klasse in sich abgeschlossen. Doch was passiert, wenn diese Klasse nun über Funktionen hin und her gereicht wird? Zum Beispiel so:<br />
<sourcecode lang="cpp" tab="4"><br />
void drawGame(Player player1, Player player2)<br />
{<br />
player1.draw();<br />
player2.draw();<br />
}<br />
...<br />
Player player1, player2;<br />
...<br />
drawGame(player1, player2);<br />
</sourcecode><br />
Wird dieser Code ausgeführt, wird man schnell merken, dass die Aufrufe recht lange dauern. Doch warum? Nun, player1 und player2 werden als Wert (pass by value) übergeben und dabei kopiert. Um Kopien von einem Player zu erzeugen, legt der Compiler einen Kopierkonstruktor an. Dabei kopiert wird für jede Player-Instanz das Sprite und die Textur kopiert. Im Endeffekt heißt das, dass das Bild von der Grafikkarte heruntergeladen, eine Kopie des Bilds erzeugt und diese Kopie wieder an die Grafikkarte hochgeladen werden muss. Man kann sich leicht vorstellen, dass das eine sehr aufwendige Operation ist. Zudem ist sie auch noch überflüssig, denn nun gibt es jede Textur zweimal auf der Grafikkarte. Das verbraucht natürlich auch doppelten Video-Speicher. Dazu kommt noch, dass die Kopien der Sprites noch immer eine Referenz auf die originale Textur benutzen. Die Kopien werden also zwar angelegt, aber von gar keinem Sprite verwendet. Am Ende der update-Funktion werden diese Kopien wieder von der Grafikkarte gelöscht. Also haufenweise Arbeit für nichts. Mit Übergabe als Referenz wäre das Problem nicht aufgetreten.<br />
=== Crash durch Referenzen und Kopierkonstruktor ===<br />
Richtig schlimm wird es, wenn die referenzierte Textur gelöscht wird. Man stelle sich dazu z.B. eine Funktion vor, die einen neuen Spieler erstellt und ihn auf eine gewisse Startposition setzt oder gewisse andere Dinge an ihm ändert:<br />
<sourcecode lang="cpp" tab="4"><br />
Player createPlayer(int health)<br />
{<br />
Player playerTemp;<br />
playerTemp.setPosition(0, 0);<br />
playerTemp.setHealth(health);<br />
return playerTemp;<br />
}<br />
...<br />
Player player1 = createPlayer(100);<br />
...<br />
player.draw(window);<br />
</sourcecode><br />
Auf den ersten Blick sieht das gar nicht so schlecht aus. Man hat eine Funktion, die schön gewisse Logik kapselt. Das Ergebnis ist ein Absturz des Programms. Was ist passiert? Die Spieler wurde korrekt in createPlayer erstellt und gewisse Initialwerte zugewiesen. Dann wurde er zurückgegeben und zugewiesen. Dabei wird allerdings wieder der Kopierkonstruktor von playerTemp gerufen. Den kennen wir schon aus dem vorherigen Beispiel. Der Kopierkonstruktor macht jedoch eine wichtige Sache nicht, er sagt dem Sprite nicht, dass es die kopierte Textur verwenden soll. Das Sprite von player1 zeigt also ebenfalls auf die originale Textur von playerTemp. Wird die Funktion verlassen und player neu zugewiesen, wird allerdings die alte Player-Instanz (playerTemp), nicht mehr gebraucht. Sie wurde ja kopiert in player1. Also wird sie zerstört. Und mit ihr auch die original Textur aus playerTemp. Das beutet, dass das Sprite in player1 nun eine Textur referenziert, die gar nicht mehr existiert. Zugriffe auf nicht existente Objekte verursachen diverse Fehler. Der Crash ist hier noch der beste Fall. Richtig fies ist, dass der Crash nicht unbedingt beim Aufruf von player.draw() erfolgen muss. Er kann auch wesentlich später erst eintreten, wo die Ursache des Fehlers nicht mehr nachvollziehbar ist.<br />
<br />
=== Kopierte Texturen als Fehler deklarieren ===<br />
Damit solche Fehler nicht unterlaufen können und bei der versehentlichen Kopie einer Textur gleich eine Fehlermeldung kommt, bietet es sich an eine eigene Textur-Klasse zu verwenden:<br />
<sourcecode lang="cpp" tab="4"><br />
class NCTexture : public sf::Texture, private sf::NonCopyable<br />
{<br />
};<br />
</sourcecode><br />
Diese Klasse verhält sich in allen Belangen wie eine übliche SFML-Textur, mit dem Unterschied, dass sie sich nicht versehentlich kopieren lässt. Versucht man es dennoch, bekommt man vom Compiler eine entsprechende Fehlermeldung. Dann muss man dieses Problem durch Referenzen und Pointer entsprechend auflösen. Es muss nur überall dort, wo normalerweise sf::Texture verwendet werden würde stattdessen die NCTexture verwenden.<br />
=== Mehrfaches Laden und Textur-Cache ===<br />
Das initiale Beispiel der Player-Klasse hat ein weiteres Problem, was dem Kopieren von Texturen relativ ähnlich ist. Folgendes Beispiel:<br />
<sourcecode lang="cpp" tab="4"><br />
Player player1, player2, player3;<br />
</sourcecode><br />
Hier werden drei Spieler erzeugt. Damit auch auch die Textur dreimal geladen. Das dauert dreimal so lange und benötigt auch dreimal so viel Speicher. Eine Lösung dazu ergibt sich durch Verwendung von Referenzen und einer zentralen Stelle, die sich um das Laden von Texturen kümmert. Man kann also z.B. eine TexturCache Klasse bauen, die alle Texturen des Spiels kennt und sie beim Start alle einmal lädt. Sie könnte dann eine Methode anbieten, über die man eine Referenz auf die jeweils gewünschte Textur geliefert bekommen könnte. Diese Referenz kann man nun im Konstruktor von Player entsprechend übergeben:<br />
<sourcecode lang="cpp" tab="4"><br />
class Player<br />
{<br />
const sf::Texture& m_Texture;<br />
sf::Sprite m_Image;<br />
<br />
public:<br />
Player(const NCTexture& texture) : m_Texture(texture)<br />
{<br />
m_Image = sf::Sprite(m_Texture);<br />
}<br />
...<br />
};<br />
...<br />
Player player1(texturCache.getRedPlayerTexture());<br />
Player player2(texturCache.getRedPlayerTexture());<br />
Player player3(texturCache.getGreenPlayerTexture());<br />
</sourcecode><br />
Wird nun ein Player kopiert, ist das alles gar kein Problem mehr, denn alle Spieler verwenden eine Referenz auf ein und dieselbe Textur, die nur einmalig im System geladen und im Speicher abgelegt wurde. Die Erstellung einer entsprechenden TexturCache-Klasse wird dem geneigten Leser als Übung überlassen.</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Spiele_programmieren_lernenSpiele programmieren lernen2015-08-20T14:18:10Z<p>David Scherfgen: /* Ein simples Spiel zum Aufwärmen */</p>
<hr />
<div>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.<br />
<br />
== Was braucht es, um Spieleprogrammierer zu werden? ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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).<br />
<br />
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!<br />
<br />
== Was ist ein realistisches Ziel? ==<br />
<br />
[[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.]]<br />
<br />
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.''<br />
<br />
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?<br />
<br />
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.<br />
<br />
== Die Wahl der Programmiersprache ==<br />
<br />
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).<br />
<br />
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.<br />
<br />
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:<br />
<br />
; Komfort und Einsteigerfreundlichkeit<br />
: 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.<br />
: 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.<br />
<br />
; Verfügbarkeit von Werkzeugen und Bibliotheken<br />
: 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.<br />
: 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).<br />
<br />
; Effizienz<br />
: 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.<br />
<br />
=== C++ ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 C++.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C++-Spielprojekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="cpp" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
#include <iostream><br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
int fakultaet(int n) {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw std::domain_error("Fakultät für negative Zahlen ist nicht definiert!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultaet(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
int main() {<br />
// Begrüßung<br />
std::cout << "Hallo Spieleprogrammierer!" << std::endl;<br />
std::cout << "Gib eine Zahl ein! ";<br />
<br />
// Zahl einlesen.<br />
int zahl;<br />
std::cin >> zahl;<br />
<br />
// Quadrat der Zahl ausgeben.<br />
std::cout << "Das Quadrat von " << zahl << " ist: " << (zahl * zahl) << std::endl;<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
std::cout << "Die Fakultät von " << zahl << " ist: " << fakultaet(zahl) << std::endl;<br />
}<br />
catch(const std::exception& e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
std::cout << "Fehler: " << e.what() << std::endl;<br />
}<br />
<br />
return 0; // Ende des Programms<br />
}<br />
</sourcecode><br />
<br />
=== C# ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 CSharp.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C#-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="csharp"><br />
// Benötigte Bibliothek einbinden.<br />
using System;<br />
<br />
namespace CSharpBeispielprogramm<br />
{<br />
class Program<br />
{<br />
// Die Hauptfunktion "Main":<br />
// Hier startet das eigentliche Programm.<br />
static void Main(string[] args)<br />
{<br />
// Begrüßung<br />
Console.WriteLine("Hallo Spieleprogrammierer!");<br />
Console.Write("Gib eine Zahl ein! ");<br />
<br />
// Zahl einlesen<br />
int zahl = int.Parse(Console.In.ReadLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
Console.WriteLine("Das Quadrat von {0} ist: {1}", zahl, zahl * zahl);<br />
<br />
try<br />
{<br />
// Fakultät der Zahl ausgeben.<br />
Console.WriteLine("Die Fakultät von {0} ist: {1}", zahl, fakultät(zahl));<br />
}<br />
catch (Exception e)<br />
{<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
Console.WriteLine("Fehler: {0}", e);<br />
}<br />
}<br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n)<br />
{<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if (n < 0) throw new ArgumentOutOfRangeException("n", "Darf nicht negativ sein!");<br />
<br />
if (n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Java ===<br />
<br />
[[Datei:Screenshot Eclipse Java.png|thumb|right|Screenshot der Entwicklungsumgebung ''Eclipse'' mit einem Java-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="java" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
import java.io.*;<br />
<br />
public class JavaBeispielprogramm {<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n) throws Exception {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw new Exception("n darf nicht negativ sein!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
public static void main(String[] args) throws Exception {<br />
// Begrüßung<br />
System.out.println("Hallo Spieleprogrammierer!");<br />
System.out.print("Gib eine Zahl ein: ");<br />
<br />
// Zahl einlesen.<br />
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />
int zahl = Integer.parseInt(in.readLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
System.out.println("Das Quadrat von " + zahl + " ist: " + (zahl * zahl));<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
System.out.println("Die Fakultät von " + zahl + " ist: " + fakultät(zahl));<br />
}<br />
catch(Exception e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
System.out.println("Fehler: " + e.toString());<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Python ===<br />
<br />
[[Datei:Screenshot Aptana Studio 3 Python.png|thumb|right|Screenshot der Entwicklungsumgebung ''Aptana Studio 3'' mit einem Python-Projekt.]]<br />
<br />
[[Datei:Screenshot IDLE.png|thumb|right|Screenshot der minimalistischen Entwicklungsumgebung ''IDLE'' für Python.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="python"><br />
# Die folgende Funktion berechnet n!, die Fakultät von n.<br />
<br />
def fakultaet(n):<br />
# Signalisiere einen Fehler, wenn n negativ ist.<br />
if n < 0: raise ValueError("n darf nicht negativ sein!")<br />
elif n == 0: return 1 # 0! = 1<br />
else: return n * fakultaet(n - 1) # Rekursion: n! = n * (n - 1)!<br />
<br />
# Hier startet das eigentliche Programm.<br />
print("Hallo Spieleprogrammierer!") # Begrüßung<br />
zahl = input("Gib eine Zahl ein: ") # Zahl einlesen.<br />
<br />
# Quadrat der Zahl ausgeben.<br />
print("Das Quadrat von %d ist: %d" % (zahl, zahl * zahl))<br />
try:<br />
# Fakultät der Zahl ausgeben.<br />
print("Die Fakultät von %d ist: %d" % (zahl, fakultaet(zahl)))<br />
except Exception as e:<br />
# Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
print("Fehler: %s" % e)<br />
</sourcecode><br />
<br />
== Lernen einer Programmiersprache ==<br />
<br />
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.<br />
<br />
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:<br />
<br />
* Versuche möglichst regelmäßig zu lernen. Nur so bleibst du am Ball.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
* Bearbeite eventuell angebotene Übungsaufgaben, und vergleiche sie ggf. mit den vom Autor vorgeschlagenen Lösungen.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
=== Lektüre für C++ ===<br />
<br />
<xh4>C++-Bücher</xh4><br />
<br />
* {{Amazon|3446432167|"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.<br />
<br />
<xh4>C++-Tutorials</xh4><br />
<br />
* [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).<br />
<br />
* [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.<br />
<br />
* 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].<br />
<br />
=== Lektüre für C# ===<br />
<br />
<xh4>C#-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>C#-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Java ===<br />
<br />
<xh4>Java-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
* [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.<br />
<br />
<xh4>Java-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Python ===<br />
<br />
<xh4>Python-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>Python-Tutorials</xh4><br />
<br />
* [http://docs.python.org/tutorial/ "The Python Tutorial"]: Das offizielle, sehr umfangreiche Python-Tutorial.<br />
<br />
* [https://py-tutorial-de.readthedocs.org/de/python-3.3/ "Das Python-Tutorial"]: Eine deutsche Übersetzung des offiziellen Python-Tutorials.<br />
<br />
== Auswahl einer passenden Bibliothek ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Eine kleine Übersicht ===<br />
<br />
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.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Bibliothek !! Sprachen !! Kurzbeschreibung !! Weiterführende Links<br />
|-<br />
| [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. ||<br />
* [http://www.sfml-dev.org/tutorials/ Tutorials]<br />
* [http://www.sfml-dev.org/documentation/ Dokumentation]<br />
|-<br />
| [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. ||<br />
* [[SDL-Tutorial]]<br />
* [http://wiki.libsdl.org/moin.cgi/SDL1.2Tutorials Weitere Tutorials]<br />
* [http://www.libsdl.org/cgi/docwiki.cgi Dokumentation]<br />
|-<br />
| [http://pygame.org/ Pygame] || Python || Pygame basiert auf SDL, bietet aber noch zusätzliche Funktionalität. ||<br />
* [[Pygame-Tutorial]]<br />
* [http://www.pygame.org/docs/ Dokumentation und weitere Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://alleg.sourceforge.net/docs.html Tutorials]<br />
* [http://alleg.sourceforge.net/api.html Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://msdn.microsoft.com/en-us/bb188199 Tutorials und Video-Tutorials]<br />
* [http://msdn.microsoft.com/en-us/library/bb200104.aspx Weitere Einführungen und Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://hge.relishgames.com/doc/?tutorials__main.html Tutorials]<br />
* [http://hge.relishgames.com/doc/ Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://slick.cokeandcode.com/wiki/doku.php Dokumentation und Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://code.google.com/p/libgdx/wiki/TableOfContents?tm=6 Dokumentation und Tutorials]<br />
|}<br />
<br />
=== Erste Schritte mit einer Bibliothek zur Spieleprogrammierung ===<br />
<br />
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.<br />
<br />
== Spiele programmieren ==<br />
<br />
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.<br />
<br />
=== Ein simples Spiel zum Aufwärmen ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Kritischer Rückblick und die nächsten Spiele ===<br />
<br />
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.<br />
<br />
* Welche Aspekte des Spiels haben Spaß gemacht, welche nicht? Woran könnte das gelegen haben?<br />
* War das Spiel zu schwer oder zu leicht?<br />
* War die Steuerung intuitiv?<br />
* Wusste man immer, was man zu tun hat?<br />
* 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]).<br />
<br />
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.<br />
<br />
=== Wie geht es weiter? ===<br />
<br />
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?<br />
<br />
''Viel Erfolg!''<br />
<br />
[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Einsteiger]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:C-Sharp]]<br />
[[Kategorie:Java]]<br />
[[Kategorie:Python]]</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/Spiele_programmieren_lernenSpiele programmieren lernen2015-08-20T14:16:01Z<p>David Scherfgen: /* Lektüre für Python */</p>
<hr />
<div>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.<br />
<br />
== Was braucht es, um Spieleprogrammierer zu werden? ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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).<br />
<br />
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!<br />
<br />
== Was ist ein realistisches Ziel? ==<br />
<br />
[[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.]]<br />
<br />
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.''<br />
<br />
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?<br />
<br />
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.<br />
<br />
== Die Wahl der Programmiersprache ==<br />
<br />
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).<br />
<br />
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.<br />
<br />
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:<br />
<br />
; Komfort und Einsteigerfreundlichkeit<br />
: 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.<br />
: 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.<br />
<br />
; Verfügbarkeit von Werkzeugen und Bibliotheken<br />
: 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.<br />
: 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).<br />
<br />
; Effizienz<br />
: 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.<br />
<br />
=== C++ ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 C++.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C++-Spielprojekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="cpp" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
#include <iostream><br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
int fakultaet(int n) {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw std::domain_error("Fakultät für negative Zahlen ist nicht definiert!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultaet(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
int main() {<br />
// Begrüßung<br />
std::cout << "Hallo Spieleprogrammierer!" << std::endl;<br />
std::cout << "Gib eine Zahl ein! ";<br />
<br />
// Zahl einlesen.<br />
int zahl;<br />
std::cin >> zahl;<br />
<br />
// Quadrat der Zahl ausgeben.<br />
std::cout << "Das Quadrat von " << zahl << " ist: " << (zahl * zahl) << std::endl;<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
std::cout << "Die Fakultät von " << zahl << " ist: " << fakultaet(zahl) << std::endl;<br />
}<br />
catch(const std::exception& e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
std::cout << "Fehler: " << e.what() << std::endl;<br />
}<br />
<br />
return 0; // Ende des Programms<br />
}<br />
</sourcecode><br />
<br />
=== C# ===<br />
<br />
[[Datei:Screenshot Visual Studio 2008 CSharp.png|thumb|right|Screenshot der Entwicklungsumgebung ''Microsoft Visual Studio 2008'' mit einem C#-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="csharp"><br />
// Benötigte Bibliothek einbinden.<br />
using System;<br />
<br />
namespace CSharpBeispielprogramm<br />
{<br />
class Program<br />
{<br />
// Die Hauptfunktion "Main":<br />
// Hier startet das eigentliche Programm.<br />
static void Main(string[] args)<br />
{<br />
// Begrüßung<br />
Console.WriteLine("Hallo Spieleprogrammierer!");<br />
Console.Write("Gib eine Zahl ein! ");<br />
<br />
// Zahl einlesen<br />
int zahl = int.Parse(Console.In.ReadLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
Console.WriteLine("Das Quadrat von {0} ist: {1}", zahl, zahl * zahl);<br />
<br />
try<br />
{<br />
// Fakultät der Zahl ausgeben.<br />
Console.WriteLine("Die Fakultät von {0} ist: {1}", zahl, fakultät(zahl));<br />
}<br />
catch (Exception e)<br />
{<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
Console.WriteLine("Fehler: {0}", e);<br />
}<br />
}<br />
<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n)<br />
{<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if (n < 0) throw new ArgumentOutOfRangeException("n", "Darf nicht negativ sein!");<br />
<br />
if (n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Java ===<br />
<br />
[[Datei:Screenshot Eclipse Java.png|thumb|right|Screenshot der Entwicklungsumgebung ''Eclipse'' mit einem Java-Projekt.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="java" tab="4"><br />
// Benötigte Bibliothek einbinden.<br />
import java.io.*;<br />
<br />
public class JavaBeispielprogramm {<br />
// Die folgende Funktion berechnet n!, die Fakultät von n.<br />
private static int fakultät(int n) throws Exception {<br />
// Signalisiere einen Fehler, wenn n negativ ist.<br />
if(n < 0) throw new Exception("n darf nicht negativ sein!");<br />
<br />
if(n == 0) return 1; // 0! = 1<br />
else return n * fakultät(n - 1); // Rekursion: n! = n * (n - 1)!<br />
}<br />
<br />
// Die Hauptfunktion "main":<br />
// Hier startet das eigentliche Programm.<br />
public static void main(String[] args) throws Exception {<br />
// Begrüßung<br />
System.out.println("Hallo Spieleprogrammierer!");<br />
System.out.print("Gib eine Zahl ein: ");<br />
<br />
// Zahl einlesen.<br />
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br />
int zahl = Integer.parseInt(in.readLine());<br />
<br />
// Quadrat der Zahl ausgeben.<br />
System.out.println("Das Quadrat von " + zahl + " ist: " + (zahl * zahl));<br />
<br />
try {<br />
// Fakultät der Zahl ausgeben.<br />
System.out.println("Die Fakultät von " + zahl + " ist: " + fakultät(zahl));<br />
}<br />
catch(Exception e) {<br />
// Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
System.out.println("Fehler: " + e.toString());<br />
}<br />
}<br />
}<br />
</sourcecode><br />
<br />
=== Python ===<br />
<br />
[[Datei:Screenshot Aptana Studio 3 Python.png|thumb|right|Screenshot der Entwicklungsumgebung ''Aptana Studio 3'' mit einem Python-Projekt.]]<br />
<br />
[[Datei:Screenshot IDLE.png|thumb|right|Screenshot der minimalistischen Entwicklungsumgebung ''IDLE'' für Python.]]<br />
<br />
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.<br />
<br />
<sourcecode lang="python"><br />
# Die folgende Funktion berechnet n!, die Fakultät von n.<br />
<br />
def fakultaet(n):<br />
# Signalisiere einen Fehler, wenn n negativ ist.<br />
if n < 0: raise ValueError("n darf nicht negativ sein!")<br />
elif n == 0: return 1 # 0! = 1<br />
else: return n * fakultaet(n - 1) # Rekursion: n! = n * (n - 1)!<br />
<br />
# Hier startet das eigentliche Programm.<br />
print("Hallo Spieleprogrammierer!") # Begrüßung<br />
zahl = input("Gib eine Zahl ein: ") # Zahl einlesen.<br />
<br />
# Quadrat der Zahl ausgeben.<br />
print("Das Quadrat von %d ist: %d" % (zahl, zahl * zahl))<br />
try:<br />
# Fakultät der Zahl ausgeben.<br />
print("Die Fakultät von %d ist: %d" % (zahl, fakultaet(zahl)))<br />
except Exception as e:<br />
# Ein Fehler ist aufgetreten. Gib die Fehlermeldung aus.<br />
print("Fehler: %s" % e)<br />
</sourcecode><br />
<br />
== Lernen einer Programmiersprache ==<br />
<br />
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.<br />
<br />
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:<br />
<br />
* Versuche möglichst regelmäßig zu lernen. Nur so bleibst du am Ball.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
* Bearbeite eventuell angebotene Übungsaufgaben, und vergleiche sie ggf. mit den vom Autor vorgeschlagenen Lösungen.<br />
<br />
* 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.<br />
<br />
* 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.<br />
<br />
=== Lektüre für C++ ===<br />
<br />
<xh4>C++-Bücher</xh4><br />
<br />
* {{Amazon|3446432167|"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.<br />
<br />
<xh4>C++-Tutorials</xh4><br />
<br />
* [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).<br />
<br />
* [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.<br />
<br />
* 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].<br />
<br />
=== Lektüre für C# ===<br />
<br />
<xh4>C#-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>C#-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Java ===<br />
<br />
<xh4>Java-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
* [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.<br />
<br />
<xh4>Java-Tutorials</xh4><br />
<br />
* [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.<br />
<br />
* [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.<br />
<br />
=== Lektüre für Python ===<br />
<br />
<xh4>Python-Bücher</xh4><br />
<br />
* {{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.<br />
<br />
<xh4>Python-Tutorials</xh4><br />
<br />
* [http://docs.python.org/tutorial/ "The Python Tutorial"]: Das offizielle, sehr umfangreiche Python-Tutorial.<br />
<br />
* [https://py-tutorial-de.readthedocs.org/de/python-3.3/ "Das Python-Tutorial"]: Eine deutsche Übersetzung des offiziellen Python-Tutorials.<br />
<br />
== Auswahl einer passenden Bibliothek ==<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Eine kleine Übersicht ===<br />
<br />
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.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Bibliothek !! Sprachen !! Kurzbeschreibung !! Weiterführende Links<br />
|-<br />
| [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. ||<br />
* [http://www.sfml-dev.org/tutorials/ Tutorials]<br />
* [http://www.sfml-dev.org/documentation/ Dokumentation]<br />
|-<br />
| [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. ||<br />
* [[SDL-Tutorial]]<br />
* [http://wiki.libsdl.org/moin.cgi/SDL1.2Tutorials Weitere Tutorials]<br />
* [http://www.libsdl.org/cgi/docwiki.cgi Dokumentation]<br />
|-<br />
| [http://pygame.org/ Pygame] || Python || Pygame basiert auf SDL, bietet aber noch zusätzliche Funktionalität. ||<br />
* [[Pygame-Tutorial]]<br />
* [http://www.pygame.org/docs/ Dokumentation und weitere Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://alleg.sourceforge.net/docs.html Tutorials]<br />
* [http://alleg.sourceforge.net/api.html Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://msdn.microsoft.com/en-us/bb188199 Tutorials und Video-Tutorials]<br />
* [http://msdn.microsoft.com/en-us/library/bb200104.aspx Weitere Einführungen und Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://hge.relishgames.com/doc/?tutorials__main.html Tutorials]<br />
* [http://hge.relishgames.com/doc/ Dokumentation]<br />
|-<br />
| [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. ||<br />
* [http://slick.cokeandcode.com/wiki/doku.php Dokumentation und Tutorials]<br />
|-<br />
| [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. ||<br />
* [http://code.google.com/p/libgdx/wiki/TableOfContents?tm=6 Dokumentation und Tutorials]<br />
|}<br />
<br />
=== Erste Schritte mit einer Bibliothek zur Spieleprogrammierung ===<br />
<br />
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.<br />
<br />
== Spiele programmieren ==<br />
<br />
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.<br />
<br />
=== Ein simples Spiel zum Aufwärmen ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
Eine gute Idee ist es, dein erstes Spiel der Spieleprogrammierer-Community ([http://www.spieleprogrammierer.de/12-projekte-workshops/ 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.<br />
<br />
=== Kritischer Rückblick und die nächsten Spiele ===<br />
<br />
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.<br />
<br />
* Welche Aspekte des Spiels haben Spaß gemacht, welche nicht? Woran könnte das gelegen haben?<br />
* War das Spiel zu schwer oder zu leicht?<br />
* War die Steuerung intuitiv?<br />
* Wusste man immer, was man zu tun hat?<br />
* 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]).<br />
<br />
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.<br />
<br />
=== Wie geht es weiter? ===<br />
<br />
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?<br />
<br />
''Viel Erfolg!''<br />
<br />
[[Kategorie:Tutorial]]<br />
[[Kategorie:Für Einsteiger]]<br />
[[Kategorie:C++]]<br />
[[Kategorie:C-Sharp]]<br />
[[Kategorie:Java]]<br />
[[Kategorie:Python]]</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-05-11T12:39:00Z<p>David Scherfgen: /* Schlechtes Beispiel */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute f�r mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils sp�ter wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-05-11T12:38:18Z<p>David Scherfgen: /* Schlechtes Beispiel */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdr�ckne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur sch�ler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gew�hnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das f�rdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-01-31T17:31:18Z<p>David Scherfgen: /* Seriosität und Professionalität */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch einigermaßen realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdrückne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur schüler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gewöhnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das fürdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-01-31T17:30:43Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Gib an, für welche Aufgabenbereiche du noch Mitarbeiter suchst, und welche Fähigkeiten bzw. wie viel Erfahrung sie mitbringen sollen.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdrückne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur schüler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gewöhnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das fürdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-01-31T17:27:50Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Beschreibe das Spiel ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdrückne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur schüler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gewöhnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das fürdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2015-01-29T10:16:31Z<p>David Scherfgen: /* Die wichtigsten Regeln kurzgefasst */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
* '''Achte auf fremdes Urheberrecht. Links zu illegalen Downloads und eingebettete Bilder/Videos gehören dazu, und die Moderatoren und Administratoren sind in der Pflicht diese zu entfernen. Bilder, Texturen, Modelle oder Musik aus anderen Spielen ungefragt zu verwenden, ist nach deutschen Gesetzen strafbar.'''<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* '''Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.'''<br />
* Beschreibe die Spielidee ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdrückne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur schüler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gewöhnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das fürdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/ProjektvorstellungProjektvorstellung2014-11-21T17:14:12Z<p>David Scherfgen: /* Fortschritt */</p>
<hr />
<div>Sowohl bei der Suche nach Mitstreitern für ein Projekt als auch für das Bekanntmachen eines Projekts benötigt man eine gute Vorstellung, die nicht nur Informationen über das Projekt an sich liefert, sondern das Interesse des Lesers weckt.<br />
<br />
Nachfolgend werden einige Punkte genannt, die man bei einer Projektvorstellung beachten sollte. Insbesondere bezieht sich dieser Artikel auf den Fall, dass du für dein Projekt noch Mitarbeiter suchst. Es handelt sich um Empfehlungen der Forenmitglieder, die auf vielen im Forum vorgestellten Projekten (sowohl gute als auch schlechte) und den Erfahrungen der Mitglieder basieren.<br />
<br />
== Die wichtigsten Regeln kurzgefasst ==<br />
<br />
* Achte auf Rechtschreibung und Grammatik!<br />
* Formatiere und strukturiere deinen Beitrag ordentlich!<br />
* Gib dem Thema einen sinnvollen Betreff, nicht z. B. "Projekt"!<br />
* Stelle dich selbst vor, bevor du dein Projekt vorstellst: Wer bist du, was machst du, was kannst du?<br />
* Zeige den Fortschritt des Projekts in Form von Zeichnungen, Screenshots, Videos oder Demos.<br />
* Gehe stets freundlich auf Feedback ein, auch wenn es kritisch oder negativ ist.<br />
<br />
<br />
Wenn du ein Projekt vorstellst, für das du noch Mitarbeiter suchst:<br />
<br />
* Wenn du nur die Idee beitragen kannst, keine Bezahlung anbieten kannst und keine Erfahrung mit der Spieleentwicklung hast, dann spare dir die Mühe.<br />
* Beschreibe die Spielidee ausführlich! Hab keine Angst, dass jemand deine Idee klaut!<br />
* Erläutere, wie sich dein Spiel von anderen Spielen unterscheidet.<br />
* Mache Angaben über eine mögliche Bezahlung der Mitarbeiter.<br />
* Achte auf die "Machbarkeit" deiner Projektidee. Ohne jahrelange Vorerfahrung ein Spiel mit den Ausmaßen von World of Warcraft allein mit unbezahlten Hobbyentwicklern auf die Beine zu stellen, ist beispielsweise nicht machbar, und die Idee würde von niemandem ernst genommen.<br />
<br />
== Seriosität und Professionalität ==<br />
<br />
Gerade bei größeren oder gar kommerziellen Projekten ist es wichtig einen seriösen und professionellen ersten Eindruck zu erwecken. Wenn du Mitarbeiter für dein Projekt suchst, ist es wichtig, die Leser davon zu überzeugen, dass du es ernst meinst, dir alles gut überlegt hast und auch weißt, was du tust.<br />
<br />
Achte auf eine ordentliche Formatierung, Strukturierung, Rechtschreibung und Grammatik. Im Zweifelsfall kann man immer eine Rechtschreibhilfe verwenden. Ein Beitrag, in dem zahlreiche Fehler zu finden sind, wirkt hastig und achtlos geschrieben und erweckt den Eindruck, dass der Autor es nicht wirklich ernst meint.<br />
<br />
Sei objektiv, was dein Projekt angeht, auch bezüglich der Machbarkeit. Sei vorsichtig mit Superlativen wie "''Dieses Projekt wird alles Vorherige in den Schatten stellen!''". Wenn du einen Zeitrahmen für die Umsetzung des Projekts angibst, dann sollte dieser auch realistisch sein.<br />
<br />
== Informationen über das Team/den Präsentator ==<br />
<br />
Wenn man eine Präsentation vor Leuten hält, die man nicht kennt, ist es eine Sache der Höflichkeit, sich kurz vorzustellen. Dazu gehört nicht nur der eigene Name und das Alter, sondern auch eine kurze Zusammenfassung dessen, womit man sich bisher beschäftigt hat. Dies gilt nicht nur bei Präsentationen im echten Leben, sondern auch im Internet. Wichtig ist dabei, dass man den Leser nicht zu sehr mit unwichtigen Details belästigt (es interessiert eher weniger, ob du früher einmal in einem Fast Food-Restaurant Brötchen belegt hast).<br />
<br />
Relevant sind Informationen über dich selbst, die im direkten Zusammenhang mit dem Projekt stehen. Hierzu zählt beispielsweise die berufliche Erfahrung, sollte diese in diese Richtung gehen, sowie angeeignetes Wissen, welches für das Projekt relevant ist. Weniger relevant, aber für den Leser ganz angenehm zu lesen, sind andere Informationen über dich selbst, wie dein Name, Alter, Wohnort – ggf. relevant für Treffen – oder auch, wie du zu diesem Projekt gekommen bist und warum du selbst so begeistert davon bist.<br />
<br />
Wenn du nicht alleine an dem Projekt arbeitest, sondern bereits den einen oder anderen gefunden hast, dann solltest du auch grob anreißen, wie viele Personen schon dabei sind und welche Aufgaben diese übernehmen.<br />
<br />
Einen guten Eindruck macht es grundsätzlich, wenn bereits etwas gezeigt werden kann. Das muss nicht nur den Spielinhalt betreffen, sondern kann auch eigene Arbeiten einschließen. Wenn du bereits dabei bist ein Portfolio aufzubauen, dann kannst du dies als Referenz für die eigenen Fähigkeiten verwenden. Zu beachten ist dabei nur, dass das Projekt an sich im Vordergrund steht und du selbst nur einer der Akteure bist, die daran mitwirken.<br />
<br />
== Verschweigen von Informationen ==<br />
<br />
Vielleicht zögerst du, gewisse Informationen über dein Projekt offenzulegen, insbesondere die Details der Spielidee. Möglicherweise befürchtest du, dass jemand deine Idee stehlen könnte. Tatsächlich ist es aber so, dass eine Idee an sich noch nichts bedeutet, da die Umsetzung der Idee wesentlich wichtiger ist. Weiterhin ist es wahrscheinlich, dass du deine eigene Idee stark überschätzt, was völlig normal ist. Jeder findet seine Ideen hervorragend und um vieles besser als die der Anderen. Im Umkehrschluss heißt das aber auch, dass die Leser der Vorstellung meist auch schon längst eigene Ideen haben, die sie i. d. R. besser als die von dir vorgestellte Idee finden. Wenn du also jemanden überzeugen möchtest, an deinem Projekt mitzuarbeiten anstatt seine eigenen Ideen zu verfolgen, dann funktioniert das nicht mit einer Floskel wie "''Details können jetzt noch nicht bekanntgegeben werden!''"<br />
<br />
Ein anderer Grund für das Verschweigen von Details könnte sein, dass du noch nicht weit genug in der Konzipierung bist und keine halbfertige Idee anbieten möchtest. Dies ist ein durchaus nachvollziehbarer Grund, aber wenn dies zutrifft, dann solltest du lieber noch etwas länger an der Idee feilen, bevor du sie präsentierst.<br />
<br />
== Spielidee ==<br />
<br />
Das Wichtigste an einem Projekt ist die Idee, die dahinter steckt. Wie funktioniert die Spielmechanik? Was macht das Projekt einzigartig im Gegensatz zu der Vielzahl der anderen?<br />
<br />
Das Genre des Spiels ist von großer Bedeutung. Wenn es ein innovatives Genre oder eine Mischung verschiedener Genres ist, welche es in der Form noch nicht oder selten gegeben hat, ist es sehr wahrscheinlich, dass bereits dadurch ein gewisses Interesse geweckt wird. Sollte es jedoch wieder einmal ein Shooter oder MMORPG werden, kann man alleine dadurch nicht punkten.<br />
<br />
Weitere Themen, die du adressieren kannst:<br />
* In welcher Welt spielt das Spiel?<br />
* Welche Charaktere/Figuren gibt es?<br />
* Wie wird der Spieler mit der Spielwelt interagieren können? (Gegenstände, Waffen, Fahrzeuge, Aktionen)<br />
* Gibt es eine Hintergrundgeschichte? Wenn ja, welche?<br />
<br />
== Technische Umsetzung ==<br />
<br />
Da es sich bei dem vorgestellten Projekt in aller Regel um ein Computer- oder in besonderen Fällen um ein Konsolenspiel handelt, ist es notwendig, es zu programmieren. Für ein solches Spiel sind auch alleine für die technische Umsetzung sehr viele Überlegungen zu treffen. Abhängig davon, was für eine Art von Spiel es ist, ob es also beispielsweise ein Spiel im Browser oder ein nativ laufendes Spiel ist, hängt auch die Wahl der Programmiersprache und davon wiederum die Wahl des Frameworks ab, sofern eins verwendet wird. Zu diesen Punkten sollte man sich in der Regel schon bei Projektbeginn seine Gedanken gemacht haben, welche man auf jeden Fall präsentieren sollte, wenn man Programmierer sucht. Davon hängt für den Programmierer ab, ob er bereits über die benötigten Kenntnisse verfügt oder erst eine entsprechende Programmiersprache lernen muss.<br />
<br />
Neben der Sprache und dem Framework bzw. der Engine kann auch schon festgelegt worden sein, mit welchen Programmen gearbeitet werden soll. So könnten IDE oder andere Editoren, das Versionsverwaltungssystem oder Ähnliches bestimmt sein und sollte somit vorgestellt werden.<br />
<br />
Sollte die Vorstellung in unserem Forum gemacht werden, kann man davon ausgehen, dass ein gesteigertes Interesse an der Implementierung besteht. Es ist zwar nicht zwingend erforderlich, genauer ins Detail zu gehen, allerdings dürften Dinge, wie die verwendeten Entwurfsmuster und der Grund für die Entscheidung für diese oder die grobe Struktur des Systems für die Leser interessant sein.<br />
<br />
== Fortschritt ==<br />
<br />
Wenn es bereits etwas zu zeigen gibt, solltest du dies auf jeden Fall zeigen, da Bilder sprichwörtlich mehr sagen als tausend Worte. Das können Konzeptzeichnungen, Screenshots, Videos oder vielleicht sogar schon eine Demo-Version sein. Wenn das Projekt bereits läuft, solltest du regelmäßig Neuigkeiten liefern und aufzeigen, an welchen Bereichen gerade gearbeitet wird. Die Aktivität eines Projekts zeugt von der Motivation der Leute, die daran arbeiten. Wenn es eine Webseite zum Projekt gibt, solltest du diese natürlich auch angeben.<br />
<br />
Mach es den potenziell Interessierten so einfach wie möglich, dein Spiel/Programm zu testen, wenn das bereits möglich ist. Viele schrecken davor zurück, einen Installer herunterzuladen und auszuführen. Unity bietet beispielsweise mit dem Web Player die Möglichkeit, dein Spiel direkt im Browser zu spielen. Bei JavaScript-basierten Spielen bietet es sich an, es auf einer öffentlichen Website zur Verfügung zu stellen.<br />
<br />
== Informationen zur Organisation ==<br />
<br />
Es ist ratsam, dass du dir bereits Gedanken darüber gemacht hast, wie das Projekt organisiert wird. Dazu gehören regelmäßige (Online-)Treffen, deren Ergebnisse protokolliert werden sollten. Die Aufgaben müssen verteilt werden, der Fortschritt muss überblickt werden, die Mitarbeiter müssen bei Laune gehalten werden. Wenn dazu bereits Dinge geplant sind, gerade in Sachen Kommunikation, können diese auch veröffentlicht werden, denn das zeigt, dass du dich bereits mit dem Thema befasst hast.<br />
<br />
== Bezahlung ==<br />
<br />
Zur Projektvorstellung gehört auch eine Angabe darüber, ob die Mitarbeiter bezahlt werden. Wenn dein Projekt einen kommerziellen Hintergrund hat (sprich: du möchtest damit Geld verdienen), dann sollten die Mitarbeiter selbstverständlich angemessen für ihre Arbeit bezahlt werden. Bei einem reinen Hobbyprojekt ist eine Bezahlung nicht notwendig.<br />
<br />
Wenn du eine Bezahlung versprichst, dann sollte diese in jedem Fall (unabhängig vom Erfolg des Projekts) und regelmäßig stattfinden, und zwar über die ganze Projektlaufzeit hinweg. Oder würdest du viel Arbeit in ein fremdes Projekt investieren wollen, ohne zu wissen, ob du am Ende etwas davon hast?<br />
<br />
== Umgang mit Feedback ==<br />
<br />
Nun hast du deinen Beitrag geschrieben und wartest auf die ersten Reaktionen. Möglicherweise werden diese nicht so positiv ausfallen, wie du es dir erhofft hast. Du solltest damit rechnen, kritische Antworten zu erhalten, die die Machbarkeit oder den Innovationsgrad des Spiels in Frage stellen.<br />
<br />
Wenn du antwortest, bleibe stets freundlich. Schließlich willst du etwas von der Community, nicht umgekehrt. In jedem Fall solltest du dich erst einmal für die Rückmeldung bedanken und dann sachlich darauf eingehen. Greife niemanden persönlich an, mache dich nicht über seine Rechtschreibung, seinen Satzbau oder seinen Avatar lustig, denn sonst verwandelt sich die "Diskussion" schnell in einen Flamewar.<br />
<br />
== Fiktive Beispiele für Projektvorstellungen ==<br />
<br />
=== Gutes Beispiel ===<br />
<br />
Guten Tag,<br />
<br />
mein Name ist Heinrich Lohse, ich bin 27 Jahre alt und Diplominformatiker. Ich habe vor ca. 5 Jahren mit der hobbymäßigen Entwicklung von Spielen angefangen und auch schon einige kleinere Spiele fertiggestellt. Mein bisher größtes Spiel war "Fun-o-matik 2000", bei dem der Spieler auf einem fahrbaren Pinball-Automaten spielt und gleichzeitig mit diesem ein Rennen fährt. Das Spiel findet ihr unter http://www.fun-o-matik-2000.de.<br />
<br />
Nun möchte ich mich an etwas Größeres heranwagen. Bei meinen bisherigen Spielen habe ich Programmierung, Grafik und Sound selbst übernommen. Da ich in Letzteren nicht gerade begabt bin (wie man auch unschwer sehen bzw. hören kann), möchte ich bei meinem neuen Projekt gerne mit erfahrenen Grafikern und Sounddesignern/Musikern zusammenarbeiten.<br />
<br />
Bei meinem neuen Projekt handelt es sich um einen 3D-Roboter-Simulator. Der Spieler muss dabei einen kleinen virtuellen Roboter programmieren, so dass er bestimmte Aufgaben löst. Der Roboter kann modular aufgebaut werden und nach und nach mit besseren Komponenten ausgerüstet werden (Antriebssystem, Greifarme, Kameras, Sensoren, ...). Stellt euch beispielsweise einen Raum vor, in dem verschiedenfarbige Objekte verteilt sind. Die Aufgabe des Roboters könnte es nun sein, diese Objekte einzusammeln und ja nach Farbe in einen bestimmten Behälter zu legen. Die Programmierung des Roboters soll visuell erfolgen, so wie man es beispielsweise von LEGO Mindstorms kennt. Somit wäre das Spiel zum Programmieren-Lernen geeignet und ließe sich dem Bereich "Serious Gaming" zuordnen.<br />
<br />
Ich sehe mich in der Lage die Programmierung des Spiels und das Level-Design selbst zu übernehmen. Dazu werde ich mit Unity arbeiten, womit ich bereits "Fun-o-matik 2000" entwickelt habe. Für die 3D-Modelle, Texturen, Soundeffekte und Hintergrundmusik benötige ich jedoch fachmännische Hilfe und hoffe, dass ich hier jemanden finden kann.<br />
<br />
Das Spiel wird kostenlos angeboten werden, ich möchte damit also kein Geld verdienen und kann euch leider auch nicht bezahlen. Wenn ihr jedoch Gefallen an der Idee findet und euer Können unter Beweis stellen wollt, so freue ich mich über jedes Angebot. Bitte meldet euch hier oder per E-Mail an heinrich.lohse@gmail.com, stellt euch kurz vor und schickt mir aussagekräftige Arbeitsproben.<br />
<br />
Wenn es noch weitere Fragen zum Projekt gibt, bin ich gerne bereit diese zu beantworten.<br />
<br />
Vielen Dank!<br />
<br />
Heinrich Lohse<br />
<br />
=== Schlechtes Beispiel ===<br />
<br />
hallo ! ich such noch ein par leute für mein projeckt .<br />
<br />
das projeckt heist EARTH DESTROY'D 2039 und es soll mal ein ego shooter werden XD<br />
<br />
Zur idee kann ichnur so viel sagen<br />
<br />
es spelt in zukunft wo es keine meschen mehr auf der erde gibt<br /><br />
und roboter die herschafft ubernemen und die menscheit unterdrückne^^<br /><br />
naja das komnbiniert mit race elementne und charakter auswahl<br /><br />
<br />
ach ja capture the flag und Lens Flares wirds auch geben und RAIL GUN :D<br /><br />
mein kumpel hat Schon ein bild von der Railgun Gemalt aber leider klapt das hier mit<br /><br />
den datei anhengen nicht ?!!!?!<br /><br />
<br />
mehr deteils später wenn du teil nimmst und wir Sicher sind das du nichts aus plauderst . . .<br />
<br />
zur bezahlung da kann ich im moment nix Anbieten da wir auch nur schüler sind :S<br /><br />
aber wenn das projeckt dann verkeuft wird in 6-9 monaten bekommt jeder eine faire Teil vom gewinn !<br />
<br />
wir suchen noch :<br /><br />
- coder ( php, c++, java skript )<br /><br />
- grafiker du soltest mit photo shop und 3ds m.a.x. gewöhnt sein<br /><br />
- sounder& musiker<br />
<br />
also wenn das fürdich gut Klingt dann melde dich unter flotter_hengst1337@gmx.de<br />
<br />
cu<br /><br />
hennek</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Irc-chat-urlMediaWiki:Irc-chat-url2014-11-21T15:47:46Z<p>David Scherfgen: </p>
<hr />
<div>https://www.spieleprogrammierer.de/index.php?page=MibbitChat</div>David Scherfgenhttps://www.spieleprogrammierer.de/wiki/MediaWiki:Forum-urlMediaWiki:Forum-url2014-11-21T15:47:30Z<p>David Scherfgen: </p>
<hr />
<div>https://www.spieleprogrammierer.de/</div>David Scherfgen