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

📄 myddraw.h

📁 gamecode 很不错的小游戏源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef MyDraw_h_
#define MyDraw_h_

#include "CZDemo.h"
#include "Myclasses\MyMaps.h"

#define ScreenW 1024
#define ScreenH	768

/////////////////////////////////////////////////////////////

extern HWND hWnd;
extern int x,y;  
extern int SX,SY;
extern int DX,DY;
extern int Rx,Ry;
extern HFONT Font;
extern MyMaps maps;
extern int playernum;

extern void ShowBar();

///////////////////////////////////////////////////////////////
LPDIRECTDRAW7			pDD7; 
LPDIRECTDRAWSURFACE7    pPSur;//Primary Surface
LPDIRECTDRAWSURFACE7    pBBuf;//Back Buffer

LPDIRECTDRAWSURFACE7    pPlayer[4];//两个人物。

LPDIRECTDRAWSURFACE7	MainMenuSur;//进入游戏时的菜单。
LPDIRECTDRAWSURFACE7	button1;//底纹
LPDIRECTDRAWSURFACE7	button2;//活动按钮
LPDIRECTDRAWSURFACE7	button3;//地图选择底纹

LPDIRECTDRAWSURFACE7	finger;//指标

LPDIRECTDRAWSURFACE7	lpDDSMap1;//地图材料1
LPDIRECTDRAWSURFACE7	lpDDSMap2;//地图材料2
//工厂表面
LPDIRECTDRAWSURFACE7	buildingSur;//房屋放大图
LPDIRECTDRAWSURFACE7	autofSur;//汽车厂
LPDIRECTDRAWSURFACE7	foodfSur;//食品厂
LPDIRECTDRAWSURFACE7	restafSur;//酒店
LPDIRECTDRAWSURFACE7	minerfSur;//矿厂
LPDIRECTDRAWSURFACE7	spinmfSur;//纺织厂
LPDIRECTDRAWSURFACE7	smeltfSur;//冶炼厂

LPDIRECTDRAWSURFACE7	lpDDSFactory;//工厂图片材料
LPDIRECTDRAWSURFACE7	lpDDSBackGround;//构造后的地图缓冲
LPDIRECTDRAWSURFACE7	pMenu;//
LPDIRECTDRAWSURFACE7    pDialog1;//显示消息的背景框
LPDIRECTDRAWSURFACE7	pActiveMenu;

LPDIRECTDRAWSURFACE7	bank;//银行图片
LPDIRECTDRAWSURFACE7	bankbutton;//银行选择button;
LPDIRECTDRAWSURFACE7	shop;//商店图片
LPDIRECTDRAWSURFACE7    pLogo;
LPDIRECTDRAWSURFACE7	bk;  //边框

LPDIRECTDRAWSURFACE7	sc;//停留卡
LPDIRECTDRAWSURFACE7	rd;//摇控色子
LPDIRECTDRAWSURFACE7	tt;//乌龟卡
LPDIRECTDRAWSURFACE7	cm;//经济管理人
LPDIRECTDRAWSURFACE7	suc;//超级汽车
LPDIRECTDRAWSURFACE7	pp;//通行证
LPDIRECTDRAWSURFACE7	bc;//收购卡
LPDIRECTDRAWSURFACE7	choice;//物品使用选择标识

//操作选单
LPDIRECTDRAWSURFACE7	go;//扔色子
LPDIRECTDRAWSURFACE7	uset;//使用工具
LPDIRECTDRAWSURFACE7	buy;//收购
LPDIRECTDRAWSURFACE7	select;//选单

//系统菜单
LPDIRECTDRAWSURFACE7	sysmenu;//系统选单底面
LPDIRECTDRAWSURFACE7	five_man;
	
DDSCAPS2  caps;                  
DDSURFACEDESC2             desc; 
HRESULT result; 

RECT GetRect(const int& x1,const int& y1,const int& x2,const int& y2);
BOOL InitDDraw(void);
inline void Flip(void);
HRESULT restoreAll( void );
//void PrintText(LPDIRECTDRAWSURFACE7 Surf,int x,int y,char *Text,DWORD color, DWORD BK, DWORD BkColor,int WIDTH);
void PrintText(LPDIRECTDRAWSURFACE7 Surf,int x,int y,char *Text,
			   DWORD color=RGB(0,0,0), DWORD BK=TRANSPARENT, DWORD BkColor=RGB(255,255,255),int WIDTH=50);

//显示消息
void ShowMessage(char *Message, int x=360, int y=500);
void FreeDDraw( void );

inline BOOL Blt(LPDIRECTDRAWSURFACE7 DS,int x,int y,LPDIRECTDRAWSURFACE7 SS,RECT rcRect,BOOL Flog);
//显示菜单选项(垂直):
void ShowMenu(int x, int y, int MenuIt, char *MainMenu[], int Num,DWORD FontColor=RGB(0,0,0), DWORD BackColor=RGB(255,255,0));
//显示菜单选项(水平):
void ShowMenuCus(int x, int y, int MenuIt, char *MainMenu[], int Num,int step=24, DWORD FontColor=RGB(0,0,0), DWORD BackColor=RGB(255,255,0));

//显示活动菜单:(即有背景图)
int ShowAcMenu(int MenuIt, char *Menu[], int Num,DWORD FontColor=RGB(0,0,0), DWORD BackColor=RGB(255,255,0));

//清屏
void ScreenClr(DWORD color=RGB(255,255,255) );

//功能:带缩放的位图拷贝
//参数:目标表面,目标矩阵,原表面,拷贝范围,是否用顔色键。
BOOL SBlt(LPDIRECTDRAWSURFACE7 SS,RECT sr,LPDIRECTDRAWSURFACE7 DS,RECT dr,BOOL Flag);

inline void MakeGround();

bool SafeFreeDDrawSur(LPDIRECTDRAWSURFACE7 DdrawS);


/////////////////////////////////////////////////////////////////////////

//*********************************
//设置矩形
RECT GetRect(const int& x1,const int& y1,const int& x2,const int& y2)
{
	RECT TempRect={x1,y1,x2,y2};
	return TempRect;
}

/////////////////////////////////////////////////////////////////////////////////////
//ddraw:
/////////////////////////////////////////////////////////////////////////////////////
/**********************************************************************************
*  DDCopyBitmap
*
*  draw a bitmap into a DirectDrawSurface7
*
*	*pdds:目标绘图区,hbm:位图,x,y:源图左上角坐标,dx,dy:源图宽和长。
*
*************************************************************************************/
HRESULT DDCopyBitmap(IDirectDrawSurface7 *pdds, HBITMAP hbm, const int& x, const int& y, int dx, int dy)
{
    HDC                 hdcImage;
    HDC                 hdc;
    BITMAP              bm;
    DDSURFACEDESC2       ddsd;
    HRESULT             hr;
	
    if (hbm == NULL || pdds == NULL)
        return E_FAIL;
	
    //
    // make sure this surface is restored.
    //
    pdds->Restore();
	
    //
    //  select bitmap into a memoryDC so we can use it.
    //
    hdcImage = CreateCompatibleDC(NULL);
    if (!hdcImage)
        OutputDebugString("createcompatible dc failed\n");
    SelectObject(hdcImage, hbm);
	
    //
    // get size of the bitmap
    //
    GetObject(hbm, sizeof(bm), &bm);    // get size of bitmap
    dx = dx == 0 ? bm.bmWidth  : dx;    // use the passed size, unless zero
    dy = dy == 0 ? bm.bmHeight : dy;
	
    //
    // get size of surface.
    //
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
    pdds->GetSurfaceDesc(&ddsd);
	
    if ((hr = pdds->GetDC(&hdc)) == DD_OK)
    {
        StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY);
        pdds->ReleaseDC(hdc);
    }
	
    DeleteDC(hdcImage);
	
    return hr;
}

/***************************************************************
*
*	*pdds:目标绘图区,szBitmap:位图路径
*
*
*
******************************************************************/
HRESULT DDReLoadBitmap(IDirectDrawSurface7 *pdds, LPCSTR szBitmap)
{
    HBITMAP             hbm;
    HRESULT             hr;
	
    //
    //  try to load the bitmap as a resource, if that fails, try it as a file
    //
    hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
	
    if (hbm == NULL)
        hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	
    if (hbm == NULL)
    {
        OutputDebugString("handle is null\n");
        return E_FAIL;
    }
	
    hr = DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
    if (hr != DD_OK)
    {
        OutputDebugString("ddcopybitmap failed\n");
    }
	
	
    DeleteObject(hbm);
    return hr;
}

/**********************************************************************
*
*	lpTemp:幕后暂存绘图区,x,y:暂存区的宽和长,BitmapFile:源位图路径;
*	MemoryFlag:ddsd.ddsCaps.dwCaps的参数。
*
************************************************************************/
BOOL CreateBitmap(LPDIRECTDRAWSURFACE7 &lpTemp,const int& x,const int& y,char *BitmapFile, DWORD MemoryFlag )
{
	DDSURFACEDESC2	 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 = pDD7->CreateSurface( &ddsd, &lpTemp, NULL );
	if(ddrval !=DD_OK)
	  MessageBox(NULL,"建立幕后暂存区失败!","",MB_OK);
	
	if( BitmapFile!=NULL )
		DDReLoadBitmap(lpTemp,BitmapFile);
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////


BOOL InitDDraw(void)
{
	///////////////////////////初始化////////////////////////////////////
	
	result=DirectDrawCreateEx(NULL, (VOID**)&pDD7,IID_IDirectDraw7, NULL);
	
	if (result != DD_OK)
	{
		MessageBox(NULL,"建立DirectDraw对象失败!","",MB_OK);
		return false;
	}
	
	/////////////////////////////////////////////////////////////
	result = pDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE |
		DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT | DDSCL_ALLOWMODEX);
	
	if(result !=DD_OK)
		MessageBox(NULL,"设定程序协调层级失败!","",MB_OK);
	/////////////////////////////////////////////////////////////
	result = pDD7->SetDisplayMode(ScreenW,ScreenH,32,0,DDSDM_STANDARDVGAMODE); 	
	//result = pDD7->SetDisplayMode(ScreenW,ScreenH,16,0,DDSDM_STANDARDVGAMODE);  
	//置为16位色以后,则人物图暂时不能正常透明帖图
	if(result !=DD_OK)
		MessageBox(NULL,"设定屏幕显示模式失败!","",MB_OK);
	//////////////////////////////////////////////////////////
	memset(&desc,0,sizeof(desc));       
	desc.dwSize = sizeof(desc);           
	desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	desc.dwBackBufferCount = 1;        
	desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
	result = pDD7->CreateSurface(&desc,&pPSur,NULL);
	
	if(result !=DD_OK)
		MessageBox(NULL,"建立主绘图页失败!","",MB_OK);
	//////////////////////////////////////////////////////////
	caps.dwCaps = DDSCAPS_BACKBUFFER;  
	result = pPSur->GetAttachedSurface(&caps,&pBBuf); 
	
	if(result !=DD_OK)
		MessageBox(NULL,"连接后缓冲区失败!","",MB_OK);
	
	//>>>>>>>>>>>>>>>>>在CreateBitmap中,可以对幕后暂存区进行初始化:<<<<<<<<<<<<<<<<
	CreateBitmap(button1,220,240,"pics/sysmenu1.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(button2,220,240,"pics/sysmenu2.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(button3,150,400,"pics/chmenu.fim",DDSCAPS_SYSTEMMEMORY);

	CreateBitmap(finger,60,49,"pics/finger.fim",DDSCAPS_SYSTEMMEMORY);
	//设置颜色键。
	DDCOLORKEY key;
	key.dwColorSpaceLowValue=0xff00ff;
	key.dwColorSpaceLowValue=0xff00ff;
	button1->SetColorKey(DDCKEY_SRCBLT,&key);
	button2->SetColorKey(DDCKEY_SRCBLT,&key);
	finger->SetColorKey(DDCKEY_SRCBLT,&key);
	return 0;	
}

//初始化游戏中必须的表面
BOOL InitGameSurfaces()
{
	//人物表面区。

	CreateBitmap(pPlayer[0],96,192,"playerpic/npc-b04.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pPlayer[1],96,192,"playerpic/npc-b05.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pPlayer[2],96,192,"playerpic/npc-b01.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pPlayer[3],96,192,"playerpic/npc-b02.fim",DDSCAPS_SYSTEMMEMORY);

	CreateBitmap(lpDDSBackGround,ScreenW,ScreenH,"pics/background.fim",DDSCAPS_SYSTEMMEMORY);

	//边框表面:
	CreateBitmap(bk,ScreenW,ScreenH,"pics/bk.fim",DDSCAPS_SYSTEMMEMORY);

	//设置颜色键。
	DDCOLORKEY key;
	key.dwColorSpaceLowValue=0xffeebb;
	key.dwColorSpaceLowValue=0xffeebb;
	pPlayer[0]->SetColorKey(DDCKEY_SRCBLT,&key);
	pPlayer[1]->SetColorKey(DDCKEY_SRCBLT,&key);
	pPlayer[2]->SetColorKey(DDCKEY_SRCBLT,&key);
	pPlayer[3]->SetColorKey(DDCKEY_SRCBLT,&key);

	//菜单表面。
	CreateBitmap(pMenu,266,198,"pics/info.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pActiveMenu,280,120,"pics/menu.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pDialog1,640,382,"pics/dialog1.fim",DDSCAPS_SYSTEMMEMORY);

	//银行表面。
	CreateBitmap(bank,640,413,"pics/bank.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(bankbutton,155,150,"pics/bankmenu.fim",DDSCAPS_SYSTEMMEMORY);

	//系统菜单表面
	CreateBitmap(sysmenu,245,209,"pics/menu/sysmenu.fim",DDSCAPS_SYSTEMMEMORY);

	//卡片表面。
	CreateBitmap(sc,100,100,"pics/cards/stopcard.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(rd,100,100,"pics/cards/remodice.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(tt,100,100,"pics/cards/tortcard.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(cm,100,100,"pics/cards/compmanager.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(suc,100,100,"pics/cards/supercar.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(pp,100,100,"pics/cards/passport.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(choice,28,27,"pics/cards/choice.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(bc,100,100,"pics/cards/buycard.fim",DDSCAPS_SYSTEMMEMORY);

	//工厂图片
	CreateBitmap(autofSur,96,96,"map/big/aut.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(foodfSur,96,96,"map/big/foo.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(restafSur,96,96,"map/big/res.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(minerfSur,96,96,"map/big/min.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(spinmfSur,96,96,"map/big/spi.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(smeltfSur,96,96,"map/big/sem.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(buildingSur,96,96,"map/big/bui.fim",DDSCAPS_SYSTEMMEMORY);

	//地图及障碍表面。
	CreateBitmap(lpDDSMap1,160,352,"map/Image1.fim", DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(lpDDSMap2,480,672,"map/Image2.fim",DDSCAPS_SYSTEMMEMORY);

	key.dwColorSpaceLowValue=0xff00ff;
	key.dwColorSpaceLowValue=0xff00ff;

	lpDDSMap2->SetColorKey(DDCKEY_SRCBLT,&key);

	choice->SetColorKey(DDCKEY_SRCBLT,&key);
	sysmenu->SetColorKey(DDCKEY_SRCBLT,&key);
	sc->SetColorKey(DDCKEY_SRCBLT,&key);
	rd->SetColorKey(DDCKEY_SRCBLT,&key);
	tt->SetColorKey(DDCKEY_SRCBLT,&key);
	cm->SetColorKey(DDCKEY_SRCBLT,&key);
	suc->SetColorKey(DDCKEY_SRCBLT,&key);
	pp->SetColorKey(DDCKEY_SRCBLT,&key);
	bc->SetColorKey(DDCKEY_SRCBLT,&key);

	buildingSur->SetColorKey(DDCKEY_SRCBLT,&key);
	autofSur->SetColorKey(DDCKEY_SRCBLT,&key);
	foodfSur->SetColorKey(DDCKEY_SRCBLT,&key);
	restafSur->SetColorKey(DDCKEY_SRCBLT,&key);
	minerfSur->SetColorKey(DDCKEY_SRCBLT,&key);
	spinmfSur->SetColorKey(DDCKEY_SRCBLT,&key);
	smeltfSur->SetColorKey(DDCKEY_SRCBLT,&key);

	//操作选单表面
	CreateBitmap(go,120,55,"pics/menu/go.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(uset,120,55,"pics/menu/uset.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(buy,120,55,"pics/menu/buy.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(select,620,150,"pics/menu/select.fim",DDSCAPS_SYSTEMMEMORY);
	CreateBitmap(shop,640,413,"pics/shop.fim",DDSCAPS_SYSTEMMEMORY);

	key.dwColorSpaceLowValue=0xffffff;
	key.dwColorSpaceLowValue=0xffffff;
//	pBar->SetColorKey(DDCKEY_SRCBLT,&key);
	bk->SetColorKey(DDCKEY_SRCBLT,&key);
	return 0;
}

//███████████████████████████████████████
//*****************************************************
//换页
//███████████████████████████████████████
inline void Flip(void)
{
	HRESULT ddrval;
	while( 1 )
	{
		ddrval = pPSur->Flip( NULL, DDFLIP_WAIT );
		//Flip中的NULL表示将 cycles through the buffers 
		//	in the order they are attached to each other。
		if( ddrval == DD_OK )
		{
			break;
		}
		if( ddrval == DDERR_SURFACELOST )
		{
			//关于DDER_SURFACELOST:
			//Access to the surface is refused because the surface memory is gone. 
			//The DirectDrawSurface object representing this surface should have the
			//IDirectDrawSurface3::Restore method called on it. 
			ddrval = restoreAll();
			if( ddrval != DD_OK )
			{
				break;
			}
		}
		if( ddrval != DDERR_WASSTILLDRAWING )
		{
			break;
		}
	}
}

//********************
//恢复所有页面
HRESULT restoreAll( void )
{
    HRESULT	ddrval;
    ddrval = pPSur->Restore();
	ddrval = pBBuf->Restore();
//	ddrval = pOPla->Restore();
	for(int i=0;i<playernum;i++)
	{
		ddrval = pPlayer[i]->Restore();
	}
	ddrval = lpDDSBackGround->Restore();
	ddrval = lpDDSMap1->Restore();
	ddrval = lpDDSMap2->Restore();
	ddrval = pMenu->Restore();
    return ddrval;
	
} /* restoreAll */

//*********************************
//文字显示
//参数:显示表面;左上角坐标:x,y;显示文字;文字颜色;显示模式(是否透明);背景颜色;宽度)
void PrintText(LPDIRECTDRAWSURFACE7 Surf,int x,int y,char *Text,DWORD color,
			   DWORD BK, DWORD BkColor,int WIDTH)
{
	HDC hdc;
	int ChrLen;

⌨️ 快捷键说明

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