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

📄 drawit.cpp

📁 RPG单机游戏圣剑英雄传的源代码(声音、图片、剧情等)希望给对于想制作游戏的人有一定帮助。
💻 CPP
字号:
//==============和Direct Draw 有关的函数==================

//*********************************
//创建页面
BOOL CreateBitmap(LPDIRECTDRAWSURFACE &lpTemp,int x,int y,char *BitmapFile, DWORD MemoryFlag )
{
	DDSURFACEDESC	 ddsd;
	HRESULT          ddrval;

	ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | MemoryFlag;
	ddsd.dwWidth = x;
	ddsd.dwHeight = y;
	ddrval = lpDD->CreateSurface( &ddsd, &lpTemp, NULL );
	if( ddrval != DD_OK )
	{
		return initFail(BitmapFile);
	}
	
	if( BitmapFile!=NULL )
		DDReLoadBitmap(lpTemp,BitmapFile);
	
	return TRUE;
}

//*****************************************************
//释放所有的DirectDraw对象。
void FreeDDraw( void )
{
    if( lpDD != NULL )
    {
		if( lpDDSPrimary != NULL )
		{
			lpDDSPrimary->Release();
			lpDDSPrimary = NULL;
		}
		if( lpDDSBackGround != NULL )
		{
			lpDDSBackGround->Release();
			lpDDSBackGround = NULL;
		}
		if( lpDDSSpirit != NULL )
		{
			lpDDSSpirit->Release();
		    lpDDSSpirit = NULL;
		}
		for(int i=0; i<NPCS; i++)	
		{
			if( lpDDSNpc[i] != NULL )	
			{ 
				lpDDSNpc[i]->Release();	
				lpDDSNpc[i] = NULL; 
			}
		}
		if( lpDDSMap1 != NULL )		{ lpDDSMap1->Release();	lpDDSMap1 = NULL; }
		if( lpDDSMap2 != NULL )		{ lpDDSMap2->Release();	lpDDSMap2 = NULL; }
		if( lpDDSDialog != NULL )	{ lpDDSDialog->Release();	lpDDSDialog = NULL; }
		if( lpDDSStateBar != NULL )	{ lpDDSStateBar->Release();	lpDDSStateBar = NULL; }
		if( lpDDSFightBar != NULL )	{ lpDDSFightBar->Release();	lpDDSFightBar = NULL; }
		if( lpDDSBomb != NULL )		{ lpDDSBomb->Release();	lpDDSBomb = NULL; }
		if( lpDDSMainMenu != NULL )	{ lpDDSMainMenu->Release();	lpDDSMainMenu = NULL; }
		if( lpDDSGoods != NULL )	{ lpDDSGoods->Release();	lpDDSGoods = NULL; }
		if( lpDDPal != NULL )
		{
			lpDDPal->Release();
			lpDDPal = NULL;
		}
		lpDD->Release();
		lpDD = NULL;
    }
}

//***********************************************************
//位图拷贝
BOOL Blt(LPDIRECTDRAWSURFACE SS,int x,int y,
		 LPDIRECTDRAWSURFACE DS,RECT rcRect,BOOL Flog)
{
  HRESULT		ddrval;
  DWORD Flogs= (Flog==FALSE)?DDBLTFAST_NOCOLORKEY:DDBLTFAST_SRCCOLORKEY;

  //边界检查
  if( x<0 ) {  rcRect.left = rcRect.left - x; x=0; }
  if( y<0 ) {  rcRect.top  = rcRect.top - y; y=0; }
  if( x+ rcRect.right - rcRect.left > ScreenX ) { rcRect.right = rcRect.left + ScreenX - x; }
  if( y+ rcRect.bottom - rcRect.top > ScreenY ) { rcRect.bottom = rcRect.top + ScreenY - y; }

 while( 1 )
 {
    ddrval = SS->BltFast( x, y, DS, &rcRect, Flogs);

	if( ddrval == DD_OK )
	{
	   return TRUE;
	}
	if( ddrval == DDERR_SURFACELOST )
	{
	    ddrval = restoreAll();
		ddrval = SS->Restore();
		ddrval = DS->Restore();
	    if( ddrval != DD_OK )
	    {
		return TRUE;
	    }
	}
	if( ddrval != DDERR_WASSTILLDRAWING )
	{
	    return FALSE;
	}
    }
    if(ddrval != DD_OK)
    {
	return FALSE;
    }
}

//*****************************************************
//换页
void Flip(void)
{
	HRESULT ddrval;
	while( 1 )
	{
		ddrval = lpDDSPrimary->Flip( NULL, 0 );
		if( ddrval == DD_OK )
		{
		    break;
		}
		if( ddrval == DDERR_SURFACELOST )
		{
		    ddrval = restoreAll();
		    if( ddrval != DD_OK )
		    {
			break;
		    }
		}
		if( ddrval != DDERR_WASSTILLDRAWING )
		{
		    break;
		}
	}
}

//********************
//恢复所有页面
HRESULT restoreAll( void )
{
    HRESULT	ddrval;
    ddrval = lpDDSPrimary->Restore();
	ddrval = lpDDSBack->Restore();
//	RECT rect={0,0,SX,SY};
//	Blt(lpDDSPrimary,0,0,lpDDSBack,rect,FALSE);
//	if( ddrval == DD_OK )
    {
		ddrval = lpDDSBackGround->Restore();
		ddrval = lpDDSSpirit->Restore();
		for( int i=0; i<NPCS; i++)
		{
			ddrval = lpDDSNpc[i]->Restore();
		}
		ddrval = lpDDSMap1->Restore();
		ddrval = lpDDSMap2->Restore();
		ddrval = lpDDSDialog->Restore();
		ddrval = lpDDSStateBar->Restore();
		ddrval = lpDDSFightBar->Restore();
		ddrval = lpDDSBomb->Restore();
		ddrval = lpDDSMainMenu->Restore();
		ddrval = lpDDSGoods->Restore();
    }
    return ddrval;

} /* restoreAll */

//********************************************
//清屏
void Clrscr(DWORD color=RGB(0,0,0) )
{
	DDBLTFX ddbltfx;
	ddbltfx.dwSize=sizeof(ddbltfx);
	ddbltfx.dwFillColor=color;
	lpDDSPrimary->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);
	lpDDSBack->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);
}

⌨️ 快捷键说明

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