Eine Übersicht
Hallo Leserin, Hallo Leser,
wie bereits in meinem ersten Eintrag erzählt, handelt dieser Blog von der Entwicklung einer 3D Engine. Heute will ich erzählen, wie eine Engine im generellen und wie CTGame Engine im speziellen aufgebaut ist.
Engines im Allgemeinen
Eine Spiele-Engine bildet einen Teil eines Computerspiels, dessen Aufgabe es ist, die Darstellung des Spieles, die Interaktion sowie den Sound zu verwalten. Die Engine ist quasi das Herzstück eines Spiels. Auf ihr werden die Spielinhalte ausgeführt.
Somit besteht eine Engine im Allgemeinen aus den folgenden Teilen (Systemen):
- Grafiksystem Dieses Verwaltet die Grafische Ausgabe und stellt die Spielinhalte auf dem Bildschirm dar, d. h. es verwendet Informationen über 3-Dimensionale Objekte und sorgt dafür, dass diese in Form von Pixeln auf dem Display ausgegeben werden.
Weiter verwaltet dieses meist die Texturen, Modelle und wird für die Animation von Objekten benötigt.
- Soundsystem Wie der Name schon sagt, wird hierüber alles verwaltet, was mit Tönen oder Musik zu tun hat. D. h. es werden Sounds geladen, Musik verwaltet und die Rohdaten an die Soundkarte weitergegeben, damit diese die Daten über die Lautsprecher ausgeben kann.
- Eingabesystem
Damit eine Interaktion mit der virtuellen Welt möglich ist, müssen die Eingaben des Benutzers (Maus, Tastatur, Joystick) aufbereitet werden und den anderen Systemen zur Verfügung gestellt werden. Diesen Teil übernimmt das Eingabesystem. - Dateisystem Dieses System verwaltet den Zugriff auf Medien wie die Festplatte oder CD, um von diesen unterschiedliche Daten auszulesen. Das Dateisystem einer Engine setzt auf dem Dateisystem des Betriebsystems auf, abstrahiert die Zugriffsfunktionen jedoch zusätzlich um so ein einheitliches Laden, Cachen und Speichern von Daten zu ermöglichen.
- Physiksystem Das Physiksystem dient dazu, eine halbwegs “realistische” Physik im Spiel zu ermöglichen. Es verhindert z.B. dass Aktoren im Spiel plötzlich durch die Böden fallen oder durch Wände gehen können. Auch z.B. Kollisionen von Projektil und Charakter wird durch das Physiksystem erkannt und dem entsprechenden Objekt gemeldet.
- KI - System Die KI regelt das verhalten aller nicht spielbaren Aktoren eines Spiels, also den Gegnern oder irgendwelchen Statisten. Hier wird beispielsweise die Wegfindung implementiert.
- Gameplay / Handlung Auch die Handlung eines Spiels muss irgendwo hinterlegt werden, Missionen verwaltet und gelenkt werden. Dies wird oft in einem Eigenen Modul implementiert, worduch es möglich ist, dieses durch ein anderes zu Ersetzen und somit ein anderes Spiel zu generieren.
Aufbau von CTGame
Die CTGame Engine verwendet einen ähnlichen Ansatz. Ein Kern steuert das Verhalten aller anderen Teilsystemen. Die Engine selbst muss nicht genau wissen, wie ein System im speziellen implementiert ist, vielmehr müssen lediglich die Schnittstellen bekannt sein.
Das Verhalten der Systeme wird in “CTScript” implementiert, der Skriptsprache von CTGame. Hier wird z.B. festgelegt, welches Gameplay verwendet wird, wie ein Objekt auf eine bestimmte Aktion reagiert etc.
Daher wird CTScript ebenfalls im Core implementiert.
CTScript
Dies ist ein Beispiel für ein CTScript. Im Prinzip orientiert sich die Skriptsprache an Java, ist also objektorientiert und besitzt keinerlei Pointer. Polymorphie, Kapselung und Abstrahierung ist somit also möglich.
Ein besonderes Feature ist die verwendung von nativem Code. Damit können einzelne Funktionen in C++ ausgelagert werden, womit die Ausführzeit extrem beschleunigt wird.
class Flower extends Actor native; var Mesh MyMesh; // Native Funktion (wird direkt in C++ implementiert) public native function void MustBeDoSomethingFast(int a, int b); public function void Initialize() { Super.Initialize(); MyMesh = LoadObject(Mesh,"Sample_M.Flower"); MyMesh.AttachMaterial(LoadObject(Texture,"Sample_T.FlowerM"); } public function void Render() { GetRenderer().Draw(MyMesh); // Native Funktion aufrufen MustBeDoSomethingFast(10, 20); } defaults { // Objekt "Engine.DefaultMesh" schon zur Kompilierzeit laden und in // MyMesh speichern. Dieser Wert wird für alle Instanzen des Objekts // Initial übernommen. MyMesh = <-"Engine.DefaultMesh"; }
Verwaltet und ausgeführt wird CTScript im Core vom sog. “Objectsystem”. Dieses bietet u.A. die Möglichkeit ein Objekt zu laden, zu speichern, Code auszuführen oder den Garbagecollector auszuführen.
Wie das Objectsystem implementiert wird, werde ich in meinem nächsten Eintrag näher erläutern.
cheers.
The Beginning
Ein Blog. Mein eigener Blog. Schon seit die ersten Vorläufer der Web 2.0 Bewegung entstanden, der Wunsch, sich der Welt mitzuteilen. Doch stets stellte sich die Frage: Worüber willst du schreiben? Nur ein weiterer Blog, der das alltägliche beschreibt? Ein weiterer Blog, um deine Meinung weiterzugeben? Die Geschehnisse der Nachrichten kommentieren?
Nein, das war es nicht, was ich wollte. Doch nun ist es soweit. Mein eigener Blog. Wovon soll er handeln, dieser Blog? Nun ja, kurz und knapp:
Die Entstehung einer 3D Engine
Schon vor einigen Jahren begann ich mich in die Grafikprogrammierung einzuarbeiten, zuerst DirectX, dann OpenGL. Damals, als ich noch nicht wirklich viel Erfahrung in C/C++ hatte, erschien mir dies allerdings viel zu schwer. So stellte ich meine Arbeiten ein und widmete mich anderen Dingen.
Einige Jahre später, mein Studium der Informationstechnik hatte begonnen, fasste ich den Entschluss, dieses Thema erneut anzupacken. Auslöser dieses Willens war damals Second Life, von dessen Idee, eine Welt im Spiel selbst zu gestalten, ich begeistert war. “Eine eigene 3D Engine schreiben, das wäre es”, dachte ich mir.
Die Gedanken sollten sich bald in Realität abbilden, also beschäftigte ich mich wieder mit diesem Thema. Doch im Gegensatz zu früher hatten sich meine Kenntnisse in C/C++ deutlich verbessert. Ohne ein genaues Ziel vor Augen, enstanden mehrere Versuche relativ primitive Szenen darzustellen.
Erste Projekte
Irgendwann, im Kontext einer Spielerei, wollte ich ein Spiel entwickeln, mit dem Namen “Checker - The Game”. Es sollte zunächst eine Isometrische Grafik verwenden und in Java geschrieben werden. Doch aufgrund vieler scheinbar unlösbarer Problem, wurde dieses Projekt eingestampft.
Im vierten Semester meine Studiums, sollte dann im Rahmen einer Studienarbeit ein Damespiel entwickelt werden, mit ansprechender Grafik und einer intelligenten KI. Das Projekt wurde DamePlus genannt, an dessen Planung und Realisierung drei Kommilitonen sowie ich beteiligt waren. Meine Aufgabe war die Implementierung der Grafischen 3D Oberfläche mitsamt den Models. Programmiert wurde dieses Spiel in Java, die Ausgabe wurde mittels OpenGL realisiert.![]()
Die Erfahrungen, die ich in diesem Projekt sammelte, brachten mich weiter und so begann ich eine erste Version der Engine in C++ zu schreiben. Diese enthielt einen Szenegraphen, der dynamisch optimiert und ausgegeben werden konnte. Verschiedene Arten von Texturen waren möglich, Shader konnten verwendet werden und sogar ein Exporter für Blender war vorhanden. Zudem kamen einige Versuche, eine Kollisionserkennung einzubauen sowie ein Primitives In-Game-Menu anzuzeigen.
Das ganze sollte vielmehr nur eine Machbarkeitsstudie darstellen und war niemals dafür gedacht vollendet zu werden (zumindest nicht im Ganzen). So wurde das Projekt nach einigen Monaten Entwicklungszeit eingestellt und die ersten Ideen für eine “richtige” Engine gesammelt. Dies war die Geburtsstunde von CTGame.
CTGame ist der Arbeitstitels des aktuellen Projektes. Die Abkürzung CT hat keine besondere Bedeutung, dient nur als Platzhalter für einen späteren Titel. Das Projekt beinhaltet zunächst die Entwicklung einer vollständigen 3D Engine, die anschließend - hoffentlich mit der Unterstützung begabter Künstler - in einem funktionsfähigen Spiel verwendet werden soll.
Ich halte nicht viel davon, übermäßig zu Planen, da sowieso alles immer anders kommt als geplant. Daher habe ich mir nur einige Anforderungen aufgeschrieben, die nach und nach umgesetzt werden.
Anforderungen an die Engine
- Vollständig Skriptierbar (mit einer Sprache, ähnlich Java), inkl Garbage Kollektor
- Erweiterbar, d.h. es muss einfach möglich sein, einzelne Teile der Engine zu ersetzen oder neue Teile hinzuzufügen
- Integrierter Editor
- Plattformunabhängig
- Sound
- Grafik
- Inputsystem
- Prozedurale Texturen / Meshes
- BSP-Trees
- OCT-Trees
- Programmiersprache: C++
- …
Dieser Blog soll also nach und nach über die Entwicklung von CTGame berichten und Einblicke in die darin verwendeten Techniken gewähren.
Vielen Dank für euer Interesse an diesem Thema. Scheut euch nicht Kommentare abzugeben oder Fragen zu stellen.
cheers.
Comments(0)