Регистрация ·  Логин: Пароль: Запомнить   · Забыли пароль?




Ответить на тему
Автор Сообщение

Супермодератор
Аватара пользователя

С нами: 11 лет 10 месяцев
Сообщения: 53544
Россия

Сообщение 20 июл 2015, 14:58 

[Цитировать]

Game Coding Complete, Fourth Edition


Год: 2013
Автор: Mike McShaffry and David Graham
Жанр: CG Game Developing
Издательство: Course Technology PTR
ISBN: 978-1-133-77657-4
Язык: Английский
Формат: PDF
Качество: Отсканированные страницы + слой распознанного текста
Интерактивное оглавление: Да
Количество страниц: 1000
Описание: Welcome to Game Coding Complete, Fourth Edition, the newest edition of the essential, hands-on guide to developing commercial-quality games. Written by two veteran game programmers, the book examines the entire game development process and all the unique challenges associated with creating a game. In this excellent introduction to game architecture, you''ll explore all the major subsystems of modern game engines and learn professional techniques used in actual games, as well as Teapot Wars, a game created specifically for this book. This updated fourth edition uses the latest versions of DirectX and Visual Studio, and it includes expanded chapter coverage of game actors, AI, shader programming, LUA scripting, the C# editor, and other important updates to every chapter. All the code and examples presented have been tested and used in commercial video games, and the book is full of invaluable best practices, professional tips and tricks, and cautionary advice.
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
Chapter 1 What Is Game Programming Really Like? . . . . . . . . . . . . . . . . . . . 1
The Good . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2
The Job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
The Gamers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Your Coworkers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
The Tools—Software Development Kits (SDKs) . . . . . . . . . . . . . . . . . . . . . . 7
The Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
The Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
The Show . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
The Hard Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
Game Programming Is Freaking Hard. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Bits and Pieces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
That’s Not a Bug—That’s a Feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
The Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
The Dark Side. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Hitting a Moving Target. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Crunch Mode (and Crunch Meals). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Bah Humbug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Operating System Hell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Fluid Nature of Employment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
It’s All Worth It, Right?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
Chapter 2 What’s in a Game?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Game Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
xix
Applying the Game Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Application Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
Reading Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
File Systems and Resource Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Managing Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Initialization, the Main Loop, and Shutdown . . . . . . . . . . . . . . . . . . . . . . 33
Other Application Layer Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Game Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
Game State and Data Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Physics and Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Process Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Command Interpreter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Game View for the Human Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
Graphics Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
User Interface Presentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Process Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Multiplayer Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Game Views for AI Agents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
Networked Game Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
Remote Game View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Remote Game Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Do I Have to Use DirectX? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
Design Philosophy of DirectX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Direct3D or OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
DirectSound or What? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
DirectInput or Roll Your Own. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Other Bits and Pieces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
Chapter 3 Coding Tidbits and Style That Saved Me . . . . . . . . . . . . . . . . . . 53
General Coding Styles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54
Bracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Consistency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Smart Code Design Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58
Avoiding Hidden Code and Nontrivial Operations . . . . . . . . . . . . . . . . . . 59
Class Hierarchies: Keep Them Flat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Inheritance Versus Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Virtual Functions Gone Bad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
xx Contents
Use Interface Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Consider Using Factories. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Encapsulate Components That Change. . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Use Streams to Initialize Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Smart Pointers and Naked Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
Reference Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
C++’s shared_ptr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Using Memory Correctly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75
Understanding the Different Kinds of Memory . . . . . . . . . . . . . . . . . . . . 75
Optimizing Memory Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Memory Alignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Virtual Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Writing Your Own Memory Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Grab Bag of Useful Stuff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
An Excellent Random Number Generator. . . . . . . . . . . . . . . . . . . . . . . . . 85
Pseudo-Random Traversal of a Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Memory Pools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Developing the Style That’s Right for You . . . . . . . . . . . . . . . . . . . . . . . . . . .95
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
Chapter 4 Building Your Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
A Little Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98
Creating a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
Build Configurations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Create a Bullet-Proof Directory Structure . . . . . . . . . . . . . . . . . . . . . . . . 100
Where to Put Your Game Engine and Tools . . . . . . . . . . . . . . . . . . . . . . 103
Setting Visual Studio Build Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Multiplatform Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Source Code Repositories and Version Control . . . . . . . . . . . . . . . . . . . . . . .110
A Little History—Visual SourceSafe from Microsoft . . . . . . . . . . . . . . . . 111
Subversion and TortoiseSVN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Perforce by Perforce Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
AlienBrain from Avid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Using Source Control Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Building the Game: A Black Art? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118
Automate Your Builds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
The Build Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Automated Build Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Creating Build Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Normal Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Milestone Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Contents xxi
Multiple Projects and Shared Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Some Parting Advice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .128
Chapter 5 Game Initialization and Shutdown . . . . . . . . . . . . . . . . . . . . . . 129
Initialization 101. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130
Some C++ Initialization Pitfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
The Game’s Application Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
WinMain: The Windows Entry Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Application Layer: GameCodeApp. . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
InitInstance(): Checking System Resources . . . . . . . . . . . . . . . . . . . . . 136
Checking for Multiple Instances of Your Game. . . . . . . . . . . . . . . . . . . . 137
Checking Hard Drive Space. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Checking Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Calculating CPU Speed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Do You Have a Dirtbag on Your Hands? . . . . . . . . . . . . . . . . . . . . . . . . 141
Initialize Your Resource Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Loading Text Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Your Script Manager and the Events System . . . . . . . . . . . . . . . . . . . . . 144
Initialize DirectX and Create Your Window . . . . . . . . . . . . . . . . . . . . . . 145
Create Your Game Logic and Game View. . . . . . . . . . . . . . . . . . . . . . . . 145
Set Your Save Game Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Preload Selected Resources from the Cache . . . . . . . . . . . . . . . . . . . . . . 147
Stick the Landing: A Nice Clean Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147
How Do I Get Out of Here? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Forcing Modal Dialog Boxes to Close . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Shutting Down the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
What About Consoles? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Getting In and Getting Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153
Chapter 6 Game Actors and Component Architecture . . . . . . . . . . . . . . . 155
A First Attempt at Building Game Actors . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Component Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159
Creating Actors and Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Defining Actors and Components. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165
Storing and Accessing Actors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Data Sharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .171
Direct Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
The Best of Both Worlds. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
xxii Contents
Chapter 7 Controlling the Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Organizing the Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
Hard-Coded Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Multithreaded Main Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
A Hybrid Technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
A Simple Cooperative Multitasker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Very Simple Process Example: DelayProcess . . . . . . . . . . . . . . . . . . . . . 186
More Uses of Process Derivatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Playing Nicely with the OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188
Using the DirectX 11 Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189
Rendering and Presenting the Display . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Your Callback Functions for Updating and Rendering . . . . . . . . . . . . . . 191
Can I Make a Game Yet? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193
Chapter 8 Loading and Caching Game Data . . . . . . . . . . . . . . . . . . . . . . . 195
Game Resources: Formats and Storage Requirements. . . . . . . . . . . . . . . . . .197
3D Object Meshes and Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Animation Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Map/Level Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Texture Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Bitmap Color Depth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Sound and Music Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Video and Prerendered Cinematics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Resource Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Packaging Resources into a Single File . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Other Benefits of Packaging Resources. . . . . . . . . . . . . . . . . . . . . . . . . . 211
Data Compression and Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Zlib: Open Source Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
The Resource Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
IResourceFile Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
ResHandle: Tracking Loaded Resources. . . . . . . . . . . . . . . . . . . . . . . . . . 222
IResourceLoader Interface and the DefaultResourceLoader . . . . . . . . 224
ResCache: A Simple Resource Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Caching Resources into DirectX et al. . . . . . . . . . . . . . . . . . . . . . . . . . . 233
World Design and Cache Prediction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
I’m Out of Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237
Chapter 9 Programming Input Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Getting the Device State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240
Using XInput or DirectInput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
A Few Safety Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Working with Two-Axis Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Contents xxiii
Capturing the Mouse on Desktops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Making a Mouse Drag Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Working with a Game Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Dead Zones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Normalizing Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
One Stick, Two Stick, Red Stick, Blue Stick . . . . . . . . . . . . . . . . . . . . . . . 261
Ramping Control Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Working with the Keyboard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Mike’s Keyboard Snooper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
GetAsyncKeyState() and Other Evils . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Handling the Alt Key Under Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 267
What, No Dance Pad?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267
Chapter 10 User Interface Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . 269
DirectX’s Text Helper and Dialog Resource Manager . . . . . . . . . . . . . . . . . . 270
The Human’s Game View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
A WASD Movement Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Screen Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
A Custom MessageBox Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Modal Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Control Identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Hit Testing and Focus Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300
Control State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .301
More Control Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Hot Keys. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Tooltips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Context-Sensitive Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Dragging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Sounds and Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Some Final User Interface Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Chapter 11 Game Event Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Game Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308
Events and Event Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
The Event Listener Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
The Event Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Example: Bringing It All Together. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
What Game Events Are Important? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324
Distinguishing Events from Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .327
xxiv Contents
Chapter 12 Scripting with Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
A Brief History of Game Programming Languages . . . . . . . . . . . . . . . . . . . .330
Assembly Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Scripting Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Using a Scripting Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Rapid Prototyping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Design Focused. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Speed and Memory Costs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Where’s the Line?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Scripting Language Integration Strategies . . . . . . . . . . . . . . . . . . . . . . . . . .337
Writing Your Own . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Using an Existing Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Choosing a Scripting Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Lua. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
A Crash Course in Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Flow Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Object-Oriented Programming in Lua. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Metatables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Creating a Simple Class Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Memory Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .356
Binding Lua to C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .356
The Lua C API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
tolua++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
luabind. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
LuaPlus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
A Crash Course in LuaPlus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
LuaState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
LuaObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Globals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Calling C++ Functions from Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Contents xxv
Bringing It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .366
Managing the Lua State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Script Exports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Process System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Event System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Script Component. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Lua Development and Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .389
Final Thoughts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .389
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .390
Chapter 13 Game Audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
How Sound Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .392
Digital Recording and Reproduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Sound Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
A Quick Word About Threads and Synchronization . . . . . . . . . . . . . . . . 396
Game Sound System Architecture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Sound Resources and Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
IAudioBuffer Interface and AudioBuffer Class . . . . . . . . . . . . . . . . . . . 409
IAudio Interface and Audio Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
DirectSound Implementations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Sound Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Launching Sound Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Other Technical Hurdles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .432
Sounds and Game Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Timing and Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Mixing Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Some Random Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .437
Data-Driven Sound Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Background Ambient Sounds and Music. . . . . . . . . . . . . . . . . . . . . . . . . 438
Speech . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
The Last Dance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Chapter 14 3D Graphics Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
3D Graphics Pipeline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .444
3D Math 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .445
Coordinates and Coordinate Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Vector Mathematics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
C++ Math Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Vector Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Matrix Mathematics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Quaternion Mathematics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
xxvi Contents
Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Lighting, Normals, and Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Materials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Textured Vertices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Texturing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Subsampling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Mip-Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Introducing ID3D11Device and ID3D11DeviceContext . . . . . . . . . . . . . . 491
Loading Textures in D3D11. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Triangle Meshes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Still with Me? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Chapter 15 3D Vertex and Pixel Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . 499
The Vertex Shader and Shader Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . .501
Compiling the Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .505
C++ Helper Class for the Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . .507
The Pixel Shader. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .515
C++ Helper Class for the Pixel Shader. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .516
Rendering with the Shader Helper Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Shaders—It’s Just the Beginning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .521
Chapter 16 3D Scenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Scene Graph Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .523
ISceneNode Interface Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
SceneNodeProperties and RenderPass . . . . . . . . . . . . . . . . . . . . . . . . . 526
SceneNode—It All Starts Here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
The Scene Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Special Scene Graph Nodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .545
Implementing Separate Render Passes . . . . . . . . . . . . . . . . . . . . . . . . . . 545
A Simple Camera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Putting Lights in Your Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Rendering the Sky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Using Meshes in Your Scene. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
What’s Missing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .565
Still Hungry?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .565
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .565
Chapter 17 Collision and Simple Physics . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Mathematics for Physics Refresher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .569
Meters, Feet, Cubits, or Kellicams? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Distance, Velocity, and Acceleration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Contents xxvii
Mass, Acceleration, and Force. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Rotational Inertia, Angular Velocity, and Torque . . . . . . . . . . . . . . . . . . 574
Distance Calculations and Intersections. . . . . . . . . . . . . . . . . . . . . . . . . . 575
Choosing a Physics SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .576
Object Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .578
Collision Hulls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Requirements of Good Collision Geometry. . . . . . . . . . . . . . . . . . . . . . . 581
Visible Geometry Versus Collision Geometry. . . . . . . . . . . . . . . . . . . . . . 582
Collision Hulls for Human Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Special Objects: Stairs, Doorways, and Trees . . . . . . . . . . . . . . . . . . . . . . 585
Using a Collision System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .586
Integrating a Physics SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .588
Components of the Bullet SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Shutdown. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Updating the Physics System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Creating a Simple Physics Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Creating a Convex Mesh. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Creating a Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Applying Force and Torque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
The Physics Debug Renderer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Receiving Collision Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
A Final Word on Integrating Physics SDKs . . . . . . . . . . . . . . . . . . . . . . . 609
But Wait, There’s So Much More . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Chapter 18 An Introduction to Game AI . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
AI Techniques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .612
Hard-Coded AI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Randomization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Weighted Randoms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Finite State Machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Decision Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .622
Fuzzy Logic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .627
Utility Theory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .630
Goal-Oriented Action Planning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
PathFinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
A* (A-Star) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Dynamic Avoidance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .641
Chapter 19 Network Programming for Multiplayer Games. . . . . . . . . . . . . 643
How the Internet Works. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
xxviii Contents
Winsock or Berkeley? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Internet Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
The Domain Name System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Useful Programs and Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Sockets API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Sockets Utility Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Domain Name Service (DNS) Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Sockets Initialization and Shutdown. . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Creating Sockets and Setting Socket Options . . . . . . . . . . . . . . . . . . . . . 655
Server Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Socket Reading and Writing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Making a Multiplayer Game with Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Packet Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Core Socket Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
A Socket Class for Listening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
A Socket Manager Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Core Client-Side Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .683
Core Server-Side Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .684
Wiring Sockets into the Event System. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Gosh, if It’s That Easy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
Chapter 20 Introduction to Multiprogramming. . . . . . . . . . . . . . . . . . . . . . 693
What Multiprogramming Does. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Creating Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .696
Process Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .698
Test and Set, the Semaphore, and the Mutex. . . . . . . . . . . . . . . . . . . . . 699
The Windows Critical Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Interesting Threading Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Thread Safety . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .704
Multithreading Classes in GameCode4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .704
The RealtimeProcess Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Sending Events from Real-Time Processes . . . . . . . . . . . . . . . . . . . . . . . . 708
Receiving Events in Real-Time Processes . . . . . . . . . . . . . . . . . . . . . . . . . 711
Background Decompression of a Zip File . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Further Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .715
About the Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .717
About the Future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .718
Chapter 21 A Game of Teapot Wars! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Making a Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .720
Creating the Core Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .722
Contents xxix
The Teapot Wars Application Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
The Game Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
The Game View for a Human Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Game Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Gameplay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .737
Loading the Level. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
The Actor Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Sending and Receiving Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
An Exercise Left to the Reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .745
Chapter 22 A Simple Game Editor in C# . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Why C#?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .747
How the Editor Is Put Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
The Editor Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .748
The Application Layer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
The Editor’s Logic Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
The Editor View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Functions to Access the Game Engine. . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Creating the DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Wrapping Up the Editor Architecture. . . . . . . . . . . . . . . . . . . . . . . . . . . 764
The C# Editor Application. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Differences Between Managed Code and Unmanaged Code . . . . . . . . . 766
NativeMethods Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Program Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
MessageHandler Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
The C# Editor User Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .772
The EditorForm Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
The ActorComponentEditor Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Future Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .795
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .796
Chapter 23 Debugging and Profiling Your Game . . . . . . . . . . . . . . . . . . . . 797
The Art of Handling Failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .798
Debugging Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .800
Using the Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Installing Windows Symbol Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Debugging Full-Screen Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
Remote Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Debugging Minidumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Graphics and Shader Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .812
Debugging Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
xxx Contents
Debugging Is an Experiment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Reproducing the Bug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Eliminating Complexity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Setting the Next Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Assembly Level Debugging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Peppering the Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Draw Debug Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
Lint and Other Code Analyzers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824
Nu-Mega’s BoundsChecker and Runtime Analyzers . . . . . . . . . . . . . . . . 825
Disappearing Bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Tweaking Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Caveman Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
When All Else Fails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Building an Error Logging System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .828
Different Kinds of Bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .835
Memory Leaks and Heap Corruption . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Game Data Corruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
Stack Corruption. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Cut and Paste Bugs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
Running Out of Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
Release Mode Only Bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Multithreading Gone Bad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Weird Ones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .846
Measuring Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
Optimizing Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
Tradeoffs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Over-Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
Parting Thoughts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .849
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .850
Chapter 24 Driving to the Finish. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Finishing Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .852
Quality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Dealing with Big Trouble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .864
Projects Seriously Behind Schedule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Personnel-Related Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Your Competition Beats You to the Punch. . . . . . . . . . . . . . . . . . . . . . . 874
Contents xxxi
There’s No Way Out—or Is There? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875
One Last Word—Don’t Panic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
The Light—It’s Not a Train After All . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .876
Test the Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
The Patch Build or the Product Demo . . . . . . . . . . . . . . . . . . . . . . . . . . 878
The Postmortem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
What to Do with Your Time. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Доп. информация: http://www.mcshaffry.com/GameCode/
Download
Для скачивания .torrent файлов необходима регистрация
Сайт не распространяет и не хранит электронные версии произведений, а лишь предоставляет доступ к создаваемому пользователями каталогу ссылок на торрент-файлы, которые содержат только списки хеш-сумм

Страница 1 из 1

Ответить на тему

   Похожие торренты   Торрент