Programming Linux Games Programming Linux Games Loki Software, Inc. with John R. Hall An imprint of No Starch Press, Inc. San Francisco Programming Linux Games. Copyright (cid:13)c 2001 by Loki Software, Inc. Allrightsreserved. Nopartofthisworkmaybereproducedortransmittedinanyformorbyany means,electronicormechanical,includingphotocopying,recording,orbyanyinformationstorageor retrievalsystem,withoutthepriorwrittenpermissionofthecopyrightownerandthepublisher. PrintedintheUnitedStatesofAmerica 12345678910—04030201 Trademarkednamesareusedthroughoutthisbook. Ratherthanincludingafunnylittletrademark symbolwitheveryoccurrenceofatrademarkedname,weareusingthenamesonlyinaneditorial fashionandtothebenefitofthetrademarkowner,withnointentionofinfringementofthetrademark. Co-publishers: WilliamPollockandPhilHughes Project Editor: KarolJurado Assistant Editor: NickHoff Cover and Interior Design: OctopodStudios Copyeditor: RebeccaPepper Proofreader: KenDellaPenta DistributedtothebooktradeintheUnitedStatesbyPublishersGroupWest,1700FourthStreet, Berkeley,California94710,phone:800–788–3123or510–528–1444,fax:510–528–3444 DistributedtothebooktradeinCanadabyJacquelineGross&Associates,Inc.,OneAtlanticAvenue, Suite105,Toronto,OntarioM6KE7Canada,phone:416–531-06737,fax:416–531–4259 ForinformationontranslationsorbookdistributorsoutsidetheUnitedStates,pleasecontact NoStarchPress,Inc.directly: NoStarchPress,Inc. 555DeHaroStreet,Suite250 SanFrancisco,CA94107 phone: 415–863–9900;fax: 415–863–9950; [email protected];http://www.nostarch.com Theinformationinthisbookisdistributedonan“AsIs”basis,withoutwarranty. Whileevery precautionhasbeentakeninthepreparationofthiswork,neithertheauthornorNoStarchPress,Inc. shallhaveanyliabilitytoanypersonorentitywithrespecttoanylossordamagecausedorallegedto becauseddirectlyorindirectlybytheinformationcontainedinit. Library of Congress Cataloging-in-Publication Data Programming linux games / Loki Software, Inc. p. cm. Includes index. ISBN 1-886411-48-4 (pbk.) 1. Computer games--programming. 2. Linux. I. Loki Software, Inc. QA76.76.C672 .L56 2001 00-052689 794.8’15268--dc21 Contents Foreword i Preface iii Who This Book Is For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 1 The Anatomy of a Game 1 A Quick Survey of Game Genres . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Simulation Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 First-Person Shooters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Real-time Strategy Games . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Turn-Based Strategy Games . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Role-Playing Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Puzzle Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Multiuser Dungeons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 A Quick Look Under the Hood . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 The Input Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 The Display Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2 CONTENTS The Audio Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 The Network Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 The Update Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 The Game Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2 Linux Development Tools 17 Programming Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 NEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Compiling Programs Under Linux . . . . . . . . . . . . . . . . . . . . . . . . . 20 Using the Make Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Creating Makefiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Working with Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Static Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Shared Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Linux Linker Quirks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Debugging Linux Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Compiling for Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 gdb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 ddd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Bug Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Project Management with CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 A Brief Tutorial on CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Other Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Rapid Text Searching with grep . . . . . . . . . . . . . . . . . . . . . . . . 49 CONTENTS 3 Updating Source with diff and patch . . . . . . . . . . . . . . . . . . . . . 50 3 Linux Gaming APIs 53 Graphics APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 SVGALib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 GGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 SDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 ClanLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Plib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Glide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Xlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Graphical User Interface Toolkits . . . . . . . . . . . . . . . . . . . . . . . . . . 59 GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Fltk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Qt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 SDL GUI Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Audio APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 OSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 ALSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ESD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 OpenAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Scripting Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Guile and MzScheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Python and Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4 CONTENTS Networking APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 BSD Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 OpenPlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 IPX and SPX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 File Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 libpng and libjpeg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 libaudiofile and libsndfile. . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Ogg Vorbis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 The SDL MPEG Library, SMPEG . . . . . . . . . . . . . . . . . . . . . . 68 zlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4 Mastering SDL 69 Computer Graphics Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 The Framebuffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 The SDL Video API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Setting Up the Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Direct Surface Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Drawing with Blits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Colorkeys and Transparency . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Loading Other Image Formats. . . . . . . . . . . . . . . . . . . . . . . . . 92 Alpha Blending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Achieving Smooth Animation with SDL . . . . . . . . . . . . . . . . . . . 97 Input and Event Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Processing Mouse Events . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Processing Keyboard Events. . . . . . . . . . . . . . . . . . . . . . . . . . 112 Processing Joystick Events. . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Multithreading with SDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 CONTENTS 5 SDL Audio Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Representing Sound with PCM . . . . . . . . . . . . . . . . . . . . . . . . 125 Feeding a Sound Card . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 An Example of SDL Audio Playback . . . . . . . . . . . . . . . . . . . . . 129 Integrating OpenGL with SDL . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Penguin Warrior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Creating Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Implementing a Parallaxing Scroller in SDL . . . . . . . . . . . . . . . . . 147 A Simple Particle System . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Game Timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 5 Linux Audio Programming 161 Competing APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Introducing Multi-Play. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Loading Sound Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Using libsndfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Other Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Using OSS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Reality Check . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Achieving Higher Performance with Direct DMA Buffer Access . . . . . . 178 Playing Sound with ALSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Sharing the Sound Card with ESD . . . . . . . . . . . . . . . . . . . . . . . . . 195 Building Multi-Play . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Environmental Audio with OpenAL . . . . . . . . . . . . . . . . . . . . . . . . 206 OpenAL Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Adding Environmental Audio to Penguin Warrior . . . . . . . . . . . . . . 213 Implementing Game Music with Ogg Vorbis . . . . . . . . . . . . . . . . . . . . 222 6 CONTENTS Working with Vorbis Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Adding Music to Penguin Warrior . . . . . . . . . . . . . . . . . . . . . . 227 6 Game Scripting Under Linux 237 A Crash Course in Tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Built-in Tcl Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Interfacing Tcl with C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Linking Against Tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Executing Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Understanding Commands and Objects . . . . . . . . . . . . . . . . . . . 250 A Simple Scripting Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Designing a Game Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Applying Scripting to the Real World . . . . . . . . . . . . . . . . . . . . . . . 265 Single Versus Multiple Contexts. . . . . . . . . . . . . . . . . . . . . . . . 266 Can We Trust the Script? . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Script Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Who’s Writing the Script? . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 7 Networked Gaming with Linux 271 ’Tis a Big Net, Quoth the Raven . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Internet Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Addresses and Ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Name Resolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Socket Programming 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Connecting TCP Sockets. . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Receiving TCP Connections . . . . . . . . . . . . . . . . . . . . . . . . . . 285