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:.
-
Erstellen der Szene in einer offscreen surface.
-
Auf diesen offscreen schalten um ihn darzustellen,was die zuvor dargestellte
surface
zum aktuellen offscreen surface macht.
-
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.
|