zurück zu Skullmans world

Tutorial von Dominique Louis, übersetzt von S. Römer


[ DelphiX Tutorial - Teil 1 ]
By Dominique Louis

Einleitung 

Seitdem ich vor 17 Jahren auf meinem ersten VIC-20 17 begonnen hatte Computerspiele zu spielen wollte ich wissen wie diese Spiele funktionierten und alle Programmierer mit denen ich die letzten 10 Jahren zusammengearbeitet habe wollten das ein oder andere Spiel programmieren. Ich nehme an, da die meisten von uns aus der Datenbankprogrammierung kommen, denken wir immer, das auf der Spieleentwicklungsseite das Gras grüner ist.

Ich hoffe, das die Reise auf die andere Seite in den Artikeln die ich in den kommenden Monaten veröffentlichen werde sowohl lehrreich als auch , was noch viel wichtiger ist, unterhaltsam sein wird. Mein Plan ist es, einen Prototyp einer "isometric Engine" ( wie in Spielen wie Command and Conquer, Dark Reign, StarCraft & Diablo ) zu erstellen, die DelphiX   (Eine Sammlung frei verfügbarer DirectX Komponenten) benutzt und auch einige 3D Elemente mit einschließt. Bei der Erstellung dieser "Engine" beabsichtige ich auch Themen wie Kollisions Erkennung, "shortest path algorithms across a map","unit formations/groupings using boids" und Animation der einzelnen Charaktere abzudecken.

Als ersten Teil der Arbeit werden wir uns einen Überblick über DirectX verschaffen, gefolgt von einigen grundlegenden Terminologien zu diesem Thema, worauf wir uns einem Überblick über DelphiX zuwenden welchem ein einfaches Beispiel zur Erstellung einesWurmloches mit Hilfe einiger Delphi X Komponenten folgt, das ungefähr so aussehen soll :

Überblick über DirectX

Technisch gesehen ist Direct X ein Teil von COM ( Component Object Model ),Objekte die eine Anzahl von Interfaces implementieren, die die Kommunikation mit der Video Hardware,der Soundhardware, dem Netzwerk,verschiedenen Eingabegeräten und einigen System Services erheblich erleichtern (siehe Bild 1) . 

Direct X wurde geschaffen die Probleme zu lösen , die man mit der Vielzahl von Hardwareherstellern hat, die alle mit ihren neuesten und besten 2D/3D Grafikbeschleunigern, erweiterter Sound Synthese Hardware, Netzwerkkomponenten, und seltsamen Eingabegeräten Programmierern das Leben schwer machen. Unter Dos musste man bei der Spieleprogrammierung für jede dieser Hardwarekomponenten eigene Device Treiber erstellen. Mit der Benutzung von Win95/98 , und in Zukunft Windows 2000,sollten alle Kompatibilitätsprobleme gelöst sein. 

Wer also Direct X benutzt und eine Hardware Beschleunigung sein Eigen nennt (wie z.B. 3Dfx, Nvidia etc ) wird diese auch benutzt , der CPU Speicher steht für andere Aufgaben zur Verfügung. Die Leute die viel Geld für ihre super duper 128 BIT Videokarte bezahlt haben bekommen also etwas für ihr Geld geboten.Das Spiel sieht besser aus und läuft schneller ohne das zusätzlicher Code programmiert wurde.
Zur Information: Direct X 6.1 arbeitet mit Win 95 und Win 98 zusammen,Direct X 3 läuft unter NT 4, aber nur mit Service Pack 3. Es gibt einen inoffiziellen / undokumentierten Direct X 5 Patch für NT 4,der hier zu finden ist. Bei mir läuft auch Direct X 6.1 unter NT 5 beta 2, Microsoft teilte ausserdem mit, das mit Veröffentlichung von NT 5/ 2000 auch Direct X 7.0 unterstützt wird.. 

DirectX setzt sich momentan aus 7 Hauptkomponenten zusammen :-

  • DirectDraw - erlaubt den direkten Zugriff auf den Darstellungsspeicher und die Hardwarefeatures der Grafikhardware, wobei die Kompatibilität zu Windows Anwendungen gewahrt bleibt.

  • DirectInput - Schnittstelle für Eingabegeräte ( Mouse, Keyboards, Joysticks, Headgear etc... ).

  • DirectPlay - Schnittstelle für Multi Player Möglichkeiten ( TCP/IP, Direct Dial, Local Networking ).

  • DirectSound - Schnittstelle zur sound hardware ( WAV, MIDI files und ähnliches ).

  • DirectSound3D - Schnittstelle, die es ermöglicht, Sounds überall in einem 3 dimensionalen Raum zu positionieren um ein räumliches Sounderlebnis zu
    erzeugen.

  • DirectMusic - Schnittstelle, die ein Array musikalischer Schablonen erzeugen kann,mit Hilfer derer auf Benutzer Aktionen und Ereignisse reagiert werden kann.

  • Direct3D - Schnittstelle für 3D Hardware ( Immediate and Retained Modes ).

Alle diese Schnittstellen wurden programmiert, um dem Programmierer direkten Zugriff auf die Hardware zu ermöglichen. 


[Bild 1 - DirectX Architektur ]

grundlegende Terminologien

Bevor wir damit beginnen Delphi X Komponenten zu benutzen, denke ich sollten wir einige Direct X Begriffe klären.

Surfaces - Videospeicher, der benutzt wird um verschiedene Bitmaps und Offscreens zu speichern,wird in Direct X Surface genannt.Der Videospeicher oder die Surface die gerade auf die Bildschirm dargestellt wird , wird "primary Surface" genannt.Diese "Surface" ist so groß wie der Speicherbedarf des aktuellen Darstellungsmoduses.Befindet man sich in einem Darstellungsmodus von 640x480x256 Farben (8 Bit pro Pixel), dann benötigt die "primary surface" 307,200 Byte des Videospeichers.Normalerweise sollte man wenigstens eine weitere surface erstellen, die genau die gleiche Größe wie die "primary surface" besitzt, diese "offscreen surface" wird dann für das "flipping" benutzt (Diese Technik wird später erklärt).Dies bedeutet, das wenigstens 614,400 Byte des
Videospeichers benötigt werden, ohne das ein einziges Bitmap in den Speicher geladen wurde.Wird der Videospeicher knapp, werden die Direct X surfaces in dem System Speicher ausgelagert (Ram Speicher), was die Vorteile der Hardware Beschleunigung zu nichte macht. Zur Zeit sollte ein Videospeicher von 2MB als Minimum für ein akzeptables Gameplay vorhanden sein.

Double Buffering - Eine Technik, um saubere,schnelle Animationen zu erhalten.Es handelt sich hierbei um einen separaten Bildpuffer, der verwendet wird um darin eine Szene vorzubereiten bevor sie sichtbar wird. Diese Technik wird normalerweise zusammen mit dem "page flipping" benutzt.( siehe nächste Erklärung )

Page Flipping animation -Diese Technik kennen viele aus ihrer Schulzeit, als man sich selbst damit die Zeit vertrieb , das man auf die Seiten dicker Bücher einige Bilder malte und dann durch ein schnelles Blättern der Seiten ein Animationseffekt entstand. Wenn Du das als Kind nie ausprobiert hast, versuch es , es wird den Effekt erklären. Szenen werden normalerweise durch das Kopieren (auch blitting genannt ) von  bitmaps oder sprites auf eine offscreen surface (oder buffer )erstellt, und,wenn die Szene komplett ist, hat die Videohardware die Möglichkeit auf diese offscreen surface zu schalten um die neu erstellte Szene sichtbar zu machen. Dieses "page flipping " ist extrem schnell , da hier keinerlei Kopiervorgang stattfindet. Hier wird werden einfach nur die Register der Videohardware verändert, die der Videokarte mitteilen, wo der Darstellungsvorgang beginnen soll. 
Es gibt 3 grundlegende Schritte um eine page flipping animation zu erstellen:.

  1. Erstellen der Szene in einer offscreen surface.

  2. Auf diesen offscreen schalten um ihn darzustellen,was die zuvor dargestellte surface
    zum aktuellen offscreen surface macht.

  3. Wiederholung von Schritt 1.

Frames Per Second -Normalerweise einfach FPS genannt, wird benutzt um auszudrücken, wieviel einzelne Bilder einer Animation auf dem Bildschirm dargestellt werden, sodas das menschliche Auge welches die Animation sieht, sie so fliessend empfindet, das sie für real gehalten wird.Als Anhaltspunkt,Kinofilms benutzen 24 FPS, das Fernsehen benutzt 25 FPS. Als Spieleentwickler, ist das die Rate die angestrebt werden sollte,wenn das Spiel einigermaßen annehmbar sein soll. In einigen Spielen, wie z.B. der Echzeitstrategie,kommt man manchmal mit 15 FPS aus, aber wie schon erwähnt sollten 24-25 FPS unser Ziel sein.

Tearing -Die meisten Monitore bauen ihr Bild cirka 70 mal in der Sekunde neu auf ( 70 Hz ), dies geschieht normalerweise von oben nach unten. Dieses Problem tritt auf, wenn man versucht ein Bild auf den Bildschirm zu zeichnen und der Monitor gerade in der Mitte versucht das Bild neu aufzubauen. Wenn man dies versucht, dann wird in der unteren Hälfte des Bildschirmes das neue Bild gezeichnet, während in der oberen Hälfte noch das alte Bild zu sehen ist. Dies visuelle Effekt wird "tearing" oder "shearing" genannt.In den dunklen Tagen von DOS musste man die "vertical retrace" überprüfen, um festzustellen, wann der Bildschirm neu aufgebaut wird um das "tearing" zu verhindern.
Heute übernimmt Direct X diese Überprüfung .

Bitmaps und Sprites - Grundsätzlich sind Bitmaps Bilder. Sprites sind Bitmaps mit transparenten Hintergrund.Der Begriff sprites wird auch für animierte Bilder innerhalb von Spielen verwendet. Sprites bestehen meist aus mehreren Einzelbildern ( Frames ) einer Animation, wie z.B. ein gehender Mann oder wie in diesem Beispiel ein fliegendes
Raumschiff...

Man beachte, wie jede Einzelsequenz einen bestimmten Blickwinkel auf das Raumschiff darstellt.Würde man alle Bilder nacheinander abspielen würde das so aussehen...

Man beachte, das die Transparenzfarbe des Sprites schwarz ist, die weisse Hintergrundfarbe scheint durch.

Clipping -Dies ist eine Technik um sicherzustellen, das die Zeichenroutinen nur in einem bestimmten Bereich ( einem Rechteck oder bestimmten Region ) zeichnen können. Würde direct X ohne clipping genutzt könnte man überall auf den Bildschirm zeichnen. Im Vollbildschirmmodus wäre dies gut, aber bei einer Anwendung im Fenster definitiv
inakzeptabel.

Colour theory - Unter windows werden Farben gewöhnlich mit dem RGB Modell (Rot,Grün,Blau Modell ) dargestellt. Durch die Benutzung der Farben Rot,grün und blau ist es möglich nahezu jede mögliche sichtbare Farbe durch eine richtige Gewichtung unter den 3 Farben darzustellen . Gespeichert wird die Farbe normal als ein 3 Byte Wert -jedes Byte repräsentiert eine relative Intensität einer der 3 Farben auf einer Werteskala von 0 bis 255 inklusive .0 stellt die geringste , 255 die höchste Intensität dar. 

In Delphi werden die Farben durch die Klasse TColor aus der Graphics Unit repräsentiert..
Man kann Farben entweder durch vordefinierte Konstanten wie clBlue, clLime etc. definieren oder um eine größere Genauigkeit zu erreichen,die Klasse Tcolor durch eine 4byte Hexadezimal Zahl festlegen, wobei die niedrigen 3 Bytes die RGB Farbintensitäten für rot,grün und blau darstellen.Der Wert $00FF0000 steht für die volle Intensität von Blau, $0000FF00 ist reines Grün, $000000FF reines Rot, $00000000 pures Schwarz, $00FFFFFF ist weiss und  $00FF00FF stellt lila dar. Ich bin sicher das habt ihr verstanden.Ein kleiner Auszug aus der VCL Hilfe erklärt folgendes : "Wenn das höchste Byte Null ist ($00), ist die Farbe die , die am ehsten der Systemfarbpallette ähnelt. wenn das höchste Byte Eins ist ($01), ist die Farbe der Farbe aus der gerade dargestellten Farbpalette am ähnlichsten.Ist das höchste Byte eine Zwei($02), ähnelt die Farbe der Farbe aus dem aktuellen Gerätekontekt am ehesten."

Es gibt ein weiteres Farbmodell das HSV Modell (Hue, Saturation, Luminance),damit will ich mich in diesem Artikel aber nicht beschäftigen. Das Buch "Computer Graphics, principles and practise" von Foley & van Dam ( oftmals die Computergrafik Bibel genannt ) erklärt die Farbenmodelle im Detail und zeigt auf , wie zwischen Ihnen konvertiert wird.
 



Savage Software Solutions' Help Desk and Software Information, are available 24 hours!!


 
 
 

Pages created and maintained by Savage Software Solutions, Copyright © 1999.