DirectX 학습 수기 (2)

			DirectX    ( )
			happyfire 2002/8/11

       DirectDraw      ,        ,     ,       ,   ,     。

 .  DirectDraw  
	              。     DirectDraw         DirectDraw  ,  
       (  +  ),      ,       ,          。       
       ,  flip       。            directdraw  。  ,     
        ,        。

   :      
	              (    ),          。           
     Blt         ,     flip     。        :

	//             (       )
	LPDIRECTDRAWSURFACE lpDDSPic ;	

	// InitDDraw()            
	ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
	ddsd.dwHeight = 480 ;
	ddsd.dwWidth = 640 ;
	if ( lpDD->CreateSurface(&ddsd,&lpDDSPic,NULL)!=DD_OK )
		return FALSE ;

         ,    DDSURFACEDESC       。dwFlags DDSD_CAPS  ddsCaps   ,
DDSD_HEIGHT DDSD_WIDTH          。ddsCaps.dwCaps DDSCAPS_OFFSCREENPLAIN    
      。dwHeight dwWidth      ,     。      DirectDraw   CreateSurface
    lpDDSPic 。  CreateSurface         NULL,           COM        。
                ,  ddsd     。                。
  DirectX 5.0       ,                      .   DirectX 5.0    , 
             ,            .     ,             ,   
     ,         ,                (   DDSCAPS     dwCaps    
    DDSCAPS_SYSTEMMEMORY   DDSCAPS_VIDEOMEMORY    ,                ),  
    ,                ,      。
  ,                  (              )        ,  
                      .  ,      ,               。   
     ,             ,:) 。

   :         
               (8    )。                  ,
              .                (color table)   ,      DirectDraw 
             .         (Palette)。                  ,    
    (Color Index)           ,       , ,                   。
                         。            4 8     。     
                          。        :
//        (       ,     ,              )
LPDIRECTDRAWPALETTE lpDDPal ;	

//        
lpDDPal = DDLoadPalette(lpDD, szBitmap);
if (lpDDPal)
 	lpDDSPrimary->SetPalette(lpDDPal);
else
	return FALSE ;

DDLoadPalette DDutil.cpp     ,happyfire    ,           。


   :                 
	      DirectDraw APIs       DDLoadBitmap   ,     :
lpDDSPic = DDLoadBitmap ( lpDD, szBitmap, 0, 0 ) ; //szBitmap      ,  ".\\pic\\background.bmp"
   DDLoadBitmap         ,    Ddutil.cpp Ddutil.h       。     
Ddutil.cpp       ,    Windows API LoadImage,           directdraw  
               。

   :  blit   ,                
	  blit?Bit block transfer(    ),                  。DirectDraw
       ,Blt BltFast。Blt    ,BltFast    。        Blt,  BltFast。     :

RECT rcRect ;

rcRect.left= 0;
rcRect.top= 0 ;
rcRect.right= 640;
rcRect.bottom=480;
lpddsBack->BltFast( 0, 0, lpddsPic, &rcRect, DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT);

RECT windows     (     windows.h),rcRect           (       )   
             (         )  。BltFast         DWORD ,      
        x y,                      。     x,y rcRect    。
           :
DDBLTFAST_DESTCOLORKEY 
              ,          (color key)。 
DDBLTFAST_NOCOLORKEY 
           ,      。 
DDBLTFAST_SRCCOLORKEY 
              ,         。 
DDBLTFAST_WAIT 
         ,   DDERR_WASSTILLDRAWING      ,                     。

    color key,       !     ,        ,                  ,
   blit   ,              ,           。    ,          
  ,                 ,            ,      。

                 。 InitDDraw    DDSetColorKey ( lpDDSPic, RGB(255,0,255) ) ; 
        lpDDSPic          。            ,               
  。   BltFast         DDBLTFAST_SRCCOLORKEY.                 。

 DDBLTFAST_DESTCOLORKEY            ,      ,                  , 
  。

                。         。  BltFast      ,         。   
  ,      BltFast,       。

           ,             。         16 ,24 ,32 RGB  ,16 RGB   
       555,565    。        ,    ...:)     。(           ,  ,
      ,     MMX             )

               MainLoop ,       Blt Flip,                     
      ,          ,          。

 .         
	             Alt+Tab   ,    ,          。          
DirectDrawSurface          ,                 。   DirectDrawSurface     
       ,         DDERR_SURFACELOST,           。        :
		while (1){
			hRst = lpDDSPrimary->Flip(NULL,0) ;
				
			if ( hRst==DD_OK )
				break ;

			if ( hRst==DDERR_SURFACELOST ){
			
				if ( RestoreAllDDS()!=DD_OK )
					break ;
			}
	
			if (hRst != DDERR_WASSTILLDRAWING){
	                break;
			}
		}

  flip    flip      ,           。  flip  DDERR_WASSTILLDRAWING,        flip
      (flip     , directX       ),          while    ,  
hRst != DDERR_WASSTILLDRAWING。  flip  DD_OK,   flip    ,  break   。  flip  
DDERR_SURFACELOST,         ,           。    RestoreAlDDS()        :

HRESULT RestoreAllDDS( void )
{
    HRESULT	hRst ;
  
    hRst = lpDDSPrimary->Restore();
    if (hRst)    
	hRst = lpDDSBack->Restore () ;
    if (hRst)    
	hRst = lpDDSPic->Restore() ;
	
    DDReLoadBitmap ( lpDDSPic,szBitmap ) ;
	

    return hRst ;
} 
 

       ,          ,    ,     Restore  。Restore                 
    ,        DirectDrawSurface     。                           ,
     Restore      ,             。      DDReLoadBitmap  ,      
Ddutil.cpp   。      ,   DDLoadBitmap  DDReLoadBitmap    !             ,    。


좋은 웹페이지 즐겨찾기