📄 myddraw.h
字号:
char* Tmp=new char[1024];
if( Text=="" )
return;
//设置透明背景和字体颜色及背景色。
Surf->GetDC(&hdc);
SetBkMode(hdc, BK);
SetBkColor(hdc, BkColor);
SetTextColor(hdc, color);
SelectObject(hdc,Font);
ChrLen=strlen(Text)+1;
for(int i=0; i<=ChrLen/WIDTH; i++ )
{
memset(Tmp,0,1024);
for(int j=0; j<((i==ChrLen/WIDTH)?ChrLen%WIDTH:WIDTH); j++)
{
Tmp[j]=*Text;
Text++;
}
TextOut(hdc, x, y, Tmp, strlen(Tmp));
y+=30;
}
delete Tmp;
Surf->ReleaseDC(hdc); //必须释放控制权。
}
//****************************
//显示消息
//(以阴影方式显示文字)
void ShowMessage(char *Message, const int& x, const int& y)
{
PrintText(pPSur, x+2, y+2, Message);
PrintText(pPSur, x, y, Message,RGB(255,255,0));
}
//安全释放表面
bool SafeFreeDDrawSur(LPDIRECTDRAWSURFACE7 DdrawS)
{
if(DdrawS !=NULL)
{
DdrawS->Release();
DdrawS=NULL;
return true;
}
return false;
}
//*****************************************************
//释放所有的DirectDraw对象。
void FreeDDraw( void )
{
if( pDD7 != NULL )
{
SafeFreeDDrawSur(pPSur);
SafeFreeDDrawSur(pBBuf);
// SafeFreeDDrawSur(pOPla);
SafeFreeDDrawSur(lpDDSMap1);
SafeFreeDDrawSur(lpDDSMap2);
SafeFreeDDrawSur(lpDDSFactory);
SafeFreeDDrawSur(lpDDSBackGround);
SafeFreeDDrawSur(pDialog1);
SafeFreeDDrawSur(pActiveMenu);
SafeFreeDDrawSur(bk);
SafeFreeDDrawSur(sc);
SafeFreeDDrawSur(rd);
SafeFreeDDrawSur(tt);
SafeFreeDDrawSur(cm);
SafeFreeDDrawSur(suc);
SafeFreeDDrawSur(pp);
SafeFreeDDrawSur(choice);
SafeFreeDDrawSur(uset);
SafeFreeDDrawSur(buy);
SafeFreeDDrawSur(select);
SafeFreeDDrawSur(sysmenu);
SafeFreeDDrawSur(buildingSur);
SafeFreeDDrawSur(autofSur);
SafeFreeDDrawSur(foodfSur);
SafeFreeDDrawSur(restafSur);
SafeFreeDDrawSur(minerfSur);
SafeFreeDDrawSur(spinmfSur);
SafeFreeDDrawSur(smeltfSur);
for(int i=0;i<playernum;i++)
SafeFreeDDrawSur(pPlayer[i]);
pDD7->Release();
pDD7 = NULL;
}
return;
}
inline BOOL Blt(LPDIRECTDRAWSURFACE7 DS,int x,int y,LPDIRECTDRAWSURFACE7 SS,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 > ScreenW )
{
rcRect.right = rcRect.left + ScreenW - x;
}
if( y+ rcRect.bottom - rcRect.top > ScreenH )
{
rcRect.bottom = rcRect.top + ScreenH - y;
}
while( 1 )
{
ddrval = DS->BltFast( x, y, SS, &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;
}
}
//****************************************************
//生成背景
inline void MakeGround()
{
int drawx=0;
int drawy=0;
int drawindex=0;
for(int i=SY; i<SY+24; i++)//竖行
// for(int j=SX; j<SX+32; j++)
for(int j=SX; j<SX+25; j++)//优化性能
{
//画地面:
//选择材料中的rect位置:
drawindex=maps.path[j][i];
if(drawindex<5)
{
drawx=0;
drawy=0;
}
else if(drawindex<10)
{
drawx=5;
drawy=1;
}
else if(drawindex<15)
{
drawx=10;
drawy=2;
}
else if(drawindex<20)
{
drawx=15;
drawy=3;
}
else if(drawindex<25)
{
drawx=20;
drawy=4;
}
else if(drawindex<30)
{
drawx=25;
drawy=5;
}
else if(drawindex<35)
{
drawx=30;
drawy=6;
}
else if(drawindex<40)
{
drawx=35;
drawy=7;
}
else if(drawindex<45)
{
drawx=40;
drawy=8;
}
else if(drawindex<50)
{
drawx=45;
drawy=9;
}
RECT rect={ (drawindex-drawx)*32, drawy*32, (drawindex-drawx+1)*32, \
(drawy+1)*32};
//贴最底层的背景及道路图:
if(maps.building[j][i]<88)// && maps.block[j][i]==0)//没有建筑的地方
{
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, lpDDSMap1, rect, FALSE);
}
//这里加载建筑物:
if(maps.building[j][i]>=10 && maps.building[j][i]<=14)
{
int position=maps.building[j][i];
RECT rect={(position-10)*32,2*32,(position-9)*32,3*32};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, lpDDSMap1, rect, FALSE);
}
if(maps.building[j][i]>=15 && maps.building[j][i]<=17 )
{
int position=maps.building[j][i];
RECT rect={(position-15)*32,3*32,(position-14)*32,4*32};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, lpDDSMap1, rect, FALSE);
}
//这里加载工厂
//switch 工厂种类再贴图
if(maps.building[j][i]==BUILDFACTORY0 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, autofSur,rect,true);
}
if(maps.building[j][i]==BUILDFACTORY1 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, foodfSur,rect,true);
}
if(maps.building[j][i]==BUILDFACTORY2 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32,restafSur,rect,true);
}
if(maps.building[j][i]==BUILDFACTORY3 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, minerfSur,rect,true);
}
if(maps.building[j][i]==BUILDFACTORY4 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, spinmfSur,rect,true);
}
if(maps.building[j][i]==BUILDFACTORY5 && maps.building[j][i]!=maps.path[j][i])
{
RECT rect={0,0,96,96};
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, smeltfSur,rect,true);
}
}
for(i=SY; i<SY+24; i++)//竖行
{
for(int j=SX; j<SX+25; j++)
{
drawindex=maps.block[j][i];
//if(drawindex>=1)
drawindex-=1;//此举是为了和地图编辑器协调,与美工协调。
if(drawindex<5)
{
drawx=0;
drawy=0;
}
else if(drawindex<10)
{
drawx=5;
drawy=1;
}
else if(drawindex<15)
{
drawx=10;
drawy=2;
}
else if(drawindex<20)
{
drawx=15;
drawy=3;
}
else if(drawindex<25)
{
drawx=20;
drawy=4;
}
else if(drawindex<30)
{
drawx=25;
drawy=5;
}
else if(drawindex<35)
{
drawx=30;
drawy=6;
}
else if(drawindex<40)
{
drawx=35;
drawy=7;
}
RECT rect={ (drawindex-drawx)*96, drawy*96, (drawindex-drawx+1)*96, \
(drawy+1)*96};
if(drawindex!=0 && drawindex!=100)
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, lpDDSMap2,rect,true);
if(drawindex==0 && maps.block[j][i+1]==100)//显示银行,其编号为1,减1后为0。
Blt(lpDDSBackGround, Rx+(j-SX)*32, Ry+(i-SY)*32, lpDDSMap2,rect,true);
}
}
//这部份是将构成好的地图幕后缓冲区的内容贴在后缓冲区里。
RECT rect1={0,0,ScreenW,ScreenH};
Blt(pBBuf,0,0,lpDDSBackGround,rect1,false);//边框贴向连接缓冲区。
Blt(pBBuf,0,0,bk,rect1,true);//放在这里为了表面翻转时出现无边框。
Blt(pBBuf,776,249,sysmenu,GetRect(0,0,245,209),true);
}
//显示菜单(垂直型的显示)(X,Y,当前项,菜单数组,数组的长度,字色,背景色)
void ShowMenu(const int& x, const int& y, const int& MenuIt, char* MainMenu[],
const int& Num, const DWORD& FontColor, const DWORD& BackColor)
{
Blt( pBBuf,0,0, lpDDSBackGround,GetRect(0,0,ScreenW,ScreenH), FALSE);//恢复背景图。
for( int i=0; i<Num; i++ )
{
DWORD T1=0,T2=0;
if( MenuIt == i )
{
T1=OPAQUE;
T2=BackColor;
}
PrintText(pBBuf, x, y+10+i*24, MainMenu[i],FontColor, T1, T2);
}
Flip();
}
//显示菜单(水平型的显示)(X,Y,当前项,菜单数组,数组的长度,字色,背景色)
void ShowMenuCus(int x, int y, int MenuIt, char *MainMenu[], int Num, int step,DWORD FontColor, DWORD BackColor)
{
Blt(pBBuf, 0,0, lpDDSBackGround, GetRect(0,0,ScreenW,ScreenH), FALSE);//恢复背景图。
for( int i=0; i<Num; i++ )
{
DWORD T1=0,T2=0;
if( MenuIt == i )
{
T1=OPAQUE;
T2=BackColor;
}
PrintText(pBBuf, x, y+10+i*step, MainMenu[i],FontColor, T1, T2);
}
Flip();
}
//显示活动菜单。
int ShowAcMenu(int MenuIt, char *Menu[], int Num, DWORD FontColor, DWORD BackColor)
{
Blt(pBBuf, 0,0, lpDDSBackGround, GetRect(0,0,ScreenW,ScreenH), FALSE);//恢复背景图。
Blt(pBBuf, 100,100, pActiveMenu, GetRect(0,0,280,120), FALSE);//贴菜单图。
int x=100,y=100;
for( int i=0; i<Num; i++ )
{
DWORD T1=0,T2=0;
if( MenuIt == i )
{
T1=OPAQUE;
T2=BackColor;
}
PrintText(pBBuf, x, y+10+i*24, Menu[i],FontColor, T1, T2);
}
Flip();
return 0;
}
//********************************************
//清屏
void ScreenClr(DWORD color)
{
DDBLTFX ddbltfx;
ddbltfx.dwSize=sizeof(ddbltfx);
ddbltfx.dwFillColor=color;
pPSur->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);
pBBuf->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);
}
//***********************************************************
//功能:带缩放的位图拷贝
//参数:目标表面,目标矩阵,原表面,拷贝范围,是否用顔色键
BOOL SBlt(LPDIRECTDRAWSURFACE7 DS,RECT dr,LPDIRECTDRAWSURFACE7 SS,RECT sr,BOOL Flag)
{
HRESULT ddrval;
DWORD Flags= (Flag==FALSE)?0:DDBLT_KEYSRC;
//边界检查
int SWidth=sr.right-sr.left;
int SHeight=sr.bottom-sr.top;
int DWidth=dr.right-dr.left;
int DHeight=dr.bottom-dr.top;
if( sr.left<0 )
{
dr.left += (DWidth * (-sr.left)) / SWidth;
sr.left=0;
}
if( sr.top<0 )
{
dr.top += (DHeight * (-sr.top)) / SHeight;
sr.top=0;
}
if( sr.right > ScreenW )
{
dr.right -= (DWidth * (sr.right-ScreenW)) / SWidth;
sr.right=ScreenW;
}
if( sr.bottom > ScreenH )
{
dr.bottom -= (DHeight *(sr.bottom-ScreenH)) / SHeight;
sr.bottom=ScreenH;
}
while( 1 )
{
ddrval = DS->Blt( &dr, SS, &sr, Flags, 0);
if( ddrval == DD_OK )
{
return TRUE;
}
if( ddrval == DDERR_SURFACELOST )
{
ddrval = restoreAll();
if( ddrval != DD_OK )
{
return TRUE;
}
}
if( ddrval != DDERR_WASSTILLDRAWING )
{
return FALSE;
}
}
if(ddrval != DD_OK)
{
return FALSE;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -