XNA 2.0 Game
Programming Recipes
A Problem-Solution Approach
■■■
Riemer Grootjans
XNA 2.0 Game Programming Recipes: A Problem-Solution Approach
Copyright © 2008 by Riemer Grootjans
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-925-9
ISBN-10 (pbk): 1-59059-925-X
ISBN-13 (electronic): 978-1-4302-0514-2
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Ewan Buckingham
Technical Reviewer: Fabio Claudio Ferracchiati
Editorial Board: Clay Andres, Steve Anglin, Ewan Buckingham, Tony Campbell, Gary Cornell,
Jonathan Gennick, Matthew Moodie, Joseph Ottinger, Jeffrey Pepper, Frank Pohlmann,
Ben Renow-Clarke, Dominic Shakeshaft, Matt Wade, Tom Welsh
Project Manager: Beth Christmas
Copy Editor: Kim Wimpsett
Associate Production Director: Kari Brooks-Copony
Production Editor: Ellie Fountain
Compositor: Susan Glinert
Proofreader: April Eddy
Indexer: Broccoli Information Management
Artist: April Milne
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail , or
visit .
For information on translations, please contact Apress directly at 2855 Telegraph Avenue, Suite 600,
Berkeley, CA 94705. Phone 510-549-5930, fax 510-549-5939, e-mail , or visit http://
www.apress.com.
Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use.
eBook versions and licenses are also available for most titles. For more information, reference our Special
Bulk Sales–eBook Licensing web page at />The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at .
To Elisa, the most lovely woman I know. Without your love and support,
this would not have been possible.
To my parents, for giving me each and every opportunity.
To my friends and co-workers, for their support and laughs.
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
■CHAPTER 1
Getting Started with XNA 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
■CHAPTER 2
Setting Up Different Camera Modes in Your 3D World . . . . . . . . . . 25
■CHAPTER 3
Working with 2D Images/Textures in XNA 2.0 . . . . . . . . . . . . . . . . 145
■CHAPTER 4
Working with Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
■CHAPTER 5
Getting the Most Out of Vertices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
■CHAPTER 6
Adding Light to Your Scene in XNA 2.0 . . . . . . . . . . . . . . . . . . . . . . . 499
■CHAPTER 7
Adding Sounds to Your XNA 2.0 Project . . . . . . . . . . . . . . . . . . . . . . 559
■CHAPTER 8
Networking in XNA 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
v
■I N D E X
starting from VertexBuffer and
IndexBuffer, 395–396
worldMatrix property, 86
for structure rendered as TriangleList,
393–394
WorldViewProjection matrix, 139, 239
for structure rendered as TriangleStrip,
394–395
Wrapping mode, 372
of triangle, 392
writing custom content importer, 439
worldMatrix variable, 85
Wrap method, 373
Write method, 316, 325, 423, 425, 585
WriteBone method, 279–281
calculating collision point between
pointer and terrain, 432
WriteModelMesh method, 279–281
Intermediate class, 434
■X
view frustum, 26–27, 33
View matrix, 14, 16, 26, 29, 42, 47, 50, 357
viewAngle variable, 553
viewMatrix node, 91
viewMatrix variable, 40–41
ViewProjection matrix, 212, 242, 542
Visual Studio 2005, 2
WriteModelStructure method, 279–281
.x file, 248
XAct, 559
xAllowedRotDir variable, 212
xAmbient variable, 519
.xap file, 561
xBlurSize variable, 127–128
Xbox 360, deploying games on, 6–8
■W
connecting Xbox 360 and PCs, 7
WakeUp method, 168
Creators Club licenses, 7
walls, collision with, 60
.wav sound files, 559–563
generating projects from existing XNA 2.0
projects, 8
WaveBank method, 562
installing XNA Game Studio Connect, 7
waves, 560
overview, 6
while loop, 94, 400–401, 404, 415–417,
419–420, 447–448
pairing PCs and Xbox 360, 7
world matrices, 504
ensuring correct lighting when using,
518–519
objects in sight of camera, 54–57
setting different world matrices for
different objects, 252–258
combining multiple
transformations, 254
Xbox Live accounts, 6
Xbox Live accounts, setting up, 6
Xbox Live Marketplace, 6
xCamUp parameter, 216
xCamUp variable, 215
xConeAngle variable, 530
xConeDecay variable, 530
xConeDirection variable, 529
order of matrix multiplication, 254–258
.xgs binary file, 561
overview, 252–254
XImporter method, 184
updating, 93–95
worldMatrix node, 91
xLightDirection parameter, 523
xLightStrength value, 534
625
626
■I N D E X
xLightStrength variable, 533
saving/loading data, 19–24
xMirrorTexture variable, 238–242, 245–246
creating StorageDevice method
asynchronously, 20–22
XML file, loading data from, 439–445
creating XNA-compatible XML file from
existing object, 444–445
loading data from disks, 23–24
defining custom MapData class, 442
saving data to disks, 22
defining TypeReader capable of serializing
object of MapData class, 443
defining TypeWriter capable of serializing
object of MapData class, 442–443
overview, 439–442
overview, 20
starting new projects, 3
XNA Game Studio Connect program, 6–8
XNA Game Studio Device Center, 7
XNA project, accessing data in, 326
XmlSerializer class, 20, 23
XNA-compatible XML file, creating from
existing object, 444–445
XNA, 470, 481–482
<XNAContent> tag, 440
XNA Game Studio 2.0, 1–24
XNA-to-HLSL variables, 457–474
deploying games
XNAUtils class, 95–96
on PCs, 8–10
XNAUtils file, 266
on Xbox 360, 6–8
xnb files, 183–185, 193, 421
.fx HLSL files, 5
xPreviousShadingMapContents variable, 555
game loop timing, 10–11
xRelative value, 411
GameComponent class, 11–19
xTexStretch variable, 465
changing updating order of, 18–19
xTexture variable, 298, 553
DrawableGameComponent class, 12–13
xTime variable, 121, 224–225, 227, 476
making subscribe to interfaces, 16–17
overview, 11–12, 15–16
xWaveHeights variable, 474–475, 477,
482–483
subscribing to ICameraInterface
service, 17–18
xWaveLengths variable, 474–475, 477,
482–483
using GameComponent class, 14–15
xWaveSpeeds variable, 475
using multiple GameComponents, 18
■Z
installing, 1–3
overview, 1
predefined methods, 4–5
z-buffer (or depth buffer), 29, 32–33, 72, 230
zRelative value, 411