📄 drawit.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 + -