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

📄 myddraw.h

📁 gamecode 很不错的小游戏源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
	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 + -