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

📄 dxfunction.cpp

📁 一个平面RPG的游戏demo,使用directx
💻 CPP
字号:
#include "RpgMain.h"
//---------------Main DDRAW Init------------------------------------
void InitDDS(void)
{
	FreeDDraw();
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillColor=0;
 	DDReLoadBitmap(lpDDSHuman,"Human.bmp");
	DDReLoadBitmap(lpDDSSprite,"Sprite.bmp");
	DDReLoadBitmap(lpDDSMap,"Inn.bmp");
	DDReLoadBitmap(lpDDSBox,"Box.bmp");
	DDReLoadBitmap(lpDDSBar,"Bar.bmp");
	DDReLoadBitmap(lpDDSThing,"Thing.bmp");
	DDReLoadBitmap(lpDDSPanel,"panel.bmp");
	DDReLoadBitmap(lpDDSMouse,"mouse.bmp");
	MakeRect(0,0,640,480);
	lpDDSPrimary->BltFast(0,0,lpDDSMap,&r,NoKey);
	DDSetColorKey(lpDDSHuman,RGB(0,255,0));
	DDSetColorKey(lpDDSSprite,RGB(0,255,0));
	DDSetColorKey(lpDDSOver,RGB(0,255,0));
	DDSetColorKey(lpDDSMouse,RGB(0,255,0));
	DDSetColorKey(lpDDSBox,RGB(0,255,0));
	DDSetColorKey(lpDDSBar,RGB(0,255,0));
	DDSetColorKey(lpDDSThing,RGB(0,255,0));
	DDSetColorKey(lpDDSPanel,RGB(0,255,0));
	CleanOver();
//	RefreshAll();
}
//---------------Basic DDRAW Functions------------------------------
BOOL InitDDraw(void)
{
    DDSURFACEDESC ddsd;

    if ( DirectDrawCreate( NULL, &lpDD, NULL ) != DD_OK )
		return FALSE;
    if ( lpDD->SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)
		!=DD_OK) return FALSE;
    if ( lpDD->SetDisplayMode( 640, 480, 16 ) != DD_OK) return FALSE;
	ddsd.dwSize = sizeof( ddsd );
	ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |DDSCAPS_COMPLEX;
	ddsd.dwBackBufferCount = 1;
    if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK)
        return FALSE;

	ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
	if ( DD_OK != lpDDSPrimary->GetAttachedSurface (&ddsd.ddsCaps, &lpDDSBuffer))
		return FALSE;

	ddsd.dwSize = sizeof( ddsd );
	ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
	ddsd.dwHeight=480;
	ddsd.dwWidth=640;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSMap, NULL) )
		return FALSE;
	ddsd.dwHeight=800;
	ddsd.dwWidth=160;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSHuman, NULL) )
		return FALSE;
	ddsd.dwHeight=128;
	ddsd.dwWidth=320;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSSprite, NULL) )
		return FALSE;
	ddsd.dwHeight=480;
	ddsd.dwWidth=640;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSOver, NULL) )
		return FALSE;
	ddsd.dwHeight=60;
	ddsd.dwWidth=74;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSBox, NULL) )
		return FALSE;
	ddsd.dwHeight=100;
	ddsd.dwWidth=40;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSBar, NULL) )
		return FALSE;
	ddsd.dwHeight=45;
	ddsd.dwWidth=128;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSThing, NULL) )
		return FALSE;
	ddsd.dwHeight=131;
	ddsd.dwWidth=461;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSPanel, NULL) )
		return FALSE;
	ddsd.dwHeight=26;
	ddsd.dwWidth=32;
	if ( DD_OK != lpDD->CreateSurface( &ddsd, &lpDDSMouse, NULL) )
		return FALSE;
	return TRUE;
}

HRESULT Restore(void)
{
    HRESULT ddrval;
	ddrval = lpDDSPrimary->Restore();
	ddrval = lpDDSBuffer->Restore();
    ddrval = lpDDSHuman->Restore();
	ddrval = lpDDSMap->Restore();
	ddrval = lpDDSSprite->Restore();
	ddrval = lpDDSOver->Restore();
	ddrval = lpDDSBox->Restore();
	ddrval = lpDDSBar->Restore();
	ddrval = lpDDSThing->Restore();
	InitDDS();
	return ddrval;
}

void FreeDDraw(void)
{
	DDPIXELFORMAT ddpf;
	ddpf.dwSize = sizeof(ddpf);
	lpDDSBuffer->GetPixelFormat(&ddpf);
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillColor=(WORD)ddpf.dwGBitMask;
	lpDDSPrimary ->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSBuffer->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSMap->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSHuman->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSSprite->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSOver->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSBox->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	lpDDSBar->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
    lpDDSThing->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
}

void Flip()
{
	HRESULT ddrval;
	ddrval=lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
	if (ddrval==DDERR_SURFACELOST) 
		Restore();
}

void MakeItSame()
{
	MakeRect(0,0,640,480);
	lpDDSBuffer->BltFast(0,0,lpDDSPrimary,&r,NoKey);
}

void CleanRect(LPDIRECTDRAWSURFACE lpDDS)
{
	DDPIXELFORMAT ddpf;
	ddpf.dwSize = sizeof(ddpf);
	lpDDSBuffer->GetPixelFormat(&ddpf);
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillColor=(WORD)ddpf.dwGBitMask;
	lpDDS->Blt(&r,NULL,&r,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
}

//---------------Over Surface Functions----------------------------
void CleanOver()
{ 
	MakeRect(0,0,640,480);
	CleanRect(lpDDSOver);
	Print("RPG DEMO 0.090 Build 0225 By Kane_Peng",10,10);
	Print("http://go.163.com/~kanepeng",10,30);
	MakeRect(0,0,461,131);
	lpDDSOver->BltFast(179,349,lpDDSPanel,&r,SrcKey);
	MakeRect(0,100-Human[Boy]->health,10,100);
	lpDDSOver->BltFast(587,477-Human[Boy]->health,lpDDSBar,&r,SrcKey);
	MakeRect(10,100-Human[Boy]->ti,20,100);
	lpDDSOver->BltFast(607,477-Human[Boy]->ti,lpDDSBar,&r,SrcKey);
	MakeRect(20,100-Human[Boy]->nei,30,100);
	lpDDSOver->BltFast(627,477-Human[Boy]->nei,lpDDSBar,&r,SrcKey);
	for (int i=0;i<Human[Boy]->ThingAmount;i++)
	{
		MakeRect(Human[Boy]->Thing[i]*32,0);
		lpDDSOver->BltFast(189+38*i,439,lpDDSThing,&r,SrcKey);
	}
	if (Human[Boy]->weapon==Hand)
	{
		DrawRGBBox(491,437,36,36,1,1);
		DrawRGBBox(529,437,36,36,1,0);
	}
	else 
	{
		DrawRGBBox(529,437,36,36,1,1);
		DrawRGBBox(491,437,36,36,1,0);
	}
}

⌨️ 快捷键说明

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