Главная| Трекер ▼| Поиск| Правила| FAQ| |
Автор | Сообщение |
---|---|
Анфиса
Супермодератор ![]() Сообщения: 53544 ![]() |
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 Помоги нашему сайту на расходы за сервер и качай торренты НЕОГРАНИЧЕННО!Пожертвовать 100 ₽ ![]() Или 2204 1201 2214 8816, с комментарием "Помощь трекеру" Связь с администрацией |
Страница 1 из 1 |
![]() |
|