⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddapi.cpp

📁 网页游戏赤壁
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// if surface is lost, run retore
// return value	:	TRUE if succeeded
BOOL DD_RestoreScreen( void )
{
	HRESULT ddrval;

	// reset primary surface
	if( DD_lpDDSFront )
	{
		ddrval = DD_lpDDSFront->Restore();
		if( ddrval != DD_OK )
		{
			int nErr=-1;
			switch( ddrval )
			{
			case	DDERR_GENERIC	:
				nErr = 1;
				break;
			case	DDERR_INCOMPATIBLEPRIMARY :
				nErr = 2;
				break;
			case	DDERR_IMPLICITLYCREATED	:
				nErr = 3;
				break;
			case	DDERR_INVALIDOBJECT :
				nErr = 4;
				break;
			case	DDERR_INVALIDPARAMS	:
				nErr = 5;
				break;
			case	DDERR_NOEXCLUSIVEMODE :
				nErr = 6;
				break;
			case	DDERR_OUTOFMEMORY	:
				nErr = 7;
				break;
			case	DDERR_UNSUPPORTED :
				nErr = 8;
				break;
			case	DDERR_WRONGMODE :
				nErr = 9;
				break;
			}
//			WriteErrorFile( "a.log", nErr );
			return FALSE;
		}
	}

	// reset secondary surface
	if( DD_lpDDSBack )
	{
		ddrval = DD_lpDDSBack->Restore();
		if( ddrval != DD_OK )
			return FALSE;
	}

	// reset palette, disband fade mode
	int nLevel = nFadeLevel;
	DD_FadeScreen( FALSE, 0 );

	// reset surfaces
	for( int i=0; i<MAX_SURFACE; i++)
	{
		if( DD_lppSurfaces[i] != NULL )
		{
			if( !DD_lppSurfaces[i]->Restore() ) 
				return FALSE;
		}
	}

	// reset fade mode
	for( int l=0; l < nLevel ; l++ )
		DD_FadeScreen( bFadeIn );

	// send surface lost error message to user's application
	PostMessage( hwndGame, WM_DD_SURFACELOST, 0, 0 );
	return TRUE;
} /* DD_RestoreScreen */

// draw from back buffer to front buffer
// pRect		:	rectangle region to update, full surface if it is NULL
// return value	:	TRUE if succeeded
BOOL DD_UpdateScreen( RECT *pRect/*=NULL*/ )
{
    HRESULT     ddrval;

	RECT rect;
	if( pRect == NULL )
	{
		rect.left = 0, rect.top = 0,
		rect.right = SCREEN_WIDTH, rect.bottom = SCREEN_HEIGHT;
	}
	else
	{
		rect.left = pRect->left, rect.top = pRect->top;
		rect.right = pRect->right, rect.bottom = pRect->bottom;
	}
    while( 1 )
    {
		ddrval = DD_lpDDSFront->BltFast( rect.left, rect.top, DD_lpDDSBack, &rect, DDBLTFAST_NOCOLORKEY );
        if( ddrval == DD_OK )
            break;
#ifdef	_DEBUG
		DD_getBltError( "DD_UpdateScreen", ddrval );
#endif
        if( ddrval == DDERR_SURFACELOST )
            if( !DD_RestoreScreen() )
                return FALSE;
        if( ddrval != DDERR_WASSTILLDRAWING )
            return FALSE;
    }
	return TRUE;
}	// DD_UpdateScreen()

// fill black color to front screen
// nColor		:	color index you want to fill, default is BLACK
// pRect		:	rectangle region to erase, full surface if it is NULL
// return value	:	TRUE if succeeded
BOOL DD_EraseFrontScreen( int nColor, RECT *pRect/*=NULL*/ )
{
    DDBLTFX     ddbltfx;
    HRESULT     ddrval;

    // Erase the background
    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = nColor;
    while( 1 )
    {
		ddrval = DD_lpDDSFront->Blt( pRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx );

        if( ddrval == DD_OK )
        {
            break;
        }
#ifdef	_DEBUG
		DD_getBltError( "DD_EraseFrontScreen", ddrval );
#endif
        if( ddrval == DDERR_SURFACELOST )
        {
            if( !DD_RestoreScreen() )
                return FALSE;
        }
        if( ddrval != DDERR_WASSTILLDRAWING )
        {
            return FALSE;
        }
    }
	return TRUE;
} /* DD_EraseFrontScreen() */

// fill black color to back screen
// nColor		:	color index you want to fill, default is BLACK
// pRect		:	rectangle region to erase, full surface if it is NULL
// return value	:	TRUE if succeeded
BOOL DD_EraseBackScreen( int nColor/*=0*/, RECT *pRect/*=NULL*/ )
{
    DDBLTFX     ddbltfx;
    HRESULT     ddrval;

    // Erase the background
    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = nColor;
    while( 1 )
    {
		ddrval = DD_lpDDSBack->Blt( pRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx );

        if( ddrval == DD_OK )
        {
            break;
        }
#ifdef	_DEBUG
		DD_getBltError( "DDEraseBackScreen", ddrval );
#endif
        if( ddrval == DDERR_SURFACELOST )
        {
            if( !DD_RestoreScreen() )
                return FALSE;
        }
        if( ddrval != DDERR_WASSTILLDRAWING )
        {
            return FALSE;
        }
    }
	return TRUE;
}	// DD_EraseBackScreen()


// fill black color to a given surface
// pSurface		:	surface to be erased
// nColor		:	color index you want to fill, default is BLACK
// pRect		:	rectangle region to erase, full surface if it is NULL
// return value	:	TRUE if succeeded
BOOL DD_EraseScreen( LPDIRECTDRAWSURFACE2 pSurface, int nColor, RECT *pRect/*=NULL*/ )
{
    DDBLTFX     ddbltfx;
    HRESULT     ddrval;

    // Erase the background
    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = nColor;
    while( 1 )
    {
		ddrval = pSurface->Blt( pRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx );

        if( ddrval == DD_OK )
        {
            break;
        }
#ifdef	_DEBUG
		DD_getBltError( "DDEraseScreen", ddrval );
#endif
        if( ddrval == DDERR_SURFACELOST )
        {
            if( !DD_RestoreScreen() )
                return FALSE;
        }
        if( ddrval != DDERR_WASSTILLDRAWING )
        {
            return FALSE;
        }
    }
	return TRUE;
}
//////////////////////////////

// fade screen
//////////////////////////////
// make screen fade in or fade out
// bIn			:	TRUE for fade in screen, else for fade out screen
// nMaxStep		:	ranges from 1 to 255, set to 0 if to reset this function
// return value	:	TRUE for end session
BOOL DD_FadeScreen( BOOL bIn , int nMaxStep /*=10*/ )
{
	RGBQUAD        rgb[256];
	PALETTEENTRY	pe[256];
	int nStep;

	// reset Fade mode
	if( nMaxStep == 0 ) 
	{
		if( nFadeLevel != 0 )
			DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		nFadeLevel=0;	return TRUE;
	}

	// get palette entries and save it
	if( nFadeLevel == 0 )
	{
		if(DD_lpDDPal->GetEntries( 0, 0, 256, peFadeSave ) != DD_OK)
		{
			return	TRUE;
		}
	}

	// if end section, restore palette
	if( nFadeLevel == nMaxStep )
	{
		nFadeLevel = 0;
		DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		return TRUE;
	}

	// set from palette entries to rgb
	for ( int j = 0; j< 256; j++ )
	{
		rgb[j].rgbRed = peFadeSave[j].peRed;
		rgb[j].rgbGreen = peFadeSave[j].peGreen;
		rgb[j].rgbBlue = peFadeSave[j].peBlue;
	}

	// fade in or fade out
	bFadeIn = bIn;
	if( bIn )		nStep=nFadeLevel;	// fade in
	else			nStep=nMaxStep-nFadeLevel;

	// do it
	for( int i=0; i<256; i++ )
	{
		rgb[i].rgbRed = peFadeSave[i].peRed*nStep/nMaxStep;
		rgb[i].rgbGreen = peFadeSave[i].peGreen*nStep/nMaxStep;
		rgb[i].rgbBlue = peFadeSave[i].peBlue*nStep/nMaxStep;
	}

	// set from rgb to palette entries
	for ( int k = 0; k< 256; k++ )
	{
		pe[k].peRed = rgb[k].rgbRed;
		pe[k].peGreen = rgb[k].rgbGreen;
		pe[k].peBlue = rgb[k].rgbBlue;
	}

	// set to palette
	if(DD_lpDDPal->SetEntries( 0, 0, 256, pe ) != DD_OK)
	{
		nFadeLevel = 0;
		DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		return TRUE;
	}

	nFadeLevel ++;
	return	FALSE;
} /* DD_FadeScreen */

// fade out 
// nMaxStep		:	ranges from 1 to 255, set to 0 if to reset this function
// return value	:	TRUE for end session
BOOL DD_FadeOut( int nMaxStep )
{
	PALETTEENTRY	pe[256];
	int nStep;

	// get palette entries and save it
	if( nFadeLevel == 0 )
	{
		if(DD_lpDDPal->GetEntries( 0, 0, 256, peFadeSave ) != DD_OK)
		{
			return	TRUE;
		}
	}

	// if end section, restore palette
	if( nFadeLevel == (nMaxStep+1) )
	{
		nFadeLevel = 0;
		return TRUE;
	}
	// to computation the current step
	nStep= nMaxStep - nFadeLevel;
	// do it
	for( int i=0; i<256; i++ )
	{
		pe[i].peRed = peFadeSave[i].peRed*nStep/nMaxStep;
		pe[i].peGreen = peFadeSave[i].peGreen*nStep/nMaxStep;
		pe[i].peBlue = peFadeSave[i].peBlue*nStep/nMaxStep;
	}
	if(DD_lpDDPal->SetEntries( 0, 0, 256, pe ) != DD_OK)
	{
		nFadeLevel = 0;
		DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		return TRUE;
	}

	nFadeLevel ++;
	return	FALSE;
} /* DD_FadeOut */

// fade in 
// nMaxStep		:	ranges from 1 to 255, set to 0 if to reset this function
// return value	:	TRUE for end session
BOOL DD_FadeIn(PALETTEENTRY	 * pe,PALETTEENTRY	* peFadeSave,int nMaxStep )
{
	// do it
	DD_lpDDPal->SetEntries( 0, 0, 256, pe ) ;

	for( int i=0; i<256; i++ )
	{
		if (pe[i].peRed <peFadeSave[i].peRed)
		{
			pe[i].peRed += nMaxStep ;
		}
		

		if (pe[i].peGreen <peFadeSave[i].peGreen )
		{
			pe[i].peGreen += nMaxStep ;
		}
		

		if (pe[i].peBlue <peFadeSave[i].peBlue )
		{
			pe[i].peBlue += nMaxStep ;
		}
		
	}

	// if end section, restore palette
	if( nFadeLevel == (nMaxStep+1) )
	{
		nFadeLevel = 0;
		DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		return TRUE;
	}

	if(DD_lpDDPal->SetEntries( 0, 0, 256, pe ) != DD_OK)
	{
		nFadeLevel = 0;
		DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
		return TRUE;
	}

	nFadeLevel ++;

	return	FALSE;
} /* DD_FadeOut */

// fade out screen, from color to black
// nMaxStep		:	how much steps fade from begin to end
// nDelay		:	time each step should pause, in million second
void DD_FadeOutScreen( int nMaxStep, int nDelay )
{
	PALETTEENTRY	pe[256];

#ifdef	_DD_DEBUG
	return;
#endif //_DD_DEBUG

	// get palette entries and save it
	Assert( DD_lpDDPal != NULL );
	if(DD_lpDDPal->GetEntries( 0, 0, 256, peFadeSave ) != DD_OK)
	{	// error in get entry
		return;
	}

	if( nMaxStep <= 0 )	return;	// step error

	for( int nStep=nMaxStep-1; nStep>=0; nStep-- )
	{
		// do it
		for( int i=0; i<256; i++ )
		{
			pe[i].peRed = peFadeSave[i].peRed*nStep/nMaxStep;
			pe[i].peGreen = peFadeSave[i].peGreen*nStep/nMaxStep;
			pe[i].peBlue = peFadeSave[i].peBlue*nStep/nMaxStep;
		}
		if(DD_lpDDPal->SetEntries( 0, 0, 256, pe ) != DD_OK)
		{	// error in set entry
			DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
			return;
		}
		Sleep( nDelay );
	}
}	// DD_FadeOutScreen()

// fade in screen, from black to color, muset used with DD_FadeClear()
// nStep		:	how much steps fade from begin to end
// nDelay		:	time each step should pause, in million second
// pPal			:	the palette you want to display at last
void DD_FadeInScreen( int nMaxStep, int nDelay )
{
	PALETTEENTRY	pe[256];

#ifdef	_DD_DEBUG
	return;
#endif //_DD_DEBUG

	Assert( DD_lpDDPal != NULL );
	if( DD_lpDDPal == NULL )
	{
		OutputDebugString( "FadeInScreen Error(4): current palette is NULL!\n" );
		return;	// palette pointer cannot be NULL
	}

	if( nMaxStep <= 0 )
	{
		OutputDebugString( "DD_FadeInScreen Error(5): Step is less than 0!\n" );
		if( DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave ) != DD_OK )
		{
			OutputDebugString( "DD_FadeInScreen Error(0): Cannot set entries at last!\n" );
		}
		return;	// step error, set palette directly
	}

	for( int nStep=0; nStep<nMaxStep; nStep++ )
	{
		// do it
		for( int i=0; i<256; i++ )
		{
			pe[i].peRed = peFadeSave[i].peRed*nStep/nMaxStep;
			pe[i].peGreen = peFadeSave[i].peGreen*nStep/nMaxStep;
			pe[i].peBlue = peFadeSave[i].peBlue*nStep/nMaxStep;
		}
		if(DD_lpDDPal->SetEntries( 0, 0, 256, pe ) != DD_OK)
		{	// error in set entry
			OutputDebugString( "DD_FadeInScreen Error(1): Cannot set entries!\n" );
			DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave );
			return;
		}
		Sleep( nDelay );
	}
	if( DD_lpDDPal->SetEntries( 0, 0, 256, peFadeSave ) != DD_OK )
	{
		OutputDebugString( "DD_FadeInScreen Error(2): Cannot set entries at last!\n" );
	}
}	// DD_FadeInScreen()

// Restore saved palette from "peFadeSave" to spcecified palette 
// pointer. Usually used after DD_FadeOutScreen(), to reset the 
// palette at last, or maybe not useful after v0039.
// pPal			:	palette pointer to be restored
void DD_FadeRestore( LPDIRECTDRAWPALETTE pPal )
{

#ifdef	_DD_DEBUG
	return;
#endif //_DD_DEBUG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -