Tải bản đầy đủ (.pdf) (1,029 trang)

tricks of the windows game programming gurus - andre lamothe

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (16.04 MB, 1,029 trang )

201 West 103rd Street,
Indianapolis, Indiana 46290
Tricks of the
Windows
Game Programming Gurus
fundamentals of 2D and 3D Game Programming
André Lamothe
0072313618 FM 10/26/99 9:32 AM Page i
Tricks of the Windows Game
Programming Gurus
Fundamentals of 2D and 3D Game Programming
Copyright  1999 by Sams
All rights reserved. No part of this book shall be reproduced, stored in a
retrieval system, or transmitted by any means, electronic, mechanical, photo-
copying, recording, or otherwise, without written permission from the pub-
lisher. No patent liability is assumed with respect to the use of the information
contained herein. Although every precaution has been taken in the preparation
of this book, the publisher and author assume no responsibility for errors or
omissions. Neither is any liability assumed for damages resulting from the use
of the information contained herein.
International Standard Book Number: 0-672-31361-8
Library of Congress Catalog Card Number: 98-85491
Printed in the United States of America
First Printing: October 1999
01 00 99 4 3 2
Trademarks
All terms mentioned in this book that are known to be trademarks or service
marks have been appropriately capitalized. Sams cannot attest to the accuracy
of this information. Use of a term in this book should not be regarded as
affecting the validity of any trademark or service mark.
Warning and Disclaimer


Every effort has been made to make this book as complete and as accurate as
possible, but no warranty or fitness is implied. The information provided is on
an “as is” basis. The author and the publisher shall have neither liability nor
responsibility to any person or entity with respect to any loss or damages aris-
ing from the information contained in this book or from the use of the CD or
programs accompanying it.
Executive Editor
Don Roche
Acquisitions Editor
Angela Kozlowski
Development Editors
Erik Dafforn
Kezia Endsley
Managing Editor
Charlotte Clapp
Project Editor
Carol Bowers
Copy Editors
Sean Medlock
Aaron Black
Howard Jones
Indexer
Erika Millen
Proofreader
Betsy Smith
Technical Editor
Steve Haines
Software Development
Specialists
John Warriner

Dan Scherf
Interior Design
Gary Adair
Cover Design
Alan Clements
Layout Technicians
Brandon Allen
Tim Osborn
Staci Somers
0072313618 FM 10/26/99 9:32 AM Page ii
Contents at a Glance
Introduction 1
Part I Windows Programming Foundations 7
1 Journey into the Abyss 9
2 The Windows Programming Model 47
3 Advanced Windows Programming 95
4 Windows GDI, Controls, and Last-Minute Gift Ideas 165
Part II DirectX and 2D Fundamentals 211
5 DirectX Fundamentals and the Dreaded COM 213
6 First Contact: DirectDraw 241
7 Advanced DirectDraw and Bitmapped Graphics 287
8 Vector Rasterization and 2D Transformations 401
9 Uplinking with DirectInput and Force Feedback 537
10 Sounding Off with DirectSound and DirectMusic 589
Part III Hardcore Game Programming 645
11 Algorithms, Data Structures, Memory Management, and Multithreading 647
12 Making Silicon Think with Artificial Intelligence 713
13 Playing God: Basic Physics Modeling 797
14 Putting It All Together: You Got Game! 875
0072313618 FM 10/26/99 9:32 AM Page iii

Part IV Appendixes 901
A What’s on the CD 903
B Installing DirectX and Using the C/C++ Compiler 907
C Math and Trigonometry Review 911
D C++ Primer 925
E Game Programming Resources 949
F ASCII Tables 955
Index 961
0072313618 FM 10/26/99 9:32 AM Page iv
Table of Contents
Introduction 1
PART I Windows Programming Foundations 7
1 Journey into the Abyss 9
A Little History 9
Designing Games 13
Types of Games 13
Brainstorming 14
The Design Document and Storyboards 15
Making the Game Fun 16
The Components of a Game 16
Section 1: Initialization 17
Section 2: Enter Game Loop 17
Section 3: Retrieve Player Input 17
Section 4: Perform AI and Game Logic 17
Section 5: Render Next Frame 18
Section 6: Synchronize Display 18
Section 7: Loop 18
Section 8: Shutdown 18
General Game Programming Guidelines 21
Using Tools 26

C/C++ Compilers 26
2D Art Software 26
Sound Processing Software 26
3D Modelers 26
Music and MIDI Sequencing Programs 27
Setting Up to Get Down—Using the Compiler 27
An Example: FreakOut 29
Summary 46
2 The Windows Programming Model 47
The Genesis of Windows 48
Early Windows Versions 48
Windows 3.x 48
Windows 95 49
Windows 98 50
Windows NT 50
Basic Windows Architecture: Win9X/NT 50
Multitasking and Multithreading 51
Getting Info on the Threads 52
The Event Model 53
0072313618 FM 10/26/99 9:32 AM Page v
vi
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS
Programming the Microsoft Way: Hungarian Notation 55
Variable Naming 56
Function Naming 56
Type and Constant Naming 57
Class Naming 57
Parameter Naming 58
The World’s Simplest Windows Program 58
It All Begins with

WinMain() 59
Dissecting the Program 60
Choosing a Message Box 63
Real-World Windows Applications (Without Puck) 66
The Windows Class 66
Registering the Windows Class 74
Creating the Window 75
The Event Handler 77
The Main Event Loop 84
Making a Real-Time Event Loop 89
Opening More Windows 90
Summary 93
3 Advanced Windows Programming 95
Using Resources 96
Putting Your Resources Together 98
Using Icon Resources 99
Using Cursor Resources 102
Creating String Table Resources 106
Using Sound
.WAV Resources 108
Last, But Not Least—Using the Compiler to Create
.RC Files 114
Working with Menus 116
Creating a Menu 116
Loading a Menu 119
Responding to Menu Event Messages 122
Introduction to GDI 128
The
WM_PAINT Message Once Again 128
Video Display Basics and Color 133

RGB and Palletized Modes 135
Basic Text Printing 137
Handling Important Events 143
Window Manipulation 143
Banging on the Keyboard 150
Squeezing the Mouse 158
Sending Messages Yourself 161
Summary 163
0072313618 FM 10/26/99 9:32 AM Page vi
CONTENTS
vii
4 Windows GDI, Controls, and Last-Minute Gift Ideas 165
Advanced GDI Graphics 166
Under the Hood with the Graphics Device Context 166
Color, Pens, and Brushes 167
Working with Pens 168
Painting with Brushes 172
Points, Lines, Polygons, and Circles 173
Straight to the Point 173
Getting a Line on Things 175
Getting Rectangular 177
Round and Round She Goes—Circles 180
Polygon, Polygon, Wherefore Art Thou, Polygon? 181
More on Text and Fonts 182
Timing Is Everything 184
The
WM_TIMER Message 184
Low-Level Timing 187
Playing with Controls 190
Buttons 191

Sending Messages to Child Controls 195
Getting Information 197
The T3D Game Console 205
Summary 210
PART II DirectX and 2D Fundamentals 211
5 DirectX Fundamentals and the Dreaded COM 213
DirectX Primer 214
The HEL and HAL 216
The DirectX Foundation Classes in Depth 216
COM: Is It the Work of Microsoft… or Demons? 218
What Exactly Is a COM Object? 219
More on Interface IDs and GUIDs 223
Building a Quasi-COM Object 224
A Quick Recap of COM 226
A Working COM Program 226
Working with DirectX COM Objects 231
COM and Function Pointers 232
Creating and Using DirectX Interfaces 236
Querying for Interfaces 237
The Future of COM 238
Summary 239
0072313618 FM 10/26/99 9:32 AM Page vii
viii
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS
6 First Contact: DirectDraw 241
The Interfaces of DirectDraw 242
Interface Characteristics 242
Using the Interfaces Together 244
Creating a DirectDraw Object 245
Error Handling with DirectDraw 246

Getting an Interface Lift 247
Cooperating with Windows 250
Getting into the Mode of Things 255
The Subtleties of Color 259
Building a Display Surface 263
Creating a Primary Surface 264
Attaching the Palette 272
Plotting Pixels 272
Cleaning Up 284
Summary 285
7 Advanced DirectDraw and Bitmapped Graphics 287
Working with High-Color Modes 288
16-Bit High-Color Mode 289
Getting the Pixel Format 290
24/32-Bit High-Color Mode 299
Double Buffering 301
Surface Dynamics 307
Page Flipping 311
Using the Blitter 317
Using the Blitter for Memory Filling 320
Copying Bitmaps from Surface to Surface 328
Clipper Fundamentals 332
Clipping Pixels to a Viewport 332
Clipping Bitmaps the Hard Way 334
Making a DirectDraw Clip with
IDirectDrawClipper 339
Working with Bitmaps 345
Loading
.BMP files 345
Working with Bitmaps 352

Loading an 8-Bit Bitmap 353
Loading a 16-Bit Bitmap 354
Loading a 24-Bit Bitmap 355
Last Word on Bitmaps 356
Offscreen Surfaces 356
Creating Offscreen Surfaces 356
Blitting Offscreen Surfaces 358
Setting Up the Blitter 359
Color Keys 360
Source Color Keying 361
0072313618 FM 10/26/99 9:32 AM Page viii
CONTENTS
ix
Destination Color Keying 364
Using the Blitter (Finally!) 365
Bitmap Rotation and Scaling 366
Discrete Sampling Theory 368
Color Effects 373
Color Animation in 256-Color Modes 373
Color Rotation in 256-Color Modes 379
Tricks with RGB Modes 381
Manual Color Transforms and Lookup Tables 381
The New DirectX Color and Gamma Controls Interface 382
Mixing GDI and DirectX 383
Getting the Lowdown on DirectDraw 386
The Main DirectDraw Object 386
Surfing on Surfaces 388
Playing with Palettes 389
Using DirectDraw in Windowed Modes 390
Drawing Pixels in a Window 392

Finding the Real Client Area (51) 395
Clipping a DirectX Window 397
Working with 8-Bit Windowed Modes 398
Summary 400
8 Vector Rasterization and 2D Transformations 401
Drawing Lines 402
Bresenham’s Algorithm 403
Speeding Up the Algorithm 409
Basic 2D Clipping 411
Computing the Intersection of Two Lines Using the Point
Slope Form 413
Computing the Intersection of Two Lines Using
the General Form 416
Computing the Intersection of Two Lines Using
the Matrix Form 416
Clipping the Line 419
The Cohen-Sutherland Algorithm 420
Wireframe Polygons 427
Polygon Data Structures 428
Drawing and Clipping Polygons 430
Transformations in the 2D Plane 432
Translation 433
Rotation 435
Scaling 445
Introduction to Matrices 446
The Identity Matrix 448
Matrix Addition 449
0072313618 FM 10/26/99 9:32 AM Page ix
x
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS

Matrix Multiplication 449
Transformations Using Matrices 452
Translation 454
Scaling 455
Rotation 455
Solid Filled Polygons 458
Types of Triangles and Quadrilaterals 459
Drawing Triangles and Quadrilaterals 461
Triangular Deconstruction Details 464
The General Case of Rasterizing a Quadrilateral 472
Triangulating Quads 473
Collision Detection with Polygons 478
Proximity AKA Bounding Sphere/Circle 478
Bounding Box 481
Point Containment 484
More on Timing and Synchronization 486
Scrolling and Panning 488
Page Scrolling Engines 488
Homogeneous Tile Engines 489
Sparse Bitmap Tile Engines 494
Fake 3D Isometric Engines 496
Method 1: Cell-Based, Totally 2D 496
Method 2: Full-Screen-Based, with 2D or 3D
Collision Networks 498
Method 3: Using Full 3D Math, with a Fixed Camera View 500
The T3DLIB1 Library 500
The Engine Architecture 500
Basic Definitions 501
Working Macros 502
Data Types and Structures 503

Global Domination 506
The DirectDraw Interface 507
2D Polygon Functions 511
2D Graphic Primitives 513
Math and Error Functions 517
Bitmap Functions 519
Palette Functions 522
Utility Functions 525
The BOB (Blitter Object) Engine 527
Summary 535
9 Uplinking with DirectInput and Force Feedback 537
The Input Loop Revisited 538
DirectInput Overture 539
The Components of DirectInput 541
The General Steps for Setting Up DirectInput 542
0072313618 FM 10/26/99 9:32 AM Page x
CONTENTS
xi
Data Acquisition Modes 544
Creating the Main DirectInput Object 544
The 101-Key Control Pad 546
Problem During Reading: Reacquisition 554
Trapping the Mouse 556
Working the Joystick 561
Massaging Your Input 576
Going Deeper with Force Feedback 579
The Physics of Force Feedback 580
Setting Up Force Feedback 580
A Force Feedback Demo 581
Writing a Generalized Input System:

T3DLIB2.CPP 582
The T3D Library at a Glance 588
Summary 588
10 Sounding Off with DirectSound and DirectMusic 589
Sound Programming on the PC 589
And Then There Was Sound… 590
Digital versus MIDI—Sounds Great, Less Filling 594
Digital Sound—Let the Bits Begin 594
Synthesized Sound and MIDI 596
It’s MIDI Time! 597
Sound Hardware 598
Wave Table Synthesis 598
Wave Guide Synthesis 598
Digital Recording: Tools and Techniques 599
Recording Sounds 600
Processing Your Sounds 600
DirectSound on the Mic 601
Starting Up DirectSound 602
Understanding the Cooperation Level 604
Setting the Cooperation Level 605
Primary and Secondary Sound Buffers 606
Working with Secondary Buffers 606
Creating Secondary Sound Buffers 607
Writing Data to Secondary Buffers 610
Rendering Sounds 612
Playing a Sound 612
Stopping a Sound 612
Controlling the Volume 612
Freaking with the Frequency 613
Panning in 3D 614

Making DirectSound Talk Back 614
Reading Sounds from Disk 616
The
.WAV Format 616
Reading
.WAV Files 617
0072313618 FM 10/26/99 9:32 AM Page xi
xii
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS
DirectMusic: The Great Experiment 622
DirectMusic Architecture 622
Starting Up DirectMusic 624
Initializing COM 624
Creating the Performance 625
Adding a Port to the Performance 626
Loading a MIDI Segment 626
Creating the Loader 627
Loading the MIDI File 627
Manipulating MIDI Segments 630
Playing a MIDI Segment 630
Stopping a MIDI Segment 631
Checking the Status of a MIDI Segment 631
Releasing a MIDI Segment 631
Shutting Down DirectMusic 631
A Little DirectMusic Example 632
The
T3DLIB3 Sound and Music Library 632
The Header 633
The Types 633
Global Domination 634

The DirectSound API Wrapper 635
The DirectMusic API Rapper—Get It? 640
Summary 643
PART III Hard Core Game Programming 645
11 Algorithms, Data Structures, Memory Management,
and Multithreading 647
Data Structures 648
Static Structures and Arrays 648
Linked Lists 649
Algorithmic Analysis 657
Recursion 659
Trees 662
Building BSTs 666
Searching BSTs 668
Optimization Theory 671
Using Your Head 671
Mathematical Tricks 672
Fixed-Point Math 673
Unrolling the Loop 677
Look-Up Tables 678
Assembly Language 679
Making Demos 680
Prerecorded Demos 680
AI-Controlled Demos 682
0072313618 FM 10/26/99 9:32 AM Page xii
CONTENTS
xiii
Strategies for Saving the Game 682
Implementing Multiple Players 683
Taking Turns 683

Split-Screen Setups 684
Multithreaded Programming Techniques 685
Multithreaded Programming Terminology 686
Why Use Threads in a Game? 687
Conjuring a Thread from the Plasma Pool 689
Sending Messages from Thread to Thread 697
Waiting for the Right Moment 702
Multithreading and DirectX 709
Advanced Multithreading 711
Summary 711
12 Making Silicon Think with Artificial Intelligence 713
Artificial Intelligence Primer 714
Deterministic AI Algorithms 715
Random Motion 716
Tracking Algorithms 717
Anti-Tracking: Evasion Algorithms 722
Patterns and Basic Control Scripting 722
Basic Patterns 723
Patterns with Conditional Logic Processing 727
Modeling Behavioral State Systems 729
Elementary State Machines 730
Adding More Robust Behaviors with Personality 734
Modeling Memory and Learning with Software 736
Planning and Decision Trees 740
Coding Plans 742
Implementing a Real Planner 745
Pathfinding 747
Trial and Error 748
Contour Tracing 749
Collision Avoidance Tracks 749

Waypoint Pathfinding 750
A Racing Example 753
Robust Pathfinding 754
Advanced AI Scripting 759
Designing the Scripting Language 759
Using the C/C++ Compiler 762
Artificial Neural Networks 767
Genetic Algorithms 770
Fuzzy Logic 772
Normal Set Theory 773
Fuzzy Set Theory 774
0072313618 FM 10/26/99 9:32 AM Page xiii
xiv
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS
Fuzzy Linguistic Variables and Rules 776
Fuzzy Manifolds and Membership 779
Fuzzy Associative Matrices 783
Processing the FAM with the Fuzzified Inputs 787
Warm and Fuzzy 794
Building Real AI for Games 794
Summary 795
13 Playing God: Basic Physics Modeling 797
Fundamental Laws of Physics 798
Mass (m) 799
Time (t) 799
Position (s) 800
Velocity (v) 802
Acceleration (a) 804
Force (F) 807
Forces in Higher Dimensions 808

Momentum (P) 809
The Physics of Linear Momentum: Conservation and Transfer 810
Modeling Gravity Effects 813
Modeling a Gravity Well 815
Modeling Projectile Trajectories 818
The Evil Head of Friction 821
Basic Friction Concepts 821
Friction on an Inclined Plane (Advanced) 823
Basic Ad Hoc Collision Response 828
Simple x,y Bounce Physics 828
Computing the Collision Response with Planes of
Any Orientation 830
An Example of Vector Reflection 834
Intersection of Line Segments 835
Real 2D Object-to-Object Collision Response (Advanced) 841
Resolving the n-t Coordinate System 846
Simple Kinematics 853
Solving the Forward Kinematic Problem 854
Solving the Inverse Kinematic Problem 858
Particle Systems 859
What Every Particle Needs 859
Designing a Particle Engine 860
The Particle Engine Software 861
Generating the Initial Conditions 866
Putting the Particle System Together 869
Playing God: Constructing Physics Models for Games 870
Data Structures for Physics Modeling 870
Frame-Based Versus Time-Based Modeling 871
Summary 873
0072313618 FM 10/26/99 9:32 AM Page xiv

CONTENTS
xv
14 Putting It All Together: You Got Game! 875
The Initial Design of Outpost 876
The Story 876
Designing the Gameplay 877
The Tools Used to Write the Game 877
The Game Universe: Scrolling in Space 878
The Player’s Ship: “The Wraith” 880
The Asteroid Field 882
The Enemies 884
The Outposts 885
The Predator Mines 886
The Gunships 888
The Power-Ups 891
The HUDS 892
The Particle System 896
Playing the Game 896
Compiling Outpost 897
Compilation Files 897
Runtime Files 898
Epilogue 898
P
ART IV Appendixes 901
A What’s on the CD 903
B Installing DirectX and Using the C/C++ Compiler 907
Using the C/C++ Compiler 908
C Math and Trigonometry Review 911
Trigonometry 911
Vectors 915

Vector Length 916
Normalization 917
Scalar Multiplication 917
Vector Addition 918
Vector Subtraction 919
The Inner Product, or the “Dot” Product 919
The Cross Product 921
The Zero Vector 923
Position Vectors 923
Vectors as Linear Combinations 924
0072313618 FM 10/26/99 9:32 AM Page xv
xvi
TRICKS OF THE WINDOWS GAME PROGRAMMING GURUS
D C++ Primer 925
What Is C++? 925
The Minimum You Need to Know About C++ 928
New Types, Keywords, and Conventions 929
Comments 929
Constants 929
Referential Variables 929
Creating Variables On-the-Fly 930
Memory Management 931
Stream I/O 932
Classes 934
The New Struct in Town 934
Just a Simple Class 935
Public Versus Private 936
Class Member Functions (A.K.A. Methods) 937
Constructors and Destructors 938
Writing a Constructor 939

Writing a Destructor 941
The Scope Resolution Operator 943
Function and Operator Overloading 945
Summary 947
E Game Programming Resources 949
Game Programming Sites 949
Download Points 950
2D/3D Engines 950
Game Programming Books 951
Microsoft DirectX Multimedia Exposition 951
Usenet Newsgroups 951
Keeping Up with the Industry: Blues News 952
Game Development Magazines 952
Game Web Site Developers 953
Xtreme Games LLC 953
F ASCII Tables 955
Index 961
0072313618 FM 10/26/99 9:32 AM Page xvi
Foreword
I remember first falling in love with computers back in 1983 while programming
Logo on an Apple IIe (thanks, Woz!). The sense of power I got from that experience
was very addicting and mind-shaping. The computer would do whatever I told it. It
didn’t get tired after countless repetitions or question my reasoning behind having it
perform any particular task. The machine just did it. I owe much of my career to that
experience, the movie War Games, and an author by the name of André LaMothe.
I bought my first book by André LaMothe, Sams Teach Yourself Game Programming
in 21 Days, back in 1994. It had never occurred to me that people could make a career
out of programming video games. It was then that I saw the connection between my
love for programming and my addiction to video games. Who would have ever
thought that all those hours of playing Galaga could now be considered research?

André’s writing and teaching style inspired me and gave me the confidence to believe
that I could program video games. I remember calling him up on the phone (I still
can’t believe he actually talks to people and gives out his phone number) and asking
for his help with a simple program I was making for my physics class based on his
gas model demo. I couldn’t get the program to work. Well, he instantly reviewed my
program and in seconds said something like, “Rich, you’re killing me, you need to put
a semicolon at the end of each line!” Well, that was it, and my first game program
was up and running.
A few years later, I had the pleasure of working with André on a video game called
Rex Blade as the tools programmer and a level designer. It was a tremendous learning
experience for me. We worked amazingly hard (André is a slave driver), had a lot of
fun (going to movies, gun shooting, skiing, and a lot more—can anyone say, “Desert
Eagle 51 caliber”? <GRIN>), and ended up with a 3D interactive video game trilogy.
We took Rex Blade from the concept to the shelves in an unbelievable six months
(Rex would make an interesting postmortem to be sure). Working on Rex taught me
what really went into making a real video game, and working with André showed me
what it really meant to work around the clock—and I do mean around the clock. I
thought he was kidding when he said he worked 100+ hours a week!
There are few areas of software engineering that push the limits of the hardware, the
software, and the programmer himself as much as game programming does. There are
so many intricate pieces that have to work together perfectly: math, physics, AI,
graphics, sound, music, GUI, data structures, and so forth. This is where Tricks of the
Windows Game Programming Gurus proves itself to be an essential tool in the art of
programming the video games of today and tomorrow.
This book takes you to the next level in game programming technology. The artificial
intelligence coverage alone is enough to make your mouth water—the demos are
killer. Where else can you get detailed coverage of fuzzy logic, neural nets, and
genetic algorithms and how to apply them to video games? The book also takes you
0072313618 FM 10/26/99 9:32 AM Page xvii
through all the major components of DirectX, including DirectDraw, DirectInput

(with force feedback coverage—Yes!), DirectSound, and the latest and greatest tech-
nology of DirectMusic.
Then there’s the physics modeling coverage. Finally, someone who knows what he’s
talking about has taken the time to delve into full collision response, momentum
transfer, and forward kinematics, and how to simulate them in real-time. Imagine
creatures that learn, objects that collide like in the real world, and enemies who
remember how you defeated them in your last encounter. These are the basics that
will make the great games of tomorrow.
I really have to hand it to André for writing this book. He always says that if he
didn’t, who would? It’s true: For someone to give away 20+ years of hard work,
secrets, and tricks to help others is really cool.
With technology advancing by leaps and bounds, I think it’s a great time to be alive,
especially if you’re a game programmer. It seems like every few months there’s a new
CPU, video card, or other piece of hardware that pushes the boundaries of what we
believe to be technologically possible. (I mean, it’s crazy to think that Voodoo III does
70 billion operations a second.) This great gift of technology comes with a price,
though. With it comes the expectation that the games we create will use this technol-
ogy, which raises the bar on what’s expected of tomorrow’s video games. It seems as
though in the very near future, the only limiting factors will be our knowledge and our
imagination.
It excites me to know that the next generation of game programmers will have this
book to inspire and educate them. And I think André hopes that somewhere, someone
will take his place in the 21st century and continue this work of disseminating the
black magic, because he needs a vacation!
Richard Benson
3D Game Programmer
DreamWorks Interactive
0072313618 FM 10/26/99 9:32 AM Page xviii
About the Author
André LaMothe (a.k.a. Lord Necron) has been programming for over 22 years and

holds degrees in mathematics, computer science, and electrical engineering. He has
written numerous articles on the subjects of graphics, game programming, and artifi-
cial intelligence. He is the author of Tricks of the Game Programming Gurus, Sams
Teach Yourself Game Programming in 21 Days, The Game Programming Starter Kit,
The Black Art of 3D Game Programming, and Windows Game Programming for
Dummies, all bestsellers. In addition, he coauthored Ciarcia’s Circuit Cellar I and II.
Mr. LaMothe has also taught at the University of Santa Cruz Extension Multimedia
Department.
Last, but not least, André is the founder and CEO of Xtreme Games LLC, a think tank
and the world’s largest virtual game company, composed of over 250+ independent
developer studios.
He can be reached at
Contributing Authors of Online Books in Digital
Form
Location on CD: T3DGAME\ONLINEBOOKS
Matthew Ellis, author of Direct3D Primer
Matthew is a teenage 3D game programmer and author. He lives in Las Vegas, NV,
and is interested in all aspects of 3D game programming and graphics. He is currently
creating a new 3D engine, as well as publishing articles and working on a book of his
own.
He can be reached at
Sergei Savchenko, author of General 3D Graphics
Sergei is a graduate student of computer science at McGill University in Montreal.
Sergei hails from the city of Kharkov (XAPbKOB), Ukraine, in the former Soviet
Union.
In addition to his computer science studies, Sergei also studied aircraft design at the
Kharkov Aviation Institute. He also teaches computer science classes and performs
active research in automated reasoning.
He can be reached at or at his Web page,
/>0072313618 FM 10/26/99 9:32 AM Page xix

David Dougher, author of Genesis 3D Engine Reference, Tool, and API Function
Manuals
David has been programming and gaming for over 25 years, creating his first com-
puter games on paper tape for use on the PDP-8 systems at Syracuse University in
1974. His collection of gaming magazines goes back to Strategic Review, Issue
Number 1 (the precursor to Dragon magazine). He is currently employed full-time as
a release engineer by Parlance Corp. and loves Babylon 5, Myst, Riven, Obsidian,
game design, teaching ballroom dancing, and his wife, although not in that order.
He can be reached at
Contributing Authors of Articles and Papers
Location on CD: T3DGAME\ARTICLES
Bernt Habermeier, author of Internet Based Client/Server Network Traffic
Reduction. Email: Web page: .
Ivan Pocina, author of KD Trees. Email:
Nathan Papke, author of Artificial Intelligence Voice Recognition and Beyond. Email:

Semion S.Bezrukov, author of Linking Up with DirectPlay. Email: deltree@rocket-
mail.com.
Michael Tanczos, author of The Art of Modeling Lens Flares. Email:

David Filip, author of Multimedia Musical Content Fundamentals. Email:

Terje Mathisen, author of Pentium Secrets. Email:
Greg Pisanich and Michelle Prevost, authors of Representing Artificial Personalities
and Representing Human Characters in Interactive Games. Email: ,

Zach Mortensen, author of Polygon Sorting Algorithms. Email:

James P. Abbott, author of Web Games on a Shoestring. Email:
Web page: .

Mike Schmit, author of Optimizing Code with MMX Technology. Email:
,
0072313618 FM 10/26/99 9:32 AM Page xx
Alisa J. Baker, author of Into the Grey Zone and Beyond. Email:

Dan Royer, author of 3D Technical Article Series. Email:
Web page: />Tom Hammersley, author of Viewing Systems for 3D Engines. Email:

Bruce Wilcox, author of Applied AI: Chess is Easy. Go is Hard. Email:

Nathan Davies, author of Transparency in D3D Immediate Mode. Email:

Bob Bates, author of Designing the Puzzle. Email:
Marcus Fisher, author of Dynamic 3D Animation Though Traditional Animation
Techniques. Email:
Lorenzo Phillips, author of Game Development Methodology for Small Development
Teams. Email:
Jason McIntosh, author of Tile Graphics Techniques 1.0
In addition, the CD contains a number of selected articles from the Game
Programming MegaSite at The articles are authored by
*Matt Reiferson, *Geoff Howland, Mark Baldwin, John De Goes, *Jeff Weeks, Mirek,
*Tom Hammersley, Jesse Aronson, Matthias Holitzer, Chris Palmer, Dominic Filion,
JiiQ, Dhonn Lushine, David Brebner, Travis “Razorblade” Bemann, Jonathan Mak,
Justin Hust, Steve King, Michael Bacarella II, Seumas McNally, Robin Ward,
Dominic Filion, Dragun, Lynch Hung, Martin Weiner, Jon Wise, and Francois
Dominic Larame.
*Contributed more than one article.
0072313618 FM 10/26/99 9:32 AM Page xxi
Acknowledgments
I always hate writing acknowledgements because there are simply too many people

involved in a book to mention everybody and give them proper thanks. However, here
goes once again, in no particular order.
I would first like to thank my parents for having me late in life, causing me to have so
many genetic mutations that I don’t need to sleep and I can work continuously with-
out a break. Thanks, Mom and Dad!
Next, I want to thank all the people at Macmillan Computer Publishing (MCP) for let-
ting me have my way with the book. Making corporate America do anything different
is surely a strain, and I am Mr. Nonconformist, but that’s what it takes if you want to
break new ground. Particularly, I want to thank the acquisitions editor, Angela
Kozlowski, for listening to my artistic/marketing concepts and making them happen;
Carol Bowers, the project editor, for making sure that my policy of “less editing is
more” was taken seriously; Dan Scherf, the media and permissions manager, for mak-
ing sure that all the programs made it to the CD; and Erik Dafforn, the development
editor, for making sure that the hundreds of figures and thousand-plus pages of manu-
script didn’t get mangled.
And of course, thanks to all the other editors and formatters that worked on the book,
including Steven Haines, Sean Medlock, Carol Ackerman, Kezia Endsley, and Howard
Jones. It seemed like all of you were playing musical chairs during editing, but you all
did a fantastic job. Steve and Sean especially caught me making stupid mistakes!
Next I want to thank the DirectX group at Microsoft, especially Kevin Bachus, for
helping with the acquisition of the latest DirectX SDK stuff, along with making sure
that I was sent to all the major DirectX parties. Very important to send me to parties;
that’s a good thing.
The next group I want to thank are all the companies that had something to do with
this book in one way or another, whether it was a piece of software or whatever. The
major players are Caligari Corporation for the use of TrueSpace, JASC for the use of
Paint Shop Pro, and Sonic Foundry for the use of Sound Forge. I would also like to
thank Matrox and Diamond Multimedia for demo 3D accelerators, Creative Labs for
sound cards, Intel Corporation for VTune, Kinetics for 3D Studio Max, and Microsoft
and Borland for their compiler products.

0072313618 FM 10/26/99 9:32 AM Page xxii
I’d like to thank all of my friends that I made contact with during this hellish produc-
tion. To all the guys at Gold’s Gym: Armand, Andrew, Paul, and Dave. To Mike
Perone, for always getting me that hard-to-find piece of software at a moment’s
notice. Oh yes, to my friend Mark Bell—or as I like to think of him, Mr. Happy—you
still owe me $180 from that ski trip eight years ago! (And I can’t stand always being
right anymore; please try harder, Mark. I can’t keep taking your money.)
Next I want to thank all the contributing editors who allowed me to put their articles
on the CD. If it weren’t for you guys, these poor readers would have nothing more
then my eccentric prose to read. A special thanks goes to Matthew Ellis, the author of
the Direct3D book on the CD, and to Richard Benson (Keebler) for doing the fore-
word to the book.
And finally, I have to thank the one person who was with me every day and always
supported me—my girlfriend Jennifer. I think I have finally met my match.
Thanks to everyone!
0072313618 FM 10/26/99 9:32 AM Page xxiii
Tell Us What You Think!
As the reader of this book, you are our most important critic and commentator. We
value your opinion and want to know what we’re doing right, what we could do
better, what areas you’d like to see us publish in, and any other words of wisdom
you’re willing to pass our way.
As the Publisher for Sams, I welcome your comments. You can fax, email, or write
me directly to let me know what you did or didn’t like about this book—as well as
what we can do to make our books stronger.
Please note that I cannot help you with technical problems related to the topic of this
book, and that due to the high volume of mail I receive, I might not be able to reply to
every message.
When you write, please be sure to include this book’s title and author as well as your
name and phone or fax number. I will carefully review your comments and share them
with the author and editors who worked on the book.

Fax: (317) 581-4770
Email:
Mail: Michael Stephens
Publisher
Sams
201 West 103rd Street
Indianapolis, IN 46290 USA
0072313618 FM 10/26/99 9:32 AM Page xxiv
Introduction
“Dead or alive, you’re coming with me.”
—Robocop
A long time ago, in a galaxy far, far, away, I wrote a book about game programming
called Tricks of the Game Programming Gurus. For me, it was an opportunity to cre-
ate something that I had always wanted—a book that taught the reader how to make
games. Anyway, it’s been a few years and I’m a little older and wiser, and I have defi-
nitely learned a lot of tricks <BG>. This book is going to continue where the old book
left off. I’m going to cover every major topic in game programming that I can fit
within the binding of this bad boy!
However, as usual, I’m not going to assume that you are already a master programmer
or that you even know how to make games. This book is for beginners as well as
advanced game programmers. Nonetheless, the tempo is going to be fierce, so don’t
blink!
Today is probably the coolest time in history to be in the game business. I mean, we
now have the technology to create games that do look real! Imagine what will come
next? But all this technology isn’t easy to understand or trivial—it takes hard work.
These days the bar has definitely been raised on the skill set needed to make games.
But if you’re reading this, you are probably one of those people who like a challenge,
right? Well, you came to right place, because when you’re done with this book you
will be able to create a full 3D, texture-mapped, professionally lit video game for the
PC. Moreover, you will understand the underlying principles of artificial intelligence,

physics modeling, game algorithms, 2D/3D graphics, and be able to use 3D hardware
today and in the future.
What You’re Going to Learn
In this book you’re going to learn about 100 teraquads of information! I’m going to
fill your neural net so full of information that you might have synaptic leakage!
Seriously, though, this volume covers all the elements necessary to create a Windows
9X/NT-based game for the PC:
• Win32 programming
• DirectX Foundation
• 2D graphics and algorithms
0172313618 Intro 8/27/99 9:12 AM Page 1

×