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):

  1. 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.

  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

Bisher keine Kommentare

Hinterlasse eine Antwort