Danksagung | 6 |
Vorwort | 7 |
Inhaltsverzeichnis | 9 |
1 Die Buchstruktur | 20 |
2 Was ist VB.NET? | 22 |
2.1 Unterschiede zu Visual Basic 6 | 22 |
2.1.1 Rapid Application Development | 23 |
2.1.2 Vererbung | 23 |
2.1.3 Ausnahmebehandlung | 23 |
2.1.4 Überladung | 23 |
2.1.5 Overrides: Überschreiben von Methoden und Eigenschaften | 24 |
2.1.6 Konstruktoren und Destruktoren | 25 |
2.1.7 Datentypen | 25 |
2.1.8 Verweise | 26 |
2.1.9 Namespaces | 26 |
2.1.10 Assemblies | 26 |
2.1.11 Multithreading | 26 |
2.1.12 Common Language Runtime (CLR) | 26 |
2.1.13 Garbage Collection | 27 |
3 Die Entwicklungsumgebungen von VB.NET | 30 |
3.1 Das Visual Studio .NET | 32 |
3.1.1 Formdesigner | 34 |
3.1.2 Werkzeugfenster | 35 |
3.1.3 Eigenschaftenfenster | 35 |
3.1.4 Projektexplorer | 36 |
3.1.5 Pin-Nadel-Symbol | 36 |
3.2 SharpDevelop | 37 |
3.2.1 Code-Competion-Datenbank | 37 |
3.2.2 Der erste Start | 39 |
4 „Hello World“ das erste .NET-Programm | 42 |
4.1 Ein einfaches Programm mit einem einfachen Editor | 42 |
4.1.1 Der Sourcecode | 42 |
4.1.2 Der Compiler | 43 |
4.2 Ein Projekt im Visual Studio.NET | 44 |
5 Variablen | 48 |
5.1 Deklaration | 49 |
5.2 Datentypen und Konstanten | 49 |
5.2.1 Der richtige Datentyp | 51 |
5.2.2 Konstanten | 53 |
5.2.3 Strukturen | 56 |
5.3 Typensicherheit | 57 |
5.4 Ermitteln des Variablentyps | 60 |
6 Operatoren | 62 |
6.1 Arithmetische Operatoren | 62 |
6.2 Vergleichsoperatoren | 64 |
6.2.1 Mit dem Gleich-Operator Werte zuweisen! | 64 |
7 Verzweigungen | 66 |
7.1 Verzweigungen oder Entscheidungen? | 66 |
7.2 If-Then-Else-Anweisung | 66 |
7.2.1 Notationsunterschiede! | 69 |
7.2.2 Verschachtelungen oder ElseIf:ElseIf | 69 |
7.3 Select-Case-Anweisungen | 72 |
8 Schleifen | 76 |
8.1 For-Next-Schleife | 77 |
8.2 Do-Loop-Schleife | 78 |
8.2.1 Endlosschleifen | 81 |
8.3 While-End-While-Schleife | 81 |
8.4 For-Each-Schleife | 82 |
9 Arrays | 86 |
9.1 Statische Arrays | 86 |
9.2 Dynamische Arrays | 87 |
9.2.1 GetUpperBound | 88 |
9.3 Mehrdimensionale Arrays | 89 |
10 Funktionen und Subroutinen | 92 |
10.1 Subroutinen | 92 |
10.1.1 ByVal oder ByRef | 94 |
10.2 Funktionen | 94 |
10.2.1 Return | 95 |
10.2.2 Optionale Parameter | 96 |
10.3 Rekursives Programmieren | 97 |
11 Klassen | 100 |
11.1 Was ist eine Klasse? | 100 |
11.2 Nothing | 101 |
11.3 Felder | 102 |
11.4 Subroutinen und Funktionen | 103 |
11.5 Eigenschaften: Property | 105 |
11.5.1 Parameter in Properties | 106 |
11.5.2 Eingeschränkte Properties | 107 |
11.6 Enumerationen in Klassen | 108 |
11.7 Events | 109 |
11.8 Ein umfassendes Beispiel | 111 |
11.8.1 Erstellen der Klasse | 112 |
11.8.2 Klasse mit Daten füllen | 114 |
11.8.3 Daten aus der Klasse lesen | 114 |
11.9 Shared-Mitglieder | 115 |
11.10 Vererbung | 116 |
11.10.1 Overrides | 118 |
11.10.2 MyBase | 120 |
11.10.3 MustOverride und MustInherit | 121 |
12 Namespaces | 122 |
12.1 Namespaces ansprechen | 123 |
12.1.1 Imports | 123 |
13 Assemblies | 126 |
13.1 Arbeitsweise von Assemblies | 127 |
13.2 Shared Assembly | 127 |
14 Fehlerbehandlung | 128 |
14.1 Try-Catch-Finally-Anweisung | 128 |
14.1.1 Ausnahmebehandlung (Beispiel) | 129 |
14.2 OnError-GoTo-Befehl | 130 |
15 Was ist DirectX | 132 |
15.1 Die Säulen von DirectX | 132 |
15.2 Die Einsatzgebiete für DirectX | 134 |
16 DirectX-Grundlagen | 136 |
16.1 Das Koordinatensystem | 136 |
16.2 Primitives | 138 |
16.2.1 Primitives rendern | 140 |
16.2.2 Vorder- und Rückseite | 144 |
17 Mein erstes DirectX-Programm | 146 |
17.1 Ein Visual Studio .NET-Projekt erstellen | 146 |
17.2 Direct3D-Device erzeugen | 148 |
17.3 Rendern | 150 |
18 Mein erstes Objekt im 3D-Raum | 154 |
18.1 Vertexbuffer erstellen | 155 |
18.2 Vertexbuffer mit Objektdaten füllen | 156 |
18.3 Vertexbuffer rendern | 158 |
19 World-, View- und Projektionsmatrix | 160 |
19.1 Worldmatrix | 160 |
19.2 Viewmatrix | 161 |
19.3 Projektionsmatrix | 162 |
20 Device Enumeration | 164 |
20.1 DXSettings | 164 |
20.1.1 Display-Adapter | 167 |
20.1.2 Hardwarebeschleunigung (DeviceTyp) | 168 |
20.1.3 Videomodus | 169 |
20.1.4 Backbuffer-Format | 171 |
20.1.5 Z-Stencilbuffer-Format (Depth-Stencilbuffer-Format) | 173 |
20.1.6 Multisample-Typ | 174 |
20.1.7 Vertex-Processing | 176 |
20.2 DXSettings im praktischen Einsatz | 178 |
20.2.1 Preset-Struktur | 179 |
20.2.2 DXSettings initialisieren | 181 |
21 Matrizen | 184 |
21.1 Was ist eine Matrix | 184 |
21.1.1 Einheitsmatrix | 185 |
21.1.2 Addition | 185 |
21.1.3 Subtraktion | 185 |
21.1.4 Multiplikation | 186 |
21.1.5 Division | 186 |
21.1.6 Berechnen der invertierten Matrix M- | 187 |
21.2 Transformation | 188 |
21.2.1 Bewegt sich die Welt oder bewegt sich das Objekt? | 189 |
21.2.2 Translation (Bewegung, Positionsveränderung) | 189 |
21.2.3 Skalieren (Größenänderung) | 190 |
21.2.4 Rotation (Drehung) | 191 |
21.2.5 Grad vs Radiant | 193 |
21.2.6 Beispielprogramm für Matrizen | 194 |
22 Texturen | 200 |
22.1 Texturkoordinaten | 200 |
22.2 Kacheln einer Textur | 202 |
22.3 Das passende Vertexformat | 203 |
22.4 Größe einer Textur | 204 |
22.4.1 Auslesen der maximalen Texturbreite und Höhe | 205 |
22.5 Laden einer Textur | 205 |
22.6 Texturfilter | 207 |
22.6.1 MinFilter und MagFilter | 207 |
22.6.2 Nearest Point Sampling | 207 |
22.6.3 Linearer Texturfilter | 208 |
22.6.4 Anisotropic Filter (uneinheitlicher Filter) | 208 |
22.6.5 Bilineare und uneinheitliche Filterung | 209 |
22.6.6 Mipmaps | 209 |
22.7 Beispielprogramm für Texturen | 210 |
22.7.1 Ermitteln der maximalen Texturbreite und -höhe | 211 |
22.7.2 Erstellen des Vertexbuffers | 212 |
22.7.3 Erstellen und Laden einer Textur | 214 |
22.7.4 Rendern | 215 |
22.8 Multitexturing (Multi Texture Mapping) | 216 |
22.8.1 Mischparameter | 217 |
22.8.2 Multi-Pass-Technik vs. Single-Pass-Technik | 220 |
22.8.3 Texturkoordinaten, Vertexformat und Vertexbuffer | 221 |
22.8.4 Beispielprogramm für Multitexturing | 223 |
22.9 Alpha-Textur-Blending | 230 |
22.9.1 Texturfaktor | 230 |
23 Licht: Beleuchtung | 232 |
23.1 Licht und Material | 233 |
23.2 Direct3D.Lights | 233 |
23.3 Normalvektor | 234 |
23.3.1 Berechnung des Normalvektors | 236 |
23.4 Lichttypen | 237 |
23.4.1 Ambient-Light | 238 |
23.4.2 Point-Light | 239 |
23.4.3 Directional-Light | 240 |
23.4.4 Spot-Light | 241 |
23.4.5 Welcher Lichttyp ist der beste? | 243 |
23.5 Licht, Schatten und Polygone | 244 |
23.5.1 Flat-Shading | 244 |
23.5.2 Gouraud-Shading | 245 |
23.5.3 Phong-Shading | 246 |
23.6 Licht und Polygone | 246 |
23.7 Beispielprogramm für Licht und Polygone | 247 |
23.7.1 Erstellen der Flächen | 248 |
23.7.2 Erstellen der Lichter | 251 |
23.8 Beispielprogramm für Lichttypen | 253 |
23.8.1 Boden und Wände erstellen | 255 |
23.8.2 Lichtquellen initialisieren | 258 |
23.9 Licht und Mesh | 261 |
23.9.1 Beispielprogramm für Licht und Mesh | 262 |
24 Material | 264 |
24.1 Zusammenspiel zwischen Material und Licht | 264 |
24.1.1 Die Bestandteile des Materials | 265 |
24.1.2 Diffuse | 265 |
24.1.3 Ambient | 266 |
24.1.4 Specular | 266 |
24.1.5 Emissive | 266 |
24.2 Material initialisieren und aktivieren | 266 |
24.3 Beispielprogramm für Material | 267 |
25 Meshobjekte | 270 |
25.1 Erstellen eines Mesh–Objektes | 271 |
25.2 Laden eines Mesh-Objektes | 272 |
25.3 Darstellen eines Mesh-Objektes | 274 |
26 Animation des Mesh-Objektes Frame- Animation | 278 |
26.1 Prinzip der Frame-Animation | 279 |
26.2 Timing bei der Frame-Animation | 279 |
26.3 Mesh-Objekte: Tweening/Keyframe-Animation | 282 |
26.4 Keyframe-Bestimmung | 292 |
26.5 Keyframe-Interpolation | 293 |
26.6 Keyframe rendern | 297 |
27 Billboarding | 300 |
27.1 Was sind Billboards? | 300 |
27.2 Warum werden Billboards eingesetzt? | 301 |
27.2.1 Schlechtes Billboarding | 301 |
27.2.2 Gutes Billboarding | 301 |
27.3 Berechnungsmethoden | 302 |
27.4 Beispielprogramm für Billboarding | 303 |
27.4.1 Textureoberfläche erstellen | 304 |
27.4.2 Hauptspieleschleife erzeugen | 305 |
27.4.3 Rendern | 306 |
28 Wasser | 310 |
28.1 Technik zum Erstellen der Wasseroberfläche | 311 |
28.2 Aufbau der Wasseroberfläche (Gittergerüst) | 313 |
28.3 Wasseroberfläche erstellen (inkl. Wellen und Textur) | 314 |
28.4 Schwimmende Kisten integrieren | 316 |
28.5 Rendern Alpha-Blending | 317 |
29 Nebel | 320 |
29.1 Was kann Nebel? | 321 |
29.2 Berechnungsarten | 321 |
29.2.1 Linear Fog | 321 |
29.2.2 Exponential Fog | 322 |
29.3 VertexFog oder Pixel-Fog/Table-Fog | 323 |
29.3.1 Prüfung | 324 |
29.4 Die wahre Tiefe | 325 |
29.5 Renderstates | 326 |
29.6 Beispielprogramm für Nebel | 327 |
29.6.1 Erstellen der Straße | 328 |
29.6.2 Einbinden der Meshes (Bäume und Auto) | 329 |
29.6.3 Initialisierung des Nebels | 330 |
29.6.4 Rendern | 331 |
30 Partikeleffekte | 334 |
30.1 Partikelstruktur | 336 |
30.2 Zweidimensional vs. dreidimensional | 337 |
30.3 Partikelklasse | 339 |
30.4 Rendern | 342 |
30.5 GUI | 346 |
31 DirectSound: Modell | 348 |
31.1 DirectSound-DeviceInformation | 349 |
31.2 DirectSound-Device | 349 |
31.3 DirectSound-Buffer | 350 |
31.4 DirectSound-3DBuffer | 351 |
31.4.1 Ausrichtung des 3DBuffers | 352 |
31.5 DirectSound-3DListener | 353 |
31.5.1 Ausrichtung des 3DListeners | 353 |
31.6 DirectSound-CaptureBuffer | 353 |
32 2DSound-Demo | 356 |
33 3DSound-Demo | 364 |
34 AudioVideoPlayback | 372 |
34.1 Ein Wort zu DirectMusic | 372 |
34.2 AudioVideoPlayback generell | 372 |
34.3 Audio | 373 |
34.4 Video | 377 |
35 DirectInput | 380 |
35.1 Objekthierarchie | 380 |
35.2 Geräteauflistung | 381 |
35.2.1 Beispielprogramm | 382 |
35.2.2 Eingabegeräte ermitteln | 382 |
35.2.3 Objekte ermitteln | 384 |
35.3 Kooperationsebene | 386 |
35.4 Datenformat | 387 |
35.5 Daten empfangen | 387 |
35.6 Keyboard (Beispielprogramm) | 388 |
35.6.1 Sourcecode-Beispiel 1 | 388 |
35.6.2 Sourcecode-Beispiel 2 | 389 |
35.7 Maus | 393 |
35.7.1 Kooperationsebene anlegen und das Device erzeugen | 394 |
35.7.2 Daten abfragen | 395 |
35.8 Joystick | 396 |
35.8.1 Angeschlossene Joysticks ermitteln | 398 |
35.8.2 Akquirieren und Achseneigenschaften festlegen | 399 |
35.8.3 Daten abfragen | 399 |
35.9 First-Person-Camera | 402 |
35.9.1 Variablen und Strukturen definieren | 403 |
35.9.2 Erzeugen der DirectInput-Devices | 404 |
35.9.3 Maus- und Tastaturdaten empfangen | 405 |
35.9.4 Maus- und Tastaturdaten auswerten | 406 |
36 DirectPlay | 410 |
36.1 Service-Provider | 411 |
36.2 Wie ist eine Peer-to-Peer Verbindung aufgebaut? | 412 |
36.3 Erstellen einer GUID | 413 |
36.4 Host | 414 |
36.5 Player | 414 |
36.5.1 Host suchen | 415 |
36.5.2 Player erstellen und an der Session anmelden | 417 |
36.6 Senden von Daten | 417 |
36.7 Empfangen von Daten | 418 |
36.8 Beispielprogramm: Simple Chat | 419 |
36.9 Kommunikationsmodelle | 421 |
36.9.1 Peer-to-Peer-Session | 421 |
36.9.2 Client/Server-Session | 421 |
36.9.3 Sicherheit | 421 |
37 Das Spiel: Return From Orion | 424 |
37.1 Erste Gedanken zum Spiel | 425 |
37.2 Von der ersten Spielidee zu einem Konzept | 425 |
37.3 Der Entwicklungsprozess oder die Arbeit vor der Arbeit | 427 |
37.4 Festlegung des Spielprinzips/Spielablaufs | 427 |
37.5 Die Storyline – eine Geschichte entsteht | 428 |
37.6 Festlegen des Designs mit Designstudien | 429 |
37.7 Das Konzept des Spiels | 430 |
38 Das Projekt startet | 432 |
38.1 Erstellen der ersten Objekte | 432 |
38.2 Erstellen des Basis-Devices für das Projekt | 434 |
39 Eine Welt erschaffen | 438 |
39.1 Die Theorie des Spielfeldes | 438 |
39.2 Das Spielfeld in der Praxis | 439 |
39.2.1 Spielfelddaten auslesen | 440 |
39.2.2 Performance-Steigerung im Spielfeld | 443 |
39.2.3 Das Spielfeld erstellen | 445 |
39.2.4 Die Bitmaske | 446 |
39.2.5 Das Spielfeld rendern | 447 |
39.3 Skydome: Die Begrenzung der Spielwelt | 451 |
40 Die Spielfigur | 454 |
40.1 Die Techniken der Spielfigur | 455 |
40.1.1 Bewegungsablauf – Animation der Spielfigur | 455 |
40.1.2 Bewegung der Spielfigur | 459 |
40.1.3 Relative Bewegungen im Spiel | 460 |
40.1.4 Logik der Bewegung | 462 |
40.1.5 Drehung der Spielfigur | 465 |
40.1.6 Laufen der Spielfigur | 467 |
40.2 Einfügen der Tastaturabfrage | 470 |
40.3 Einfügen des Kameramoduls | 476 |
41 Gegner: Computergesteuerte Elemente | 480 |
41.1 Arten von Gegnern | 480 |
41.1.1 Festgelegte Bewegungen und Aktionen | 480 |
41.1.2 Intelligente Bewegungen und Aktionen | 481 |
41.1.3 Intelligente Bewegungen, Aktionen und Kommunikation | 482 |
41.2 Einfügen der Gegner in „Return From Orion“ | 483 |
42 Künstliche Intelligenz | 490 |
42.1 Was ist künstliche Intelligenz? | 490 |
42.1.1 Menschlich handeln | 491 |
42.1.2 Menschlich denken | 491 |
42.1.3 Rational denken | 492 |
42.1.4 Rational handeln | 492 |
42.2 KI in Computerspielen | 492 |
42.3 KI in „Return From Orion“ | 493 |
42.3.1 Random-Strategie | 495 |
42.3.2 Vertikale Strategie | 497 |
42.3.3 Horizontale Strategie | 501 |
42.3.4 Änderung der KI-Strategie | 504 |
43 Kollision | 506 |
43.1 Kollision in DirectX | 506 |
43.1.1 BoundingBox | 506 |
43.1.2 BoundingSphere | 507 |
43.1.3 Feintuning | 508 |
43.2 Kollision im Spiel | 509 |
44 Soundeffekte | 512 |
45 Abschließende Funktionen | 516 |
45.1 Statusanzeigen erstellen und integrieren | 516 |
45.2 Splash-Screens | 521 |
45.3 Kamerafahrt am Anfang jedes Levels | 523 |
45.4 Framerate begrenzen | 525 |
46 Leveleditor | 528 |
46.1 Zeichnen des Spielfeldes | 529 |
46.2 Editieren der Spielfelddaten | 532 |
46.3 Steuerelemente des Leveleditors | 537 |
46.4 Das Programm-Menü | 543 |
46.4.1 Level neu erstellen | 543 |
46.4.2 Level laden | 545 |
46.4.3 Level speichern | 546 |
46.4.4 Direkt Zugriff auf ein Level | 546 |
46.4.5 Spielfeld umranden | 548 |
46.4.6 Dynamische Objekte einfügen: Random | 549 |
46.5 Hilfsfunktionen | 550 |
47 Fragen und Antworten zu VB.NET | 554 |
48 Fragen und Antworten zu DirectX | 560 |
48.1 Fragen und Antworten zu Texturen | 561 |
Glossar | 564 |
Anhang | 568 |
Datentypen | 568 |
Index | 570 |