Hi, also ich wollte ja meine eigene 2D-Grafik-Engine mit
DirectX schreiben.
Habe das Buch "DirectX9 in Delphi" nun fast zur Hälfte durch und wollte schonmal anfangen mir Gedanken über mein Konzept zu machen.
Also die Hauptklasse ist der T2DXController.
Er soll sowohl das IDirect3D9 als auch das IDirect3DDevice9 beinhalten und somit das Grundgerüst der Engine bilden. Er ermöglicht das simple Initialisieren von
DirectX.
Außerdem wird der Klasse natürlich das
Handle auf dem gezeichnet werden soll übergeben.
Dann brauche ich eine
Unit die alle wichtigen Funktionen von DirectX abstrahiert. Z.B. das Erstellen von Texturen in eine kürzere Funktion kapselt und einfaches Transformieren ermöglicht.
Hinzu kommt eine
Unit mit allen wichtigen Konstanten.
Eine Klasse T2DXModel.
Der Klasse wird beim Erstellen der T2DXController übergeben. Es ist sozusagen ein einfaches Rechteck. Von ihr werden weitere Klassen abgeleitet, die dann gegebenenfalls eine Textur enthalten und verschiedene Blendmodi umfassen. So würde sich denke ich mal auch simples Licht realisieren lassen. Außerdem kann man Reflektionen oder sowas einstellen.
Für animierte Models würde ich in einem bestimmten Zeitintervall die Texturkoordinaten transformieren.
Hieraus wird vielleicht noch ein T2DXBackground abgeleitet
Dieser sollte zB die Möglichkeit besitzen sich langsam gegen die Kamera zu bewegen, sodass es den Anschein hat, dass er sich langsamer mitbewegt weil er in weiterer Entfernung liegt.
Ich glaube sowas konnte man damals zB bei SuperMario sehen.
T2DXScene ist eine Liste von Objekten.
Man kann für die gesamte Szene Filter einstellen, wie zB Anisotropic oder Linear-Filter.
Außerdem wird das Rendern aller enthaltenen T2DXModels mit einem Befehl erlaubt.
Ich habe überlegt eine bestimmte Anzahl von Ebenen zu erstellen, die ich von hinten nach vorne überdecken. Der Background ist dabei natürlich die hinterste Ebene. Die Spielfigur könnte zB auf der Mitte liegen und so könnte man im Vordergrund noch Nebel oder Bäume darstellen.
T2DXCamera
Naja, die Kamera halt. Da alles nur im zweidimensionalen stattfindet, hat sie natürlich auch nur X und Y-Koordinaten. Vielleicht überlege ich aber auch noch ob die Kamera eine dritte Dimension erhält, mit der man dann leicht schwenken könnte oder sowas. Außerdem gibt es eine simple Zoom-Funktion. Drehen wird natürlich auhc möglich sein.
Vielleicht fehlt noch ein T2DXTimer
Naja den würde ich wahrscheinlich über die OnIdle Prozedur lösen und dann immer das Intervall zwischen dem Letzten TimerAufruf berechnen. So könnte ich dann alle Animationen gleich schnell ablaufen lassen.
Außerdem sollte er einen Geschwindigkeits-Multiplikator erhalten. Standard wäre dann zB 1, dh das Intervall wird mit 1 multipliziert bevor es an die Objekte weitergegeben wird. So könnte man dann mit einem Multiplikator von 0.5 eine einfache Zeitlupe erreichen.
Der Timer soll aber sehr unabhängig von der GrafikEngine sein.
T2DXText darf natürlich auch nicht fehlen
Natürlich mit verschiedenen Fonts und vielleicht einem Pseudo-3D-Effekt.
So habe ich mir mein bisheriges Konzept vorgestellt.
Es ist sicherlich relativ simpel gehalten, sollte aber trotzdem recht Leistungsstartk sein, oder nicht?
Außerdem, wäre es dadurch dass die Engine so schmal gehalten wird, mit Sicherheit sehr einfach zu lernen. Ich habe das Konzept sehr nah an das im Buch beschriebene angelehnt, was sicher damit zusammen hängt, dass ich es gerade lese.
Ich denke aber nicht dass das weiter schlimm ist.
Die Frage ist eher, ob ich weiter abstrahieren müsste. So bleibt die Engine sehr
DirectX nah, außer dass die Funktionen umbenannt und vereinfacht und nützliche Klassen erstellt werden.
Ich habe mir kurz die Andorra2D Engine angesehn und dass sieht wesentlich entfernter von DX aus (sicher, weil es auch
OpenGL umkapselt), allerdings sieht es mir auch wesentlich komplizierter aus.
Jetzt ist noch die Frage wie ich die GrafikEngine zB einfach mit anderen Teilen verbinden kann.
Wenn ich später für meine Spiele zB noch eine KollisionsEngine oder verschiedene Spielereigenschaften erstelle, dann wäre es ja blöd für einen Spieler 3Objekte zu erstellen:
-Spielergrafik
-Spielereigenschaften
-Spielerkollision
Ich denke ihr wisst wie ich das meine.
Was haltet ihr ansonsten von meinem bisherigen Konzept? Verbesserungen und Kritik sind
sehr erwünscht. Vielleicht bin ich auch vollkommen falsch an den Aufbau ran gegangen?
Ich hoffe ich habe nichts vergessen. Meinungen bitte
Grüße, .ch!cken