📄 myddraw.h
字号:
#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 + -