c++ directx game programming for beginners

513
7/21/2019 C++ DirectX Game Programming for Beginners http://slidepdf.com/reader/full/c-directx-game-programming-for-beginners 1/513 Introduction A dvanced 3D G am e P rogram m ing w ith D irectX 9.0 by P e te r W alsh W ordw are P ublishing  © 2003 C om panion W eb Site A dvanced 3D G am e P rogram m ing U sing D irectX 9.0 P eter W alsh W o r d w a r e P u b l is h i n g , I n c . Library of C ongress C ataloging-in-P ublication D ata W a ls h , P eter (P e te r A n d re w ), 1980- A dvanced 3D gam e program m ing w ith D irectX 9.0 / by P e te r W alsh. p . cm IS B N 1-55622-968-2 (pbk.) 1 . C o m p u te r g a m e s P ro g ra m m in g . 2 . D ire c tX . I. T itle . Q A 7 6 .7 6 .C 6 7 2 W 3 8 2 2003 794.8'1677 68–d c21 2 00300714 C IP  C opyright © 2003 W ordw are P u b lis h in g , Inc. A ll R ights R eserved 2320 Los R ios B oulevard P la n o , T exas 75074 N o p a rt of this b ook m ay be reproduced in any form or by any m eans w ith o u t perm ission in w riting from W ordw are P u b lis h in g , In c. 1-55622-968-2 10 9 8 7 6 5 4 3 2 1 0403 D irectX is a registered tradem ark o f M ic r o s o ft C orporation in the U nited S tates and/or other co untries. A ll brand na m es and product nam es m entioned in this book are tradem arks o r service m arks o f th e ir respective com p a n ie s . A ny om ission or m isuse (of an y kind ) of service m arks or trad em arks should not be regarded as intent to infringe on the property of others. The publisher recognizes and respects all m arks used by com p a n ie s , m anufacturers, and developers as a m eans to distinguish their products. A ll in q uiries for volum e p urchases of this boo k should b e a dd resse d to W ordw a re P u blish in g, In c ., a t th e above address. Telephone inquiries m ay be m ade by calling: (97 2) 42 3-0090 D e d i c a t i o n s To m y beautiful fiancée Lisa S u lliv a n  I love you w ith a ll m y heart. P eter To m y parents, M anny and M aria 

Upload: mattkenway2608

Post on 04-Feb-2018

242 views

Category:

Documents


2 download

TRANSCRIPT

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    1/513

    1

    .

    .I n t r o d u c t i o n

    A d v a n c e d 3 D G a m e P r o g r a m m i n g w i t h D i r e c t X 9 . 0

    b y P e t e r W a l s h

    W o r d w a r e P u b l i s h i n g 2 0 0 3

    C o m p a n i o n W e b S i t e

    A d v a n c e d 3 D G a m e P r o g r a m m i n g U s i n g D i r e c t X 9 . 0

    P e t e r W a l s h

    W o r d w a r e P u b l i s h i n g , I n c .

    L i b r a r y o f C o n g r e s s C a t a l o g i n g - i n - P u b l i c a t i o n D a t a

    W a l s h , P e t e r ( P e t e r A n d r e w ) , 1 9 8 0 -

    A d v a n c e d 3 D g a m e p r o g r a m m i n g w i t h D i r e c t X 9 . 0 / b y P e t e r W a l s h . p . c m .

    I S B N 1 - 5 5 6 2 2 - 9 6 8 - 2 ( p b k . )

    1 . C o m p u t e r g a m e s P r o g r a m m i n g . 2 . D i r e c t X . I . T i t l e .

    Q A 7 6 . 7 6 . C 6 7 2 W 3 8 2 2 0 0 3

    7 9 4 . 8 ' 1 6 7 7 6 8 d c 2 1 2 0 0 3 0 0 7 1 4 0

    C I P

    C o p y r i g h t 2 0 0 3 W o r d w a r e P u b l i s h i n g , I n c .

    A l l R i g h t s R e s e r v e d

    2 3 2 0 L o s R i o s B o u l e v a r d P l a n o , T e x a s 7 5 0 7 4

    N o p a r t o f t h i s b o o k m a y b e r e p r o d u c e d i n a n y f o r m o r b y a n y m e a n s w i t h o u t p e r m i s s i o n i n w r i t i n g f r o m W o r d w a r e

    P u b l i s h i n g , I n c .

    1 - 5 5 6 2 2 - 9 6 8 - 2

    1 0 9 8 7 6 5 4 3 2 1

    0 4 0 3

    D i r e c t X i s a r e g i s t e r e d t r a d e m a r k o f M i c r o s o f t C o r p o r a t i o n i n t h e U n i t e d S t a t e s a n d / o r o t h e r c o u n t r i e s .

    A l l b r a n d n a m e s a n d p r o d u c t n a m e s m e n t i o n e d i n t h i s b o o k a r e t r a d e m a r k s o r s e r v i c e m a r k s o f t h e i r r e s p e c t i v e

    c o m p a n i e s . A n y o m i s s i o n o r m i s u s e ( o f a n y k i n d ) o f s e r v i c e m a r k s o r t r a d e m a r k s s h o u l d n o t b e r e g a r d e d a s i n t e n t t o

    i n f r i n g e o n t h e p r o p e r t y o f o t h e r s . T h e p u b l i s h e r r e c o g n i z e s a n d r e s p e c t s a l l m a r k s u s e d b y c o m p a n i e s , m a n u f a c t u r e r s ,

    a n d d e v e l o p e r s a s a m e a n s t o d i s t i n g u i s h t h e i r p r o d u c t s .

    A l l i n q u i r i e s f o r v o l u m e p u r c h a s e s o f t h i s b o o k s h o u l d b e a d d r e s s e d t o W o r d w a r e P u b l i s h i n g , I n c . , a t t h e a b o v e

    a d d r e s s . T e l e p h o n e i n q u i r i e s m a y b e m a d e b y c a l l i n g :

    ( 9 7 2 ) 4 2 3 - 0 0 9 0

    D e d i c a t i o n s

    T o m y b e a u t i f u l f i a n c e L i s a S u l l i v a n

    I l o v e y o u w i t h a l l m y h e a r t .

    P e t e r

    T o m y p a r e n t s , M a n n y a n d M a r i a

    http://www.wordware.com/files/dx9
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    2/513

    2

    A d r i a n

    O r i g i n a l e d i t i o n f o r D i r e c t X v e r s i o n 7 . 0 w r i t t e n b y A d r i a n P e r e z w i t h D a n R o y e r . R e v i s e d a n d u p d a t e d b y P e t e r W a l s h .

    A c k n o w l e d g m e n t s

    L i k e A d r i a n s a y s b e l o w , t h i s b o o k , l i k e a n y o t h e r , w a s n o t j u s t t h e w o r k o f o n e ( o r t w o o r t h r e e ) p e o p l e ; t h e r e h a v e b e e n

    s o m a n y p e o p l e o v e r t h e y e a r s w h o h a v e h e l p e d m e i n o n e w a y o r a n o t h e r , a n d t h e r e s u l t o f a l l t h e s e e f f o r t s

    c o n t r i b u t e d t o t h e k n o w l e d g e c o n t a i n e d i n t h i s b o o k . I w i l l t r y t o t h a n k e v e r y o n e I c a n . M y u p d a t e o f t h i s b o o k w o u l d n o th a v e o c c u r r e d w i t h o u t t h e h e l p o f T r a c y W i l l i a m s , w h o h a s h e l p e d m e m a n y t i m e s w i t h m y b o o k s . N o t o n l y d i d s h e g e t

    m e g o i n g o n m y f i r s t b o o k , b u t s h e g o t m e h o o k e d u p w i t h W o r d w a r e f o r t h i s b o o k , m y t h i r d . O f c o u r s e , I m u s t t h a n k

    J i m H i l l , W e s B e c k w i t h , a n d T i m M c E v o y o f W o r d w a r e f o r b e i n g s u c h g r e a t p e o p l e t o w o r k w i t h .

    T h a n k s t o P h i l T a y l o r o n t h e D i r e c t X t e a m a t M i c r o s o f t f o r a g r e e i n g t o d o t h e t e c h c h e c k a n d a l s o t o W o l f g a n g E n g e l

    a n d B r u n o S o u s a f o r t h e i r t e c h n i c a l s u p p o r t . O f c o u r s e , t h a n k y o u t o m y w o n d e r f u l f i a n c e e L i s a f o r h e l p i n g t o k e e p m e

    m o t i v a t e d w h i l e w o r k i n g o n t h e b o o k , w h e n I j u s t w a n t e d t o g i v e u p a n d p a r t y !

    W h e r e w o u l d I b e w i t h o u t t h a n k i n g a l l m y f r i e n d s a n d f a m i l y , w h o k e e p m e s a n e d u r i n g t h e m a n y m o n t h s t h a t I s p e n t

    r e s e a r c h i n g a n d w r i t i n g t h e s e m a s s i v e b o o k s . S o t h a n k y o u J o n - P a u l K e a t l e y , S t e w a r t W r i g h t , A n d r e w M c C a l l , T o d d

    F a y , M i k e A n d r e w s , L a z A l l e n , a n d a l l m y o t h e r f r i e n d s a r o u n d t h e w o r l d t h a t I d o n ' t h a v e r o o m t o l i s t ! A l s o , w h o w o u l d I

    b e w r i t i n g a b o o k a n d n o t m e n t i o n i n g m y s o o n - t o - b e f a m i l y - i n - l a w ? S o t h a n k y o u L i a m a n d A n n S u l l i v a n f o r g i v i n g m ep e r m i s s i o n t o m a r r y y o u r b e a u t i f u l d a u g h t e r ( a l s o t o J o a n n e , P a u l i n e , L i a m J r . , a n d t h e r e s t o f t h e f a m i l y ) . O f c o u r s e ,

    t h a n k s t o m y p a r e n t s S i m o n a n d J o y W a l s h f o r b e i n g s o s u p p o r t i v e d u r i n g m y y o u n g e r y e a r s a n d t o t h i s d a y .

    T h e w o r s t t h i n g a b o u t w r i t i n g a c k n o w l e d g m e n t s i s t h a t y o u a l w a y s f o r g e t s o m e o n e w h o h e l p e d y o u u n t i l t h e d a y t h e

    b o o k g o e s t o p r i n t . S o t h a n k y o u t o e v e r y o n e e l s e I f o r g o t p l e a s e a c c e p t m y a p o l o g i e s ; m y p o o r b r a i n i s w o r n o u t a f t e r

    a l l t h i s w o r k !

    P e t e r W a l s h

    T h i s b o o k c o u l d n ' t h a v e b e e n c o m p l e t e d w i t h o u t t h e h e l p a n d g u i d a n c e o f a w h o l e l o t o f p e o p l e . I ' l l t r y t o r e m e m b e r

    t h e m a l l h e r e . F i r s t , t h a n k s t o W e s B e c k w i t h a n d J i m H i l l a t W o r d w a r e P u b l i s h i n g . T h e y w e r e e x t r e m e l y f o r g i v i n g o f m y

    h e c t i c s c h e d u l e , a n d t h e y h e l p e d g u i d e m e t o f i n i s h i n g t h i s b o o k . I a l s o m u s t t h a n k A l e x D u n n e f o r l e t t i n g m e w r i t e a n

    a r t i c l e i n 1 9 9 8 f o r G a m e D e v e l o p e r m a g a z i n e . I f I h a d n ' t w r i t t e n t h a t a r t i c l e , I n e v e r w o u l d h a v e w r i t t e n t h i s b o o k .

    E v e r y t h i n g I k n o w a b o u t t h e t o p i c s i n t h i s b o o k I l e a r n e d f r o m o t h e r p e o p l e . S o m e o f t h e s e p e o p l e w e r e m e n t o r s , o t h e r s

    w e r e b o s s e s , a n d s t i l l o t h e r s w e r e p r o f e s s o r s a n d t e a c h e r s . S o m e w e r e j u s t c o o l p e o p l e w h o t o o k t h e t i m e t o s i t a n d

    t a l k w i t h m e . I c a n ' t t h a n k t h e m e n o u g h . P a u l H e c k b e r t , T o m F u n k h o u s e r , E r i c P e t a j a n , C h a r l e s B o y d , M i k e T o e l l e ,

    K e n t G r i f f i n , D a v i d B a r a f f , R a n d y P a u s c h , H o w i e C h o s e t , M i c h a e l A b r a s h , H u g u e s H o p p e , a n d M a r k S t e h l i k : Y o u g u y s

    r o c k . T h a n k y o u .

    T h a n k s t o M i c r o s o f t , A T I , n V i d i a , i d S o f t w a r e , a n d L y d i a C h o y f o r h e l p i n g m e w i t h s o m e o f t h e i m a g e s u s e d i n t h e t e x t .

    M a n y p e o p l e h e l p e d a s s u r e t h e t e c h n i c a l c o r r e c t n e s s a n d g e n e r a l s a n i t y o f t h i s t e x t . I a n P a r b e r r y a n d h i s c l a s s a t

    U n i v e r s i t y o f N o r t h T e x a s w e r e i m m e n s e l y h e l p f u l : T h a n k s , g u y s . M i c h a e l K r a u s e w a s a n i n d i s p e n s a b l e h e l p i n

    a s s u r i n g t h e c o r r e c t n e s s o f t h e D i r e c t X c h a p t e r s . B o b G a i n e s , M i k e y W e t z e l , a n d J a s o n S a n d l i n f r o m t h e D i r e c t X t e a m

    a t M i c r o s o f t h e l p e d m a k e s u r e C h a p t e r s 2 , 3 , 4 , 8 , a n d 1 0 w e r e s h i p s h a p e : M a d p r o p s t o t h e m . D a v i d B l a c k w a s k i n d

    e n o u g h t o l o o k o v e r C h a p t e r 1 1 a n d h e l p r e m o v e s o m e e r r o r s a n d c l a r i f y a f e w p o i n t s .

    F i n a l l y , I n e e d t o t h a n k a l l o f t h e p e o p l e w h o h e l p e d m e g e t t h i s t h i n g d o n e . I k n o w I w o n ' t b e a b l e t o r e m e m b e r a l l o f

    t h e m , b u t h e r e ' s a s h o r t l i s t : M a n u a l a n d M a r i a P e r e z , K a t h e r i n P e p e r z a k , L y d i a C h o y ( a g a i n ) , M i k e S c h u r e s k o , M i k e

    B r e e n ( a n d t h e r e s t o f t h e O r i g i n a l s ) , V i c k M u k h e r j e e , P a t r i c k N e l s o n , B r i a n S h a r p , a n d M a r c i n K r i e g e r .

    A d r i a n P e r e z

    A b o u t t h e a u t h o r

    P e t e r W a l s h i s a p r o f e s s i o n a l g a m e p r o g r a m m e r a t V i s u a l S c i e n c e L t d . , w h e r e h e h a s w o r k e d o n a n u m b e r o f t i t l e s

    i n c l u d i n g t h e F o r m u l a 1 s e r i e s o f g a m e s , H a r r y P o t t e r a n d t h e C h a m b e r o f S e c r e t s , a n d o t h e r s f o r E l e c t r o n i c A r t s , t h e

    w o r l d ' s l e a d i n g p u b l i s h e r o f c o m p u t e r g a m e s . H e h a s s t u d i e d f o r a d e g r e e i n c o m p u t e r g a m e s d e v e l o p m e n t a t A b e r t a y

    U n i v e r s i t y i n D u n d e e , S c o t l a n d , a n d h a s w o r k e d w i t h I C - C A V E , a t h i n k t a n k f o r t h e n e x t g e n e r a t i o n o f g a m i n g

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    3/513

    3

    t e c h n o l o g y .

    T h e c o m p l e t e s o u r c e c o d e i n C + + , i n c l u d i n g a g a m e d e m o n s t r a t i n g t e c h n i q u e s c o v e r e d i n t h i s b o o k , c a n b e

    d o w n l o a d e d f r o m h t t p : / / w w w . w o r d w a r e . c o m / f i l e s / d x 9 .

    http://www.wordware.com/files/dx9
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    4/513

    4

    . .A d v a n c e d 3 D G a m e P r o g r a m m i n g w i t h D i r e c t X 9 . 0

    b y P e t e r W a l s h I S B N : 1 5 5 6 2 2 9 6 8 2

    W o r d w a r e P u b l i s h i n g 2 0 0 3 ( 5 2 5 p a g e s )

    D e s i g n e d f o r p r o g r a m m e r s w h o a r e n e w t o g r a p h i c s a n d g a m e p r o g r a m m i n g , t h i s b o o k c o v e r s

    D i r e c t 3 D , D i r e c t I n p u t , a n d D i r e c t S o u n d , a s w e l l a s a r t i f i c i a l i n t e l l i g e n c e , n e t w o r k i n g ,

    m u l t i t h r e a d i n g , a n d s c e n e m a n a g e m e n t .

    C o m p a n i o n W e b S i t e

    T a b l e o f C o n t e n t s B a c k C o v e r

    T a b l e o f C o n t e n t s

    A d v a n c e d 3 D G a m e P r o g r a m m i n g U s i n g D i r e c t X 9 . 0

    I n t r o d u c t i o n

    C h a p t e r 1 - W i n d o w s

    C h a p t e r 2 - G e t t i n g S t a r t e d w i t h D i r e c t X

    C h a p t e r 3 - C o m m u n i c a t i n g w i t h D i r e c t I n p u t

    C h a p t e r 4 - D i r e c t S o u n d

    C h a p t e r 5 - 3 D M a t h F o u n d a t i o n s

    C h a p t e r 6 - A r t i f i c i a l I n t e l l i g e n c e

    C h a p t e r 7 - U D P N e t w o r k i n g

    C h a p t e r 8 - B e g i n n i n g D i r e c t 3 D

    C h a p t e r 9 - A d v a n c e d 3 D P r o g r a m m i n g

    C h a p t e r 1 0 - A d v a n c e d D i r e c t 3 D

    C h a p t e r 1 1 - S c e n e M a n a g e m e n t

    A p p e n d i x - A n S T L P r i m e r

    http://www.wordware.com/files/dx9http://browsepartners.asp/?item=206
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    5/513

    5

    I n t r o d u c t i o n

    A w i s e m a n s o m e w h e r e , s o m e h o w , a t s o m e p o i n t i n h i s t o r y , m a y h a v e s a i d t h e b e s t w a y t o s t a r t a b o o k i s w i t h a n

    a n e c d o t e . I w o u l d n e v e r q u e s t i o n t h e w o r d s o f a w i s e m a n w h o m a y o r m a y n o t h a v e e x i s t e d , s o h e r e w e g o .

    W h e n I w a s a f r e s h m a n i n h i g h s c h o o l b a c k i n 1 9 9 3 , I t o o k t h e r e q u i r e d b i o l o g y c l a s s t h a t m o s t k i d s m y a g e e n d u p

    h a v i n g t o t a k e . I t i n v o l v e d e x p e r i m e n t s , l a b r e p o r t s , d i s s e c t i n g o f v a r i o u s a n i m a l s , a n d t h e l i k e . O n e o f m y l a b p a r t n e r s

    w a s a f e l l o w n a m e d C h r i s V . W e w e r e b o t h i n t e r e s t e d i n c o m p u t e r s a n d q u i c k l y b e c a m e f r i e n d s , t o t h e p o i n t w h e r e

    t a l k i n g a b o u t b i o l o g y i n c l a s s w a s s e c o n d t o t e c h n o - b a b b l e .

    O n e n i g h t , i n t h e m i d d l e o f D e c e m b e r , C h r i s c a l l e d m e u p . T h e l a b r e p o r t t h a t w a s d u e t h e n e x t d a y r e q u i r e d r e s u l t s

    f r o m t h e e x p e r i m e n t w e h a d d o n e t o g e t h e r i n c l a s s , a n d h e h a d l o s t h i s c o p y o f o u r e x p e r i m e n t r e s u l t s . H e w a n t e d t o

    k n o w i f I c o u l d c o p y m i n e a n d b r i n g t h e m o v e r t o h i s p l a c e s o h e c o u l d f i n i s h w r i t i n g u p t h e l a b . O f c o u r s e , t h i s w a s i n

    t h o s e h e i n o u s p r e - c a r d a y s , s o d r i v i n g t o h i s h o u s e r e q u i r e d t a l k i n g m y p a r e n t s i n t o i t , f i n d i n g h i s a d d r e s s , a n d v a r i o u s

    o t h e r h a r d s h i p s . W h i l e I w a s w i l l i n g t o d o h i m t h e f a v o r , I w a s n ' t w i l l i n g t o d o i t f o r f r e e . S o I a s k e d h i m w h a t h e c o u l d d o

    t o r e c i p r o c a t e m y k i n d g e s t u r e .

    " W e l l , " h e s a i d , " I g u e s s I c a n g i v e y o u a c o p y o f t h i s g a m e I j u s t g o t . "

    " R e a l l y ? W h a t ' s i t c a l l e d ? " I s a i d .

    "D o o m . B y t h e W o l f 3 D g u y s . " " I t ' s c a l l e d D o o m ? W h a t k i n d o f n a m e i s t h a t ? ? "

    A f t e r g e t t i n g t h e r e s u l t s t o h i s h o u s e a n d t h e g a m e t o m i n e , I f i r e d t h e p r o g r a m u p o n m y c r e a k y o l d 3 8 6 D X - 2 0 c l o n e ,

    b u r n i n g r u b b e r w i t h a w h o p p i n g 4 M B o f R A M . A s m y s p a c e m a r i n e t o o k h i s f i r s t t e n u o u s s t e p s d o w n t h e c o r r i d o r s

    i n f e s t e d w i t h h e l l s p a w n , m y l i f e c h a n g e d . I h a d d o n e s o m e p r o g r a m m i n g b e f o r e i n s c h o o l ( L o g o a n d B a s i c ) , b u t a f t e r I

    f i n i s h e d p l a y i n g t h e f i r s t t i m e , I h a d a c l e a r p i c t u r e i n m y h e a d o f w h a t I w a n t e d t o d o w i t h m y l i f e : I w a n t e d t o w r i t e

    g a m e s , s o m e t h i n g l i k e D o o m . I p o p p e d o n t o a f e w l o c a l b u l l e t i n b o a r d s a n d a s k e d t w o q u e s t i o n s : W h a t l a n g u a g e w a s

    t h e g a m e w r i t t e n i n , a n d w h a t c o m p i l e r w a s u s e d ?

    W i t h i n a d a y o r s o , I p u r c h a s e d W a t c o m C 1 0 . 0 a n d g o t m y f i r s t b o o k o n C p r o g r a m m i n g . M y f i r s t C p r o g r a m w a s

    " H e l l o , W o r l d . " M y s e c o n d w a s a s l o w , c r a s h - h a p p y , n o n - r o b u s t , w i r e f r a m e s p i n n i n g c u b e .

    I t i p m y h a t t o J o h n C a r m a c k , J o h n R o m e r o , a n d t h e r e s t o f t h e t e a m b e h i n d D o o m ; m y l o v e f o r c r e a t i n g g a m e s w a s

    f u l l y r e a l i z e d v i a t h e i r m a s t e r p i e c e . I t ' s b e c a u s e o f t h e m t h a t I l e a r n e d e v e r y t h i n g t h a t I h a v e a b o u t t h i s e x c e p t i o n a l l y

    i n t e r e s t i n g a n d d y n a m i c a r e a o f c o m p u t e r a c q u i r e d p r o g r a m m i n g . T h e k n o w l e d g e t h a t I h a v e i s w h a t I h o p e t o f i l l t h e s e

    p a g e s w i t h , s o o t h e r p e o p l e c a n g e t i n t o g r a p h i c s a n d g a m e p r o g r a m m i n g .

    I ' v e f o u n d t h a t t h e b e s t w a y t o g e t a l o t o f u s e f u l i n f o r m a t i o n d o w n i n a s h o r t a m o u n t o f s p a c e i s t o u s e t h e

    t r i e d - a n d - t r u e F A Q ( f r e q u e n t l y a s k e d q u e s t i o n s ) f o r m a t . I f i g u r e d i f p e o p l e n e e d e d a n s w e r s t o s o m e q u e s t i o n s a b o u t

    t h i s b o o k a s t h e y s t o o d i n t h e i r l o c a l b o o k s t o r e t r y i n g t o d e c i d e w h e t h e r o r n o t t o b u y i t , t h e s e w o u l d b e t h e m .

    W h o a r e y o u ? W h a t a r e y o u d o i n g h e r e ?

    W e l l I , b e i n g P e t e r r a t h e r t h a n A d r i a n , a m a p r o f e s s i o n a l g a m e s p r o g r a m m e r a n d h a v e b e e n f o r a q u i t e a f e w y e a r s . I

    s t a r t e d o u t l i k e m o s t p e o p l e t h e s e d a y s , g e t t i n g e x t r e m e l y i n t e r e s t e d i n h o w g a m e s w o r k e d a f t e r D o o m c a m e o u t . A f t e r

    t e a c h i n g m y s e l f p r o g r a m m i n g , I m o v e d o n t o s t u d y f o r a d e g r e e i n c o m p u t e r g a m e s d e v e l o p m e n t a t A b e r t a y U n i v e r s i t y

    i n D u n d e e , S c o t l a n d . A f t e r t h a t I w e n t o n t o w o r k f o r a s h o r t w h i l e w i t h I C - C A V E , w h i c h i s a t h i n k t a n k f o r t h e n e x t

    g e n e r a t i o n o f g a m i n g t e c h n o l o g y . O v e r t h e y e a r s I ' v e w o r k e d o n g a m e s l i k e F 1 C a r e e r C h a l l e n g e , H a r r y P o t t e r a n d t h e

    C h a m b e r o f S e c r e t s , S H O X , a n d t h e u p c o m i n g M e d a l o f H o n o r : R i s i n g S u n . I ' v e d e v e l o p e d g a m e s f o r t h e P C , G a m e

    B o y , D r e a m c a s t , P S 2 , G a m e C u b e , a n d X b o x . I ' v e a l s o w r i t t e n t w o o t h e r b o o k s o v e r t h e l a s t t w o y e a r s o n D i r e c t X

    p r o g r a m m i n g .

    I ' v e a l s o r e a d s o m a n y p r o g r a m m i n g b o o k s t h a t I r e c k o n I h a v e p e r s o n a l l y w i p e d o u t h a l f o f t h e A m a z o n r a i n f o r e s t . S o

    h o p e f u l l y a l l t h a t m a t e r i a l w i l l h e l p m e w r i t e t h i s b o o k i n a w a y t h a t a v o i d s a l l t h e p i t f a l l s t h a t o t h e r a u t h o r s h a v e f a l l e ni n t o . I r e a l l y h o p e y o u l e a r n a l o t f r o m t h i s b o o k . I f y o u h a v e a n y q u e s t i o n s a l o n g t h e w a y t h a t y o u j u s t c a n ' t g e t t o t h e

    b o t t o m o f , p l e a s e e m a i l m e a t m r z e n @ m s n . c o m . U n f o r t u n a t e l y , a f t e r p r i n t i n g t h a t e m a i l i n a p r e v i o u s b o o k i t w a s

    b o m b a r d e d b y j u n k m a i l f r o m s p a m m e r s a n d b e c a m e a l m o s t u n u s a b l e . H o w e v e r , H o t m a i l h a s g o t t e n b e t t e r l a t e l y , s o

    mailto:[email protected]
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    6/513

    6

    h o p e f u l l y y o u r q u e s t i o n s w i l l g e t t h r o u g h t o m e !

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    7/513

    7

    W h y w a s t h i s b o o k w r i t t e n ?

    I ' v e l e a r n e d f r o m m a n y a m a z i n g l y b r i l l i a n t p e o p l e , c o v e r e d a l o t o f d i f f i c u l t g r o u n d , a n d a s k e d a l o t o f d u m b q u e s t i o n s .

    O n e t h i n g t h a t I ' v e f o u n d i s t h a t t h e g a m e d e v e l o p m e n t i n d u s t r y i s a l l a b o u t s h a r i n g . I f e v e r y o n e s h a r e s , e v e r y o n e

    k n o w s m o r e s t u f f , a n d t h e n e t k n o w l e d g e o f t h e i n d u s t r y i n c r e a s e s . T h i s i s a g o o d t h i n g b e c a u s e t h e n w e a l l g e t t o p l a y

    b e t t e r g a m e s . N o o n e p e r s o n c o u l d d i s c o v e r a l l t h e p r i n c i p l e s b e h i n d c o m p u t e r g r a p h i c s a n d g a m e p r o g r a m m i n gt h e m s e l v e s , a n d n o o n e c a n l e a r n i n a v a c u u m . P e o p l e t o o k t h e t i m e t o s h a r e w h a t t h e y l e a r n e d w i t h m e , a n d n o w I ' m

    t a k i n g t h e t i m e t o s h a r e w h a t I ' v e l e a r n e d w i t h y o u .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    8/513

    8

    W h o s h o u l d r e a d t h i s b o o k ?

    T h i s b o o k w a s i n t e n d e d s p e c i f i c a l l y f o r p e o p l e w h o k n o w h o w t o p r o g r a m a l r e a d y b u t h a v e t a k e n o n l y r u d i m e n t a r y

    s t a b s a t g r a p h i c s / g a m e p r o g r a m m i n g o r n e v e r t a k e n a n y s t a b a t a l l , s u c h a s p r o g r a m m e r s i n a n o t h e r f i e l d o r c o l l e g e

    s t u d e n t s l o o k i n g t o e m b a r k o n s o m e s i d e p r o j e c t s .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    9/513

    9

    W h o s h o u l d n o t r e a d t h i s b o o k ?

    T h i s b o o k w a s n o t d e s i g n e d f o r b e g i n n e r s . I ' m n o t t r y i n g t o s o u n d a r r o g a n t o r a n y t h i n g ; I ' m s u r e a b e g i n n e r w i l l b e a b l e

    t o t r u d g e t h r o u g h t h i s b o o k i f h e o r s h e f e e l s u p t o i t . H o w e v e r , s i n c e I ' m s o c o n s t r a i n e d f o r s p a c e , o f t e n - t i m e s I n e e d t o

    b r e e z e p a s t c e r t a i n c o n c e p t s ( s u c h a s i n h e r i t a n c e i n C + + ) . I f y o u ' v e n e v e r p r o g r a m m e d b e f o r e , y o u ' l l h a v e a n

    e x c e e d i n g l y d i f f i c u l t t i m e w i t h t h i s b o o k .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    10/513

    1 0

    W h a t a r e t h e r e q u i r e m e n t s f o r u s i n g t h e c o d e ?

    T h e c o d e w a s w r i t t e n i n C + + , u s i n g M i c r o s o f t V i s u a l C + + 6 . 0 . T h e . D S P s a n d . D S W s a r e p r o v i d e d o n t h e

    d o w n l o a d a b l e f i l e s ( h t t p : / / w w w . w o r d w a r e . c o m / f i l e s / d x 9 ) ; t h e . D S P s w i l l w o r k w i t h v e r s i o n s p r e v i o u s t o 6 . 0 , a n d t h e

    . D S W s w i l l w o r k w i t h 6 . 0 a n d u p . I f y o u c h o o s e t o u s e a d i f f e r e n t c o m p i l e r , g e t t i n g t h e s o u r c e c o d e t o w o r k s h o u l d b e a

    f a i r l y t r i v i a l t a s k . I s p e c i f i c a l l y w r o t e t h i s c o d e t o u s e a s l i t t l e n o n - s t a n d a r d C + + a s p o s s i b l e ( a s f a r a s I k n o w , t h e o n l yn o n - s t a n d a r d C + + I u s e i s n a m e l e s s s t r u c t u r e s w i t h i n u n i o n s ) .

    http://www.wordware.com/files/dx9
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    11/513

    1 1

    W h y u s e W i n d o w s ? W h y n o t u s e L i n u x ?

    I c h o s e t o u s e W i n 3 2 a s t h e A P I e n v i r o n m e n t b e c a u s e 9 0 p e r c e n t o f c o m p u t e r u s e r s c u r r e n t l y w o r k o n W i n d o w s .

    W i n 3 2 i s n o t a n e a s y A P I t o u n d e r s t a n d , e s p e c i a l l y a f t e r u s i n g D O S c o d i n g c o n v e n t i o n s . I t i s n ' t t e r r i b l y e l e g a n t e i t h e r ,

    b u t I s u p p o s e i t c o u l d b e w o r s e . I c o u l d c h o o s e o t h e r p l a t f o r m s t o w o r k o n , b u t d o i n g s o r e d u c e s m y t a r g e t a u d i e n c e b y

    a f a c t o r o f n i n e o r m o r e .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    12/513

    1 2

    W h y u s e D i r e c t 3 D ? W h y n o t u s e O p e n G L ?

    F o r t h o s e o f y o u w h o h a v e n e v e r u s e d i t , O p e n G L i s a n o t h e r g r a p h i c s A P I . S i l i c o n G r a p h i c s d e s i g n e d i t i n t h e e a r l y

    ' 9 0 s f o r u s e o n t h e i r h i g h - e n d g r a p h i c s w o r k s t a t i o n s . I t h a s b e e n p o r t e d t o c o u n t l e s s p l a t f o r m s a n d o p e r a t i n g s y s t e m s .

    O u t s i d e o f t h e g a m e s i n d u s t r y i n a r e a s l i k e s i m u l a t i o n a n d a c a d e m i c r e s e a r c h , O p e n G L i s t h e d e f a c t o s t a n d a r d f o r

    d o i n g c o m p u t e r g r a p h i c s . I t i s a s i m p l e , e l e g a n t , a n d f a s t A P I . C h e c k o u t h t t p : / / w w w . o p e n g l . o r g f o r m o r e i n f o r m a t i o n .

    B u t i t i s n ' t p e r f e c t . F i r s t o f a l l , O p e n G L h a s a l a r g e a m o u n t o f f u n c t i o n a l i t y i n i t . M a k i n g t h e i n t e r f a c e s o s i m p l e r e q u i r e s

    t h a t t h e i m p l e m e n t a t i o n t a k e c a r e o f a l o t o f u g l y d e t a i l s t o m a k e s u r e e v e r y t h i n g w o r k s c o r r e c t l y . B e c a u s e o f t h e w a y

    d r i v e r s a r e i m p l e m e n t e d , e a c h c o m p a n y t h a t m a k e s a 3 D c a r d h a s t o s u p p o r t t h e e n t i r e O p e n G L f e a t u r e s e t i n o r d e r t o

    h a v e a f u l l y c o m p l i a n t O p e n G L d r i v e r . T h e s e d r i v e r s a r e e x t r e m e l y d i f f i c u l t t o i m p l e m e n t c o r r e c t l y , a n d t h e p e r f o r m a n c e

    o n e q u a l h a r d w a r e c a n v a r y w i l d l y b a s e d o n d r i v e r q u a l i t y . I n a d d i t i o n , D i r e c t X h a s t h e a d d e d a d v a n t a g e o f b e i n g a b l e

    t o m o v e q u i c k l y t o a c c o m m o d a t e n e w h a r d w a r e f e a t u r e s . D i r e c t X i s c o n t r o l l e d b y M i c r o s o f t ( w h i c h c a n b e a g o o d o r

    b a d t h i n g , d e p e n d i n g o n y o u r v i e w o f i t ) , w h i l e O p e n G L e x t e n s i o n s n e e d t o b e d e l i b e r a t e d b y c o m m i t t e e s .

    M y i n i t i a l h o p e w a s t o h a v e t w o v e r s i o n s o f t h e s o u r c e c o d e o n e f o r W i n d o w s a n d D i r e c t 3 D a n d t h e o t h e r f o r L i n u x

    a n d O p e n G L . T h i s e n d e d u p n o t b e i n g p o s s i b l e , s o I h a d t o c h o o s e o n e o r t h e o t h e r ; I c h o s e D i r e c t 3 D .

    http://www.opengl.org/
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    13/513

    1 3

    W h y u s e C + + ? W h y n o t C , A S M , o r J a v a ?

    I h a d a f e w o t h e r l a n g u a g e c h o i c e s t h a t I w a s k i c k i n g a r o u n d w h e n p l a n n i n g t h i s b o o k . A l t h o u g h t h e r e a r e a c o l y t e s o u t

    t h e r e f o r D e l p h i , V B , a n d e v e n C # , t h e o n l y l a n g u a g e s I s e r i o u s l y c o n s i d e r e d w e r e C + + , J a v a , a n d C . J a v a i s d e s i g n e d

    b y S u n M i c r o s y s t e m s a n d a n i n h e r e n t l y o b j e c t - o r i e n t e d l a n g u a g e , w i t h s o m e h i g h - l e v e l l a n g u a g e f e a t u r e s l i k e g a r b a g e

    c o l l e c t i o n . C i s a b o u t a s l o w l e v e l a s p r o g r a m m i n g g e t s w i t h o u t d i p p i n g i n t o a s s e m b l y . I t h a s v e r y f e w i f a n y h i g h - l e v e lc o n s t r u c t s a n d d o e s n ' t a b s t r a c t a n y t h i n g a w a y f r o m t h e p r o g r a m m e r .

    C + + i s a n i n t e r e s t i n g l a n g u a g e b e c a u s e i t e s s e n t i a l l y s i t s d i r e c t l y b e t w e e n t h e f u n c t i o n a l i t y o f t h e o t h e r t w o l a n g u a g e s .

    C + + s u p p o r t s C O M b e t t e r t h a n C d o e s ( t h i s i s m o r e t h o r o u g h l y d i s c u s s e d i n C h a p t e r 1 ) . A l s o , c l a s s s y s t e m s a n d

    o p e r a t o r o v e r l o a d i n g g e n e r a l l y m a k e c o d e e a s i e r t o r e a d ( a l t h o u g h , o f c o u r s e , a n y g o o d t h i n g c a n a n d w i l l b e a b u s e d ) .

    J a v a , a l t h o u g h v e r y c o o l , i s a n i n t e r p r e t e d l a n g u a g e . E v e r y y e a r t h i s s e e m s t o b e l e s s i m p o r t a n t : J I T c o m p i l a t i o n g e t s

    f a s t e r a n d m o r e g r u n t w o r k i s h a n d e d o f f t o t h e A P I s . H o w e v e r , I f e l t C + + w o u l d b e a b e t t e r f i t f o r t h e b o o k . J a v a i s s t i l l

    a v e r y y o u n g l a n g u a g e a n d i s s t i l l g o i n g t h r o u g h a l o t o f c h a n g e .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    14/513

    1 4

    D o I n e e d a 3 D a c c e l e r a t o r ?

    T h a t d e p e n d s . T e c h n i c a l l y , n o , y o u c a n g e t b y w i t h o u t a n y a c c e l e r a t o r a t a l l , u s i n g D i r e c t 3 D ' s s o f t w a r e r a s t e r i z e r .

    H o w e v e r , i t ' s e x t r e m e l y s l o w , f a r f r o m r e a l t i m e f o r a n y t h i n g b u t t r i v i a l l y s i m p l e s c e n e s . I t ' s a l m o s t i m p o s s i b l e t o b u y a

    c o m p u t e r t h e s e d a y s w i t h o u t s o m e s o r t o f 3 D a c c e l e r a t i o n , a n d a n a c c e l e r a t o r c a p a b l e o f h a n d l i n g a l l t h e c o d e i n t h i s

    b o o k c a n b e p u r c h a s e d f o r u n d e r $ 1 0 0 .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    15/513

    1 5

    H o w h a r d c o r e i s t h e C + + i n t h i s b o o k ?

    S o m e p e o p l e s e e C + + a s a d i v i n e b l a d e t o s m i t e t h e w i c k e d . T h e y t a k e c o n t r o l o f t e m p l a t e c l a s s e s t h e l i k e s o f w h i c h

    y o u h a v e n e v e r s e e n . T h e y o v e r l o a d t h e i o s t r e a m o p e r a t o r s f o r a l l o f t h e i r c l a s s e s . T h e y s e e m u l t i p l e i n h e r i t a n c e a s a

    h e l l s p a w n o f S a t a n h i m s e l f . I s e e C + + a s a t o o l . T h e m o r e e s o t e r i c f e a t u r e s o f t h e l a n g u a g e ( s u c h a s t h e i o s t r e a m

    l i b r a r y ) I d o n ' t u s e a t a l l . L e s s e s o t e r i c f e a t u r e s ( l i k e m u l t i p l e i n h e r i t a n c e ) I u s e w h e n i t m a k e s s e n s e . H a v i n g a c o d i n gs t y l e y o u s t i c k t o i s i n v a l u a b l e . T h e c o d e f o r t h i s b o o k w a s w r i t t e n o v e r a n e l e v e n - m o n t h p e r i o d , p l u s a n o t h e r t h r e e f o r

    t h e r e v i s i o n , b u t I c a n p i c k u p t h e c o d e I w r o t e a t t h e b e g i n n i n g a n d s t i l l g r o k i t b e c a u s e I c o m m e n t e d a n d u s e d s o m e

    g o o d c o n v e n t i o n s . I f I c a n u n d e r s t a n d i t , h o p e f u l l y y o u c a n t o o .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    16/513

    1 6

    W h a t a r e t h e c o d i n g c o n v e n t i o n s u s e d i n t h e s o u r c e ?

    O n e o f t h e g r e a t e s t b o o k s I ' v e e v e r r e a d o n p r o g r a m m i n g w a s C o d e C o m p l e t e ( M i c r o s o f t P r e s s ) . I t ' s a h a n d b o o k o n

    h o w t o p r o g r a m w e l l ( n o t j u s t h o w t o p r o g r a m ) . N u a n c e s l i k e t h e l e n g t h o f v a r i a b l e n a m e s , d e s i g n o f s u b r o u t i n e s , a n d

    l e n g t h o f f i l e s a r e c o v e r e d i n d e t a i l i n t h i s b o o k ; I s t r o n g l y e n c o u r a g e a n y o n e w h o w a n t s t o b e c o m e a g r e a t

    p r o g r a m m e r t o p i c k i t u p . Y o u m a y n o t i c e t h a t s o m e o f t h e c o n v e n t i o n s I u s e i n t h i s b o o k a r e s i m i l a r t o t h e c o n v e n t i o n sd e s c r i b e d i n C o d e C o m p l e t e ; s o m e o f t h e m a r e b o r r o w e d f r o m t h e g r e a t g a m e p r o g r a m m e r s l i k e J o h n C a r m a c k , a n d

    s o m e o f t h e m a r e b o r r o w e d f r o m s o u r c e i n D i r e c t X , M F C , a n d W i n 3 2 .

    I ' v e t r i e d r e a l l y h a r d t o m a k e t h e c o d e i n t h i s b o o k a c c e s s i b l e t o e v e r y o n e . I c o m m e n t a n y t h i n g I t h i n k i s u n c l e a r , I s t r i v e

    f o r g o o d c h o i c e i n v a r i a b l e n a m e s , a n d I t r y t o m a k e m y c o d e l o o k c l e a n w h i l e s t i l l t r y i n g t o b e f a s t . O f c o u r s e , I c a n ' t

    p l e a s e e v e r y o n e . A s s u r e d l y , t h e r e a r e s o m e C + + c o d i n g s t a n d a r d s I ' m p r o b a b l y n o t f o l l o w i n g c o r r e c t l y . T h e r e a r e

    s o m e p i e c e s o f c o d e t h a t w o u l d g e t m u c h f a s t e r w i t h a l i t t l e o b f u s c a t i o n .

    I f y o u ' v e n e v e r u s e d C + + b e f o r e o r a r e n e w t o p r o g r a m m i n g , t h i s b o o k i s g o i n g t o b e e x t r e m e l y h a r d t o d i g e s t . A g o o d

    d i s c u s s i o n o n p r o g r a m m i n g e s s e n t i a l s a n d t h e C + + l a n g u a g e i s C + + P r i m e r ( L i p p m a n e t a l . ; A d d i s o n - W e s l e y

    P u b l i s h i n g ) .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    17/513

    1 7

    C l a s s / S t r u c t u r e N a m e s

    M F C n a m e s i t s c l a s s e s w i t h a p r e f i x e d C . A s a n e x a m p l e , a c l a s s t h a t r e p r e s e n t s t h e f u n c t i o n a l i t y o f a b u t t o n i s c a l l e d

    C B u t t o n . I l i k e t h i s f i n e , b u t d u e t o n a m e s p a c e c l a s h i n g , I i n s t e a d p r e f i x m y o w n c l a s s e s w i t h a l o w e r c a s e c f o r c l a s s e s ,

    a l o w e r c a s e s f o r s t r u c t s , a l o w e r c a s e i f o r i n t e r f a c e s , a n d a l o w e r c a s e e f o r e n u m e r a t i o n s ( c B u t t o n o r s B u t t o n ) .

    T h e r e i s o n e n o t a b l e e x c e p t i o n . W h i l e m o s t c l a s s e s a r e i n t e n d e d t o h i d e f u n c t i o n a l i t y a w a y a n d a c t a s c o m p o n e n t s ,

    t h e r e a r e a f e w c l a s s e s / s t r u c t u r e s t h a t a r e i n t e n d e d t o b e i n s t a n t i a t e d a s b a s i c p r i m i t i v e s . S o f o r b a s i c m a t h e m a t i c

    p r i m i t i v e s l i k e p o i n t s a n d m a t r i c e s , I h a v e n o p r e f i x , a n d I p o s t f i x w i t h t h e d i m e n s i o n o f t h e p r i m i t i v e ( 2 D p o i n t s a r e

    p o i n t 2 , 3 D p o i n t s a r e p o i n t 3 , e t c . ) . T h i s i s t o a l l o w t h e m t o h a v e t h e s a m e l o o k a n d f e e l a s t h e i r c l o s e s t c o n c e p t u a l

    n e i g h b o r , f l o a t . F o r t h e s a m e r e a s o n , a l l o f t h e m a t h e m a t i c p r i m i t i v e s h a v e m a n y o v e r l o a d e d o p e r a t o r s t o s i m p l i f y

    m a t h - l a d e n c o d e .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    18/513

    1 8

    V a r i a b l e N a m e s

    S e m i - l o n g v a r i a b l e n a m e s a r e a g o o d t h i n g . T h e y m a k e y o u r c o d e s e l f - c o m m e n t i n g . O n e n e e d s t o b e c a r e f u l t h o u g h :

    M a k e t h e m t o o l o n g , a n d t h e y d i s t r a c t f r o m b o t h t h e c o d e i t s e l f a n d t h e p r o c e s s o f w r i t i n g i t .

    I u s e s h o r t v a r i a b l e s v e r y s p o r a d i c a l l y ; i n t i , j , k p o p u p a l o t i n m y c o d e f o r l o o p s a n d w h a t n o t , b u t b e s i d e s t h a t I s t r i v et o g i v e m e a n i n g f u l n a m e s t o t h e v a r i a b l e s I u s e . U s u a l l y , t h i s m e a n s t h a t t h e y h a v e m o r e t h a n o n e w o r d i n t h e m . T h e

    s y s t e m I u s e s p e c i f i e s l o w e r c a s e f o r t h e f i r s t w o r d a n d i n i t i a l c a p f o r e a c h w o r d a f t e r t h a t , w i t h n o u n d e r s c o r e s ( a n

    e x a m p l e w o u l d b e i n t n u m O b j e c t s ) . I f t h e l a s t l e t t e r o f a w o r d i s a c a p i t a l l e t t e r , a n u n d e r s c o r e i s p l a c e d t o s e p a r a t e i t

    f r o m t h e n e x t w o r d ( e x a m p l e : c l a s s c D 3 D _ A p p ) .

    A p o p u l a r n o m e n c l a t u r e f o r v a r i a b l e s i s H u n g a r i a n n o t a t i o n , w h i c h w e t o u c h o n i n C h a p t e r 1 . I ' m n o t h a r d c o r e a b o u t i t ,

    b u t g e n e r a l l y m y f l o a t s a r e p r e f i x e d w i t h " f , " m y i n t s w i t h " i , " a n d m y p o i n t e r s w i t h " p " ( e x a m p l e s : f l o a t f T i m e r ; i n t

    i S t r i n g S i z e ; c h a r * p B u f f e r ) . N o t e t h a t t h e p r e f i x c o u n t s a s t h e f i r s t w o r d , m a k i n g a l l w o r d s a f t e r i t c a p s . ( I f i n d p B u f f e r

    m u c h m o r e r e a d a b l e t h a n p b u f f e r . )

    I a l s o u s e p r e f i x e s t o d e f i n e s p e c i a l q u a l i t i e s o f v a r i a b l e s . G l o b a l v a r i a b l e s a r e p r e c e d e d w i t h a " g _ " ( a n e x a m p l e w o u l d

    b e i n t g _ h I n s t a n c e ) ; s t a t i c v a r i a b l e s a r e p r e c e d e d w i t h a n " s _ " ( s t a t i c f l o a t s _ f T i m e r ) ; a n d m e m b e r v a r i a b l e s o f c l a s s e sa r e p r e c e d e d w i t h a n " m _ " ( i n t m _ i N u m E l e m e n t s ) .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    19/513

    1 9

    C o m p a n i o n F i l e s

    T h e c o m p a n i o n f i l e s c a n b e d o w n l o a d e d f r o m t h e f o l l o w i n g w e b s i t e :

    h t t p : / / w w w . w o r d w a r e . c o m / f i l e s / d x 9

    T h e s e f i l e s i n c l u d e t h e s o u r c e c o d e d i s c u s s e d i n t h e b o o k a l o n g w i t h t h e g a m e M o b o t s A t t a c k ! . E a c h c h a p t e r ( a n d t h e

    g a m e ) h a s i t s o w n w o r k s p a c e s o y o u c a n u s e t h e m i n d e p e n d e n t l y o f e a c h o t h e r .

    http://www.wordware.com/files/dx9
  • 7/21/2019 C++ DirectX Game Programming for Beginners

    20/513

    2 0

    C h a p t e r 1 : W i n d o w s

    O v e r v i e w

    W e l c o m e , o n e a n d a l l , t o t h e f i r s t s t a g e o f t h e j o u r n e y i n t o t h e d e p t h s o f a d v a n c e d 3 D g a m e d e v e l o p m e n t w i t h D i r e c t X

    9 . 0 . B e f o r e y o u c a n s t a r t e x p l o r i n g t h e w o r l d o f 3 D g a m e p r o g r a m m i n g , y o u n e e d a c a n v a s t o w o r k o n . B a s i c

    o p e r a t i o n s l i k e o p e n i n g a n d c l o s i n g a p r o g r a m , h a n d l i n g r u d i m e n t a r y i n p u t , a n d p a i n t i n g b a s i c p r i m i t i v e s m u s t b e

    d i s c u s s e d b e f o r e y o u c a n p r o p e r l y u n d e r s t a n d m o r e d i f f i c u l t t o p i c s . I f y o u ' r e f a m i l i a r w i t h t h e W i n d o w s A P I , y o u s h o u l d

    b r e e z e t h r o u g h t h i s c h a p t e r ; o t h e r w i s e , h o l d o n t o y o u r s e a t ! I n t h i s c h a p t e r y o u a r e g o i n g t o l e a r n a b o u t :

    T h e t h e o r y b e h i n d W i n d o w s a n d d e v e l o p i n g w i t h t h e W i n 3 2 A P I

    H o w W i n 3 2 g a m e d e v e l o p m e n t d i f f e r s f r o m s t a n d a r d W i n d o w s p r o g r a m m i n g

    M e s s a g e s a n d h o w t o h a n d l e t h e m

    T h e i n f a m o u s m e s s a g e p u m p

    O t h e r m e t h o d s o f W i n d o w s p r o g r a m m i n g s u c h a s M F C

    C O M , o r t h e c o m p o n e n t o b j e c t m o d e l

    A n d m u c h m o r e !

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    21/513

    2 1

    A W o r d a b o u t W i n d o w s

    W i n d o w s p r o g r a m s a r e f u n d a m e n t a l l y d i f f e r e n t i n a l m o s t e v e r y w a y f r o m D O S p r o g r a m s . I n t r a d i t i o n a l D O S p r o g r a m s ,

    y o u h a v e 1 0 0 p e r c e n t o f t h e p r o c e s s o r t i m e , 1 0 0 p e r c e n t c o n t r o l o v e r a l l t h e d e v i c e s a n d f i l e s i n t h e m a c h i n e . Y o u a l s o

    n e e d a n i n t i m a t e k n o w l e d g e o f a l l o f t h e d e v i c e s o n a u s e r ' s m a c h i n e ( y o u p r o b a b l y r e m e m b e r o l d D O S g a m e s , w h i c h

    a l m o s t a l w a y s r e q u i r e d y o u t o i n p u t D M A a n d I R Q s e t t i n g s f o r s o u n d c a r d s ) . W h e n a g a m e c r a s h e d , y o u d i d n ' t n e e d t o

    w o r r y t o o m u c h a b o u t l e a v i n g t h i n g s i n a s t a t e f o r t h e m a c h i n e t o p i e c e i t s e l f t o g e t h e r ; t h e u s e r c o u l d j u s t r e b o o t . S o m e

    o l d 3 2 0 x 2 0 0 x 2 5 6 g a m e s w o u l d c r a s h w i t h o u t e v e n c h a n g i n g t h e v i d e o m o d e b a c k t o n o r m a l , l e a v i n g t h e u s e r s c r e e n

    f u l l o f o v e r s i z e d t e x t w i t h t h e c r a s h i n f o r m a t i o n .

    I n W i n d o w s , t h i n g s a r e t o t a l l y d i f f e r e n t . W h e n y o u r a p p l i c a t i o n i s r u n n i n g , i t i s s h a r i n g t h e p r o c e s s o r w i t h m a n y o t h e r

    t a s k s , a l l r u n n i n g c o n c u r r e n t l y ( a t t h e s a m e t i m e ) . Y o u c a n ' t h o g c o n t r o l o f t h e s o u n d c a r d , t h e v i d e o c a r d , t h e h a r d

    d i s k , o r a n y o t h e r s y s t e m r e s o u r c e f o r t h a t m a t t e r . T h e i n p u t a n d o u t p u t i s a b s t r a c t e d a w a y , a n d y o u d o n ' t p o l l t h e

    k e y b o a r d o r m e s s w i t h i n t e r r u p t s ; W i n d o w s m a n a g e s a l l t h a t f o r y o u .

    T h i s i s b o t h a g o o d a n d b a d t h i n g . O n o n e h a n d , W i n d o w s a p p l i c a t i o n s h a v e a c o n s i s t e n t l o o k a n d f e e l . U n l e s s y o u

    w a n t t o g e t p i c k y , a l m o s t a n y w i n d o w y o u c r e a t e i s a u t o m a t i c a l l y f a m i l i a r t o W i n d o w s u s e r s . T h e y a l r e a d y k n o w h o w t o

    u s e m e n u s a n d t o o l b a r s , s o i f y o u b u i l d y o u r a p p l i c a t i o n w i t h t h e b a s i c W i n d o w s c o n s t r u c t s , t h e y c a n p i c k u p t h e u s e r

    i n t e r f a c e q u i c k l y . A l s o , a l o t o f m u n d a n e G U I t a s k s a r e c o m p l e t e l y h a n d l e d b y t h e W i n d o w s A P I , s u c h a s d i s p l a y i n g

    c o m p l e x p r o p e r t y p a g e s , f r e e i n g y o u t o w r i t e t h e i n t e r e s t i n g c o d e .

    A s i d e " R e i n v e n t i n g t h e w h e e l , " o r r e w r i t i n g e x i s t i n g c o d e , c a n m a k e s e n s e s o m e t i m e s , e s p e c i a l l y w h e n w r i t i n g

    g a m e s . H o w e v e r , n o t o n t h e s c a l e o f o p e r a t i n g s y s t e m s ; n o b o d y w a n t s t o r e i m p l e m e n t t h e f u n c t i o n a l i t y o f

    t h e W i n d o w s A P I .

    O n t h e o t h e r h a n d , y o u h a v e t o p u t a l o t o f f a i t h i n t o W i n d o w s a n d o t h e r a p p l i c a t i o n s . U n t i l D i r e c t X c a m e a r o u n d , y o u

    n e e d e d t o u s e t h e d e f a u l t W i n d o w s d r a w i n g c o m m a n d s ( c a l l e d t h e G D I ) . W h i l e t h e G D I c a n a u t o m a t i c a l l y h a n d l e a n y

    b i t d e p t h a n d w o r k o n a n y m o n i t o r , i t ' s n o t t h e s p e e d i e s t t h i n g i n t h e w o r l d . ( I n f a c t i t i s p r o b a b l y t h e s l o w e s t ! ) F o r t h i s

    r e a s o n , m a n y D O S d e v e l o p e r s s w o r e o f f e v e r w o r k i n g i n W i n d o w s . P r e t t y m u c h t h e b e s t y o u c o u l d d o w i t h g r a p h i c s

    w a s r e n d e r i n g o n t o a b i t m a p t h a t w a s t h e n d r a w n i n t o a w i n d o w , w h i c h i s p r e t t y s l o w . Y o u u s e d t o h a v e t o g i v e u p a l o t

    w h e n w r i t i n g a W i n d o w s a p p l i c a t i o n .

    H o w e v e r , t h e r e a r e a l o t o f t h i n g s t h a t W i n d o w s c a n d o t h a t w o u l d b e a n i g h t m a r e t o c o d e i n t h e o l d w o r l d o f D O S . Y o u

    c a n p l a y s o u n d e f f e c t s u s i n g a s i n g l e l i n e o f c o d e ( t h e P l a y S o u n d f u n c t i o n ) , q u e r y t h e t i m e s t a m p c o u n t e r , u s e a r o b u s t

    T C P / I P n e t w o r k s t a c k , g e t a c c e s s t o v i r t u a l m e m o r y , a n d t h e l i s t g o e s o n . E v e n t h o u g h y o u h a v e t o t a k e a f e w s p e e d

    h i t s h e r e a n d t h e r e , t h e a d v a n t a g e s o f W i n d o w s f a r o u t w e i g h t h e d i s a d v a n t a g e s .

    I ' l l b e u s i n g t h e W i n 3 2 e n v i r o n m e n t t o w r i t e a l l o f t h e a p p l i c a t i o n s f o r t h i s b o o k . W i n 3 2 i s n o t a p r o g r a m m i n g l a n g u a g e ; i t

    i s a n a p p l i c a t i o n p r o g r a m m i n g i n t e r f a c e ( A P I ) . I n o t h e r w o r d s , i t i s a s e t o f C f u n c t i o n s t h a t a n a p p l i c a t i o n u s e s t o m a k e

    a W i n d o w s - c o m p l i a n t p r o g r a m . I t a b s t r a c t s a w a y a l o t o f d i f f i c u l t o p e r a t i o n s l i k e m u l t i t a s k i n g a n d p r o t e c t e d m e m o r y , a s

    w e l l a s p r o v i d i n g i n t e r f a c e s t o h i g h e r - l e v e l c o n c e p t s . S u p p o r t i n g m e n u s , d i a l o g b o x e s , a n d m u l t i m e d i a h a v e

    w e l l - e s t a b l i s h e d , f a i r l y e a s y - t o - u s e ( y o u m a y n o t b e l i e v e m e a b o u t t h i s ! ) l i b r a r y f u n c t i o n s w r i t t e n f o r t h a t s p e c i f i c t a s k .

    W i n d o w s i s a n e x t r e m e l y b r o a d s e t o f A P I s . Y o u c a n d o j u s t a b o u t a n y t h i n g , f r o m p l a y i n g v i d e o s t o l o a d i n g w e b p a g e s .

    A n d f o r e v e r y t a s k , t h e r e a r e a s l e w o f d i f f e r e n t w a y s t o a c c o m p l i s h i t . T h e r e a r e s o m e s e r i o u s l y l a r g e b o o k s d e v o t e d

    j u s t t o t h e m o r e r u d i m e n t a r y c o n c e p t s o f W i n d o w s p r o g r a m m i n g . S u b s e q u e n t l y , t h e d i s c u s s i o n h e r e w i l l b e l i m i t e d t o

    w h a t i s r e l e v a n t t o a l l o w y o u t o c o n t i n u e o n w i t h t h e r e s t o f t h e b o o k . I n s t e a d o f c o v e r i n g t h e t o m e s o f k n o w l e d g e

    r e q u i r e d t o s e t u p d i a l o g s w i t h t r e e c o n t r o l s , p r i n t d o c u m e n t s , a n d r e a d / w r i t e k e y s i n t h e r e g i s t r y , I ' m g o i n g t o d e a l w i t h

    t h e s i m p l e s t c a s e : c r e a t i n g a w i n d o w t h a t c a n d r a w t h e w o r l d , p a s s i n g i n p u t t o t h e p r o g r a m , a n d h a v i n g a t l e a s t t h e

    b e g i n n i n g s o f a p l e a s a n t r e l a t i o n s h i p w i t h t h e o p e r a t i n g s y s t e m . I f y o u n e e d a n y m o r e i n f o , t h e r e a r e m a n y g o o d

    r e s o u r c e s o u t t h e r e o n W i n d o w s p r o g r a m m i n g .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    22/513

    2 2

    H u n g a r i a n N o t a t i o n

    A l l o f t h e v a r i a b l e n a m e s i n W i n d o w s l a n d u s e w h a t i s c a l l e d H u n g a r i a n n o t a t i o n . T h e n a m e c a m e f r o m i t s i n v e n t o r ,

    C h a r l e s S i m o n y i , a n o w - l e g e n d a r y M i c r o s o f t p r o g r a m m e r w h o h a p p e n e d t o b e H u n g a r i a n .

    H u n g a r i a n n o t a t i o n i s t h e c o d i n g c o n v e n t i o n o f j u s t p r e f i x i n g v a r i a b l e s w i t h a f e w l e t t e r s t o h e l p i d e n t i f y t h e i r t y p e .

    H u n g a r i a n n o t a t i o n m a k e s i t e a s i e r t o r e a d o t h e r p e o p l e s ' c o d e a n d e a s y t o e n s u r e t h e c o r r e c t v a r i a b l e s a r e s u p p l i e d t of u n c t i o n s i n t h e r i g h t f o r m a t . H o w e v e r , i t c a n b e r e a l l y c o n f u s i n g t o p e o p l e w h o h a v e n ' t s e e n i t b e f o r e .

    T a b l e 1 . 1 g i v e s s o m e o f t h e m o r e c o m m o n p r e f i x e s u s e d i n m o s t o f t h e W i n d o w s a n d D i r e c t X c o d e t h a t y o u ' l l s e e i n

    t h i s b o o k .

    T a b l e 1 . 1 : S o m e c o m m o n H u n g a r i a n n o t a t i o n p r e f i x e s

    b ( e x a m p l e : b A c t i v e ) V a r i a b l e i s a B O O L , a C p r e c u r s o r t o t h e B o o l e a n t y p e f o u n d i n C + + .

    B O O L s c a n b e T R U E o r F A L S E .

    l ( e x a m p l e : l P i t c h ) V a r i a b l e i s a l o n g i n t e g e r .

    d w ( e x a m p l e : d w W i d t h ) V a r i a b l e i s a D W O R D , o r u n s i g n e d l o n g i n t e g e r .

    w ( e x a m p l e : w S i z e ) V a r i a b l e i s a W O R D , o r u n s i g n e d s h o r t i n t e g e r .

    s z ( e x a m p l e :

    s z W i n d o w C l a s s )

    V a r i a b l e i s a p o i n t e r t o a s t r i n g t e r m i n a t e d b y a z e r o ( a s t a n d a r d C - s t y l e

    s t r i n g ) .

    p o r

    l p

    ( e x a m p l e : l p D a t a ) V a r i a b l e i s a p o i n t e r ( l p i s a c a r r y o v e r f r o m t h e f a r p o i n t e r s o f t h e 1 6 - b i t

    d a y s ; i t m e a n s l o n g p o i n t e r ) . A p o i n t e r - p o i n t e r i s p r e f i x e d b y p p o r l p l p , a n d

    s o o n .

    h ( e x a m p l e : h I n s t a n c e ) V a r i a b l e i s a W i n d o w s h a n d l e .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    23/513

    2 3

    G e n e r a l W i n d o w s C o n c e p t s

    N o t e p a d . e x e i s p r o b a b l y t h e b e s t e x a m p l e o f a s i m p l e W i n d o w s p r o g r a m . I t a l l o w s b a s i c t e x t i n p u t , l e t s y o u d o s o m e

    b a s i c t e x t m a n i p u l a t i o n l i k e s e a r c h i n g a n d u s i n g t h e c l i p b o a r d , a n d a l s o l e t s y o u l o a d , s a v e , a n d p r i n t t o a f i l e . T h e

    p r o g r a m a p p e a r s i n F i g u r e 1 . 1 .

    F i g u r e 1 . 1 : N o t e p a d . e x e a s b a s i c a s a w i n d o w g e t s

    T h e w i n d o w s I s h o w y o u h o w t o c r e a t e w i l l b e s i m i l a r t o t h i s . A w i n d o w s u c h a s t h i s i s p a r t i t i o n e d i n t o s e v e r a l d i s t i n c t

    a r e a s . W i n d o w s m a n a g e s s o m e o f t h e m , b u t t h e r e s t y o u r a p p l i c a t i o n m a n a g e s . T h e p a r t i t i o n i n g l o o k s s o m e t h i n g l i k eF i g u r e 1 . 2 .

    F i g u r e 1 . 2 : T h e i m p o r t a n t G U I c o m p o n e n t s o f a w i n d o w

    T h e m a i n p a r t s a r e :

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    24/513

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    25/513

    2 5

    M e s s a g e H a n d l i n g i n W i n d o w s

    W i n d o w s a l s o h a v e s o m e t h i n g c a l l e d f o c u s . O n l y o n e w i n d o w c a n h a v e f o c u s a t a t i m e . T h e w i n d o w t h a t h a s t h e f o c u s

    i s t h e o n l y w i n d o w t h a t t h e u s e r c a n i n t e r a c t w i t h . T h e r e s t a p p e a r w i t h a d i f f e r e n t c o l o r t i t l e b a r , i n t h e b a c k g r o u n d .

    B e c a u s e o f t h i s , o n l y o n e a p p l i c a t i o n g e t s t o k n o w a b o u t t h e k e y b o a r d s t a t e .

    H o w d o e s y o u r a p p l i c a t i o n k n o w t h i s ? H o w d o e s i t k n o w t h i n g s l i k e w h e n i t h a s f o c u s o r w h e n t h e u s e r c l i c k s o n i t ?H o w d o e s i t k n o w w h e r e i t s w i n d o w i s l o c a t e d o n t h e s c r e e n ? W e l l , W i n d o w s " t e l l s " t h e a p p l i c a t i o n w h e n c e r t a i n e v e n t s

    h a p p e n . A l s o , y o u c a n t e l l o t h e r w i n d o w s w h e n t h i n g s h a p p e n ( i n t h i s w a y , d i f f e r e n t w i n d o w s c a n c o m m u n i c a t e w i t h

    e a c h o t h e r ) .

    H o l d o n t h o u g h H o w d o e s W i n d o w s " t e l l " a n a p p l i c a t i o n a n y t h i n g ? T h i s c a n b e a v e r y f o r e i g n c o n c e p t t o p e o p l e u s e d

    t o c o n s o l e p r o g r a m m i n g , b u t i t i s p a r a m o u n t t o t h e w a y W i n d o w s w o r k s . T h e t r i c k i s , W i n d o w s ( a n d o t h e r a p p l i c a t i o n s )

    s h a r e i n f o r m a t i o n b y s e n d i n g p a c k e t s o f d a t a b a c k a n d f o r t h c a l l e d m e s s a g e s . A m e s s a g e i s j u s t a s t r u c t u r e t h a t

    c o n t a i n s t h e m e s s a g e i t s e l f , a l o n g w i t h s o m e p a r a m e t e r s t h a t c o n t a i n i n f o r m a t i o n a b o u t t h e m e s s a g e .

    T h e s t r u c t u r e o f a W i n d o w s m e s s a g e a p p e a r s b e l o w :

    t y p e d e f s t r u c t t a g M S G {

    H W N D h w n d ;

    U I N T m e s s a g e ;

    W P A R A M w P a r a m ;

    L P A R A M l P a r a m ;

    D W O R D t i m e ;

    P O I N T p t ;

    } M S G;

    h w n d H a n d l e t o t h e w i n d o w t h a t s h o u l d r e c e i v e t h e m e s s a g e

    m e s s a g e T h e i d e n t i f i e r o f t h e m e s s a g e . F o r e x a m p l e , t h e a p p l i c a t i o n r e c e i v e s a m s g o b j e c t w h e n t h e w i n d o wi s r e s i z e d , a n d t h e m e s s a g e m e m b e r v a r i a b l e i s s e t t o t h e c o n s t a n t W M _ S I Z E .

    w P a r a m I n f o r m a t i o n a b o u t t h e m e s s a g e ; d e p e n d e n t o n t h e t y p e o f m e s s a g e

    l P a r a m A d d i t i o n a l i n f o r m a t i o n a b o u t t h e m e s s a g e

    t i m e S p e c i f i e s w h e n t h e m e s s a g e w a s p o s t e d

    p t M o u s e l o c a t i o n w h e n t h e m e s s a g e w a s p o s t e d

    E x p l a i n i n g M e s s a g e P r o c e s s i n g

    W h a t i s a n H W N D ? I t ' s b a s i c a l l y j u s t a n i n t e g e r , r e p r e s e n t i n g a h a n d l e t o a w i n d o w . W h e n a W i n d o w s a p p l i c a t i o n

    w a n t s t o t e l l a n o t h e r w i n d o w t o d o s o m e t h i n g , o r w a n t s t o a c c e s s a v o l a t i l e s y s t e m o b j e c t l i k e a f i l e o n d i s k , W i n d o w s

    d o e s n ' t a c t u a l l y l e t i t f i d d l e w i t h p o i n t e r s o r g i v e i t t h e o p p o r t u n i t y t o t r o u n c e o n a n o t h e r a p p l i c a t i o n ' s m e m o r y s p a c e .

    E v e r y t h i n g i s d o n e w i t h h a n d l e s t o o b j e c t s . I t a l l o w s t h e a p p l i c a t i o n t o s e n d m e s s a g e s t o t h e o b j e c t , d i r e c t i n g i t t o d o

    t h i n g s . A g o o d w a y t o t h i n k o f a h a n d l e i s l i k e a b a r c o d e . T h a t i s , a h a n d l e i s a u n i q u e i d e n t i f i e r t h a t a l l o w s y o u , a n d

    W i n d o w s , t o d i f f e r e n t i a t e b e t w e e n d i f f e r e n t o b j e c t s s u c h a s w i n d o w s , b i t m a p s , f o n t s , a n d s o o n .

    E a c h w i n d o w i n W i n d o w s e x i s t s i n a h i e r a r c h y a n d e a c h h a s a n i d e n t i f i e r , o r h a n d l e . A w i n d o w h a n d l e i s a n i n t e g e r

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    26/513

    2 6

    d e s c r i b i n g a w i n d o w ; t h e r e c a n b e u p t o 1 6 , 3 8 4 w i n d o w s o p e n s i m u l t a n e o u s l y ( 2 1 4

    ) . W h e n y o u t e l l W i n d o w s " I w a n t

    t h e c l i e n t r e c t a n g l e f o r w i n d o w x , " W i n d o w s f i n d s t h e w i n d o w c o r r e s p o n d i n g t o h a n d l e x . I t f e t c h e s t h e c l i e n t r e c t a n g l e

    o f t h e w i n d o w a n d p a s s e s i t b a c k t o t h e a p p l i c a t i o n . I f t h e w i n d o w d o e s n o t e x i s t ( f o r e x a m p l e i f y o u g i v e a b o g u s

    w i n d o w h a n d l e ) , t h e n a n e r r o r i s r e t u r n e d .

    N o t e T h e W i n 3 2 A P I p r e d a t e d t h e c u r r e n t O O P f r e n z y i n t h e p r o g r a m m i n g w o r l d , a n d t h u s d o e s n ' t t a k e a d v a n t a g e o f

    s o m e n e w e r p r o g r a m m i n g c o n c e p t s l i k e e x c e p t i o n h a n d l i n g . E v e r y f u n c t i o n i n W i n d o w s i n s t e a d r e t u r n s a n e r r o r

    c o d e ( c a l l e d a n H R E S U L T ) t h a t t e l l s t h e c a l l e r h o w t h e f u n c t i o n d i d . A n o n - n e g a t i v e H R E S U L T m e a n s t h e f u n c t i o n s u c c e e d e d .

    I f t h e f u n c t i o n r e t u r n s a n e g a t i v e n u m b e r , a n e r r o r o c c u r r e d . T h e F A I L E D ( ) m a c r o r e t u r n s t r u e i f a n H R E S U L T i s

    n e g a t i v e . T h e r e a r e a m y r i a d o f d i f f e r e n t t y p e s o f e r r o r s t h a t c a n r e s u l t f r o m a f u n c t i o n ; t w o e x a m p l e s a r e E _ F A I L

    ( g e n e r i c e r r o r ) a n d E _ N O T I M P L ( t h e f u n c t i o n w a s n o t i m p l e m e n t e d ) .

    A n a n n o y i n g s i d e e f f e c t o f h a v i n g e v e r y t h i n g r e t u r n a n e r r o r c o d e i s t h a t a l l t h e c a l l s t h a t r e t r i e v e i n f o r m a t i o n n e e d

    t o b e p a s s e d a p o i n t e r o f d a t a t o f i l l ( i n s t e a d o f t h e m o r e l o g i c a l c h o i c e o f j u s t r e t u r n i n g t h e r e q u e s t e d d a t a ) .

    M e s s a g e s c a n t e l l a w i n d o w a n y t h i n g f r o m " P a i n t y o u r s e l f " t o " Y o u h a v e l o s t f o c u s " o r " U s e r d o u b l e - c l i c k e d a t l o c a t i o n

    ( x , y ) . " E a c h t i m e a m e s s a g e i s s e n t t o a w i n d o w , i t i s a d d e d t o a m e s s a g e q u e u e d e e p i n s i d e W i n d o w s . E a c h w i n d o w

    h a s i t s o w n a s s o c i a t e d l o c a l m e s s a g e q u e u e . A m e s s a g e q u e u e e n s u r e s t h a t e a c h m e s s a g e g e t s p r o c e s s e d i n t h e

    o r d e r i t g e t s r e c e i v e d , e v e n i f i t a r r i v e s w h i l e t h e a p p l i c a t i o n i s b u s y p r o c e s s i n g o t h e r m e s s a g e s . I n f a c t , w h e n m o s t

    W i n d o w s a p p l i c a t i o n s g e t s t u c k i n a n i n f i n i t e l o o p o r o t h e r w i s e s t o p w o r k i n g , y o u ' l l n o t i c e b e c a u s e t h e y ' l l s t o p

    p r o c e s s i n g m e s s a g e s , a n d t h e r e f o r e d o n ' t r e d r a w o r p r o c e s s i n p u t .

    S o h o w d o e s a n a p p l i c a t i o n p r o c e s s m e s s a g e s ? W i n d o w s d e f i n e s a f u n c t i o n t h a t a l l p r o g r a m s m u s t i m p l e m e n t c a l l e d

    t h e w i n d o w p r o c e d u r e ( o r W n d P r o c f o r s h o r t ) . W h e n y o u c r e a t e a w i n d o w , y o u g i v e W i n d o w s y o u r W n d P r o c f u n c t i o n

    i n t h e f o r m o f a f u n c t i o n p o i n t e r . T h e n , w h e n m e s s a g e s a r e p r o c e s s e d , t h e y a r e p a s s e d a s p a r a m e t e r s t o t h e f u n c t i o n ,

    a n d t h e W n d P r o c d e a l s w i t h t h e m . S o , f o r e x a m p l e , w h e n t h e W n d P r o c f u n c t i o n g e t s p a s s e d a m e s s a g e s a y i n g " P a i n t

    y o u r s e l f ! " t h a t i s t h e s i g n a l f o r t h e w i n d o w t o r e d r a w i t s e l f .

    W h e n y o u s e n d a m e s s a g e , W i n d o w s e x a m i n e s t h e w i n d o w h a n d l e y o u p r o v i d e , u s i n g i t t o f i n d o u t w h e r e t o s e n d t h e

    m e s s a g e . T h e m e s s a g e I D d e s c r i b e s t h e m e s s a g e b e i n g s e n t , a n d t h e p a r a m e t e r s t o t h e I D a r e c o n t a i n e d i n t h e t w o

    o t h e r f i e l d s i n a m e s s a g e , w P a r a m a n d l P a r a m . B a c k i n t h e 1 6 - b i t d a y s , w P a r a m w a s a 1 6 - b i t ( w o r d s i z e d ) i n t e g e r a n d

    l P a r a m w a s a 3 2 - b i t ( l o n g s i z e d ) i n t e g e r , b u t w i t h W i n 3 2 t h e y ' r e b o t h 3 2 b i t s l o n g . T h e m e s s a g e s w a i t i n a q u e u e u n t i l

    t h e a p p l i c a t i o n r e c e i v e s t h e m .

    T h e w i n d o w p r o c e d u r e s h o u l d r e t u r n 0 f o r a n y m e s s a g e i t p r o c e s s e s . A l l m e s s a g e s i t d o e s n ' t p r o c e s s s h o u l d b e

    p a s s e d t o t h e d e f a u l t W i n d o w s m e s s a g e p r o c e d u r e , D e f W i n d o w P r o c ( ) . W i n d o w s c a n s t a r t b e h a v i n g e r r a t i c a l l y i f

    D e f W i n d o w P r o c d o e s n ' t s e e a l l o f y o u r n o n - p r o c e s s e d m e s s a g e s . D o n ' t w o r r y i f y o u ' r e n o t g e t t i n g a l l o f t h i s j u s t y e t ; i t

    w i l l b e c o m e c l e a r e r o v e r t h e c o u r s e o f t h i s b o o k .

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    27/513

    27

    Hello WorldWindows Style

    To help explain these ideas, let me show you a minimalist Win32 program and analyze what's going on. This code was

    modified from the default "Hello, World" code that Visual C++ 6.0 will automatically generate for you, but some of the

    things were removed, leaving this one of the most stripped-down Windows programs you can write.

    Listing 1.1: One of the simplest possible Windows programs

    /*******************************************************************

    * Advanced 3D Game Programming using DirectX 9.0

    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    * Title: HelloWorld.cpp

    * Desc: Simple windows app

    * copyright (c) 2002 by Peter A Walsh and Adrian Perez

    ******************************************************************/

    #include "stdafx.h"

    #define MAX_LOADSTRING 100

    // Global Variables:

    HINSTANCE hInst; // current instance

    char szTitle[] = "Hello, World!"; // The title bar text

    char szWindowClass[] = "Hello, World!"; // The title bar text

    // Forward declarations of functions included in this code module:

    ATOM MyRegisterClass(HINSTANCE hInstance);

    BOOL InitInstance(HINSTANCE, int);

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

    int APIENTRY WinMain(HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPSTR lpCmdLine, int nCmdShow)

    {

    // TODO: Place code here.

    MSG msg;

    // Initialize global strings

    MyRegisterClass(hInstance);

    // Perform application initialization:

    if (!InitInstance (hInstance, nCmdShow))

    {

    return FALSE;

    }

    // Main message loop:

    while (GetMessage(&msg, NULL, 0, 0))

    {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

    }

    return msg.wParam;

    }

    //

    // FUNCTION: MyRegisterClass()

    //

    // PURPOSE: Registers the window class.

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    28/513

    2 8

    / /

    / / C O M M E N T S :

    / /

    / / T h i s f u n c t i o n a n d i t s u s a g e i s o n l y n e c e s s a r y i f y o u w a n t t h i s c o d e

    / / t o b e c o m p a t i b l e w i t h W i n 3 2 s y s t e m s p r i o r t o t h e ' R e g i s t e r C l a s s E x '

    / / f u n c t i o n t h a t w a s a d d e d t o W i n d o w s 9 5 . I t i s i m p o r t a n t t o c a l l t h i s

    / / f u n c t i o n s o t h a t t h e a p p l i c a t i o n w i l l g e t ' w e l l f o r m e d ' s m a l l i c o n s

    / / a s s o c i a t e d w i t h i t .

    / /

    A T O M M y R e g i s t e r C l a s s ( H I N S T A N C E h I n s t a n c e )

    {

    W N D C L A S S E X w c e x ;

    w c e x . c b S i z e = s i z e o f ( W N D C L A S S E X ) ;

    w c e x . s t y l e = C S _ H R E D R A W | C S _ V R E D R A W ;

    w c e x . l p f n W n d P r o c = ( W N D P R O C ) W n d P r o c ;

    w c e x . c b C l s E x t r a = 0 ;

    w c e x . c b W n d E x t r a = 0 ;

    w c e x . h I n s t a n c e = h I n s t a n c e ;

    w c e x . h I c o n = L o a d I c o n ( h I n s t a n c e , ( L P C T S T R ) I D I _ A P P L I C A T I O N ) ;

    w c e x . h C u r s o r = L o a d C u r s o r ( N U L L , I D C _ A R R O W ) ;

    w c e x . h b r B a c k g r o u n d = ( H B R U S H ) G e t S t o c k O b j e c t ( W H I T E _ B R U S H ) ; w c e x . l p s z M e n u N a m e = N U L L ;

    w c e x . l p s z C l a s s N a m e = s z W i n d o w C l a s s ;

    w c e x . h I c o n S m = L o a d I c o n ( w c e x . h I n s t a n c e , ( L P C T S T R ) I D I _ A P P L I C A T I O N ) ;

    r e t u r n R e g i s t e r C l a s s E x ( & w c e x ) ;

    }

    / /

    / / F U N C T I O N : I n i t I n s t a n c e ( H A N D L E , i n t )

    / /

    / / P U R P O S E : S a v e s i n s t a n c e h a n d l e a n d c r e a t e s m a i n w i n d o w

    / /

    / / C O M M E N T S :

    / /

    / / I n t h i s f u n c t i o n , w e s a v e t h e i n s t a n c e h a n d l e i n a g l o b a l v a r i a b l e a n d

    / / c r e a t e a n d d i s p l a y t h e m a i n p r o g r a m w i n d o w .

    / /

    B O O L I n i t I n s t a n c e ( H I N S T A N C E h I n s t a n c e , i n t n C m d S h o w )

    {

    H W N D h W n d ;

    h I n s t = h I n s t a n c e ; / / S t o r e i n s t a n c e h a n d l e i n o u r g l o b a l v a r i a b l e

    h W n d = C r e a t e W i n d o w (

    s z W i n d o w C l a s s , / / N a m e o f t h e w i n d o w c l a s s t o u s e f o r t h i s w i n d o w / / r e g i s t e r e d i n M y R e g i s t e r C l a s s

    s z T i t l e , / / T i t l e o f t h e a p p l i c a t i o n

    W S _ O V E R L A P P E D W I N D O W , / / S t y l e t h a t W i n d o w s s h o u l d m a k e o u r w i n d o w w i t h

    / / ( t h i s i s t h e ' d e f a u l t ' w i n d o w s t y l e f o r w i n d o w e d a p p s )

    2 0 , / / S t a r t i n g X o f t h e w i n d o w

    2 0 , / / S t a r t i n g Y o f t h e w i n d o w

    6 4 0 , / / W i d t h o f t h e w i n d o w

    4 8 0 , / / H e i g h t o f t h e w i n d o w

    N U L L , / / H a n d l e o f o u r p a r e n t w i n d o w ( N u l l , s i n c e w e h a v e n o n e )

    N U L L , / / H a n d l e t o o u r m e n u ( N u l l , s i n c e w e d o n ' t h a v e o n e )

    h I n s t a n c e , / / I n s t a n c e o f o u r r u n n i n g a p p l i c a t i o n

    N U L L ) ; / / P o i n t e r t o w i n d o w - c r e a t i o n d a t a ( w e p r o v i d e n o n e )

    i f ( ! h W n d )

    {

    r e t u r n F A L S E ;

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    29/513

    2 9

    }

    S h o w W i n d o w ( h W n d , n C m d S h o w ) ;

    U p d a t e W i n d o w ( h W n d ) ;

    r e t u r n T R U E ;

    }

    / /

    / / F U N C T I O N : W n d P r o c ( H W N D , u n s i g n e d , W O R D , L O N G )

    / /

    / / P U R P O S E : P r o c e s s e s m e s s a g e s f o r t h e m a i n w i n d o w .

    / /

    / / W M _ P A I N T - P a i n t t h e m a i n w i n d o w

    / / W M _ D E S T R O Y - p o s t a q u i t m e s s a g e a n d r e t u r n

    / /

    / /

    L R E S U L T C A L L B A C K W n d P r o c ( H W N D h W n d , U I N T m e s s a g e , W P A R A M w P a r a m , L P A R A M l P a r a m )

    {

    P A I N T S T R U C T p s ;

    H D C h d c ; c h a r s z H e l l o [ ] = " H e l l o , y o u c r a z y w o r l d y o u ! " ;

    s w i t c h ( m e s s a g e )

    {

    c a s e W M _ P A I N T :

    h d c = B e g i n P a i n t ( h W n d , & p s ) ;

    / / T O D O : A d d a n y d r a w i n g c o d e h e r e . . .

    R E C T r t ;

    G e t C l i e n t R e c t ( h W n d , & r t ) ;

    D r a w T e x t ( h d c , s z H e l l o , s t r l e n ( s z H e l l o ) , & r t ,

    D T _ C E N T E R | D T _ V C E N T E R | D T _ S I N G L E L I N E ) ;

    E n d P a i n t ( h W n d , & p s ) ;

    b r e a k ;

    c a s e W M _ D E S T R O Y :

    P o s t Q u i t M e s s a g e ( 0 ) ;

    b r e a k ;

    d e f a u l t :

    r e t u r n D e f W i n d o w P r o c ( h W n d , m e s s a g e , w P a r a m , l P a r a m ) ;

    }

    r e t u r n 0 ;

    }

    I t ' s e a s y t o g e t w o r r i e d w h e n y o u t h i n k t h i s i s o n e o f t h e s i m p l e s t W i n d o w s p r o g r a m s y o u c a n w r i t e , a n d i t ' s s t i l l o v e r

    1 0 0 l i n e s l o n g . T h e g o o d t h i n g i s t h a t t h e c o d e a b o v e i s m o r e o r l e s s c o m m o n t o a l l W i n d o w s p r o g r a m s . M o s t W i n d o w s

    p r o g r a m m e r s d o n ' t r e m e m b e r t h e e x a c t o r d e r e v e r y t h i n g g o e s i n ; t h e y j u s t c o p y t h e w o r k i n g W i n d o w s i n i t i a l i z a t i o n

    c o d e f r o m a p r e v i o u s a p p l i c a t i o n a n d u s e i t l i k e i t i s t h e i r o w n !

    E x p l a i n i n g t h e C o d e

    E v e r y C / C + + p r o g r a m h a s i t s e n t r y p o i n t i n m a i n ( ) , w h e r e i t i s p a s s e d c o n t r o l f r o m t h e o p e r a t i n g s y s t e m . I n W i n d o w s ,

    t h i n g s w o r k a l i t t l e d i f f e r e n t l y . T h e r e i s s o m e c o d e t h a t t h e W i n 3 2 A P I r u n s f i r s t , b e f o r e l e t t i n g y o u r c o d e r u n . T h e a c t u a l

    s t u b f o r m a i n ( ) l i e s d e e p w i t h i n t h e W i n 3 2 D L L s w h e r e y o u c a n ' t t o u c h i t . H o w e v e r , t h i s a p p l i c a t i o n s t a r t s a t a d i f f e r e n t

    p o i n t : a f u n c t i o n c a l l e d W i n M a i n ( ) . W i n d o w s d o e s i t s s e t u p w o r k w h e n y o u r a p p l i c a t i o n i s f i r s t r u n , a n d t h e n c a l l s

    W i n M a i n ( ) . T h i s i s w h y w h e n y o u d e b u g a W i n d o w s a p p " W i n M a i n " d o e s n ' t a p p e a r a t t h e b o t t o m o f t h e c a l l s t a c k ; t h e

    i n t e r n a l D L L f u n c t i o n s t h a t c a l l e d i t a r e . W i n M a i n i s p a s s e d t h e f o l l o w i n g p a r a m e t e r s ( i n o r d e r ) :

    T h e i n s t a n c e o f t h e a p p l i c a t i o n ( a n o t h e r h a n d l e , t h i s o n e r e p r e s e n t i n g a n i n s t a n t i a t i o n o f a r u n n i n g

    e x e c u t a b l e ) . E a c h p r o c e s s h a s a s e p a r a t e i n s t a n c e h a n d l e t h a t u n i q u e l y i d e n t i f i e s t h e p r o c e s s t o

  • 7/21/2019 C++ DirectX Game Programming for Beginners

    30/513

    3 0

    W i n d o w s . T h i s i s d i f f e r e n t f r o m w i n d o w h a n d l e s , a s e a c h a p p l i c a t i o n c a n h a v e m a n y w i n d o w s u n d e r

    i t s c o n t r o l . Y o u n e e d t o h o l d o n t o t h i s i n s t a n c e , a s c e r t a i n W i n d o w s A P I