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

📄 graph.cpp

📁 一个RPG游戏的初级演示代码
💻 CPP
字号:
#include "Main.h"

Graph *graph;

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE DDS[DDSNum]; 
int SW[DDSNum];
int SH[DDSNum];

Graph::Graph()
{

}

int Graph::Init()
{
//-----------------------------初始化DirectDraw----------------------
	DDSURFACEDESC ddsd;
    if (DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK)
		return 0;
	if (lpDD->SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)
		return 0;
	if (lpDD->SetDisplayMode(640,480,32)!=DD_OK) 
		if (lpDD->SetDisplayMode(640,480,24)!=DD_OK)
			return -1;
//-----------------------------初始化各页面--------------------------
	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,&DDS[SPrimary],NULL)!=DD_OK)
      	return -2;
	ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
	if ( DD_OK != DDS[SPrimary]->GetAttachedSurface( &ddsd.ddsCaps, &DDS[SBuffer] ) )
		return -2;
	ddsd.dwSize=sizeof(ddsd);
	ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT; 
	ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;

	SW[SPrimary] = SW[SBuffer]=640;
	SH[SPrimary] = SH[SBuffer]=480;
	SW[SBack] = 1280;	SH[SBack] = 640;
	SW[STile] = 64;		SH[STile] = 62;
	SW[SSprite] = 256;	SH[SSprite] = 512;
	SW[SMouse] = 32;	SH[SMouse] = 26;
	
	for (int i=2;i<DDSNum;i++)
	{
		ddsd.dwWidth=SW[i];
		ddsd.dwHeight=SH[i];
		if ( DD_OK != lpDD->CreateSurface( &ddsd, &DDS[i], NULL ) )
			return -2;
	}
//-----------------------------清空页面------------------------------
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillPixel=0;
	DDS[SPrimary]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBuffer]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBack]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[STile]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SSprite]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SMouse]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
//-----------------------------向页面调入图像------------------------
	DDReLoadBitmap(DDS[STile],"Tile.bmp");
	DDReLoadBitmap(DDS[SSprite],"Sprite.bmp");
	DDReLoadBitmap(DDS[SMouse],"Mouse.bmp");
//-----------------------------设置透明色----------------------------
	DDSetColorKey(DDS[SSprite],RGB(0,0,0));
	DDSetColorKey(DDS[STile],RGB(255,0,255));
	DDSetColorKey(DDS[SMouse],RGB(0,255,0));
//-----------------------------初始化背景----------------------------
	srand(GetTickCount()); //初始化随机数
	for (i=0;i<20;i++)
		for (int j=0;j<20;j++)
		{
			int ran=rand()%2;
			MakeRect(0,ran*31,64,ran*31+31);
			DDS[SBack]->BltFast(608-32*i+32*j,16*i+16*j,DDS[STile],&rect,SrcKey);
		}
	return 1;
}

void Graph::Refresh(int time)
{
//-----------------------------先清屏幕------------------------------
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillColor=0;
	DDS[SBuffer]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
//-----------------------------放背景--------------------------------
	int mx=sprite->x+320;
	int my=sprite->y+240;
	MakeRect(mx-640,my-480,mx,my);
	Blt(0,0,SBack,SBuffer,NoKey);
//-----------------------------放精灵--------------------------------
	sprite->Show();
//-----------------------------放鼠标--------------------------------
	POINT	curpos;
	GetCursorPos(&curpos);
	MakeRect(0,0,32,26);
	Blt(curpos.x,curpos.y,SMouse,SBuffer,SrcKey);
//-----------------------------放标题和FPS---------------------------
	HDC hdc;
	char *text="A Very Simple RPG";
	if (DDS[SBuffer]->GetDC(&hdc) == DD_OK)
	{ 
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc, RGB(255, 255, 255));
		TextOut(hdc,0,0, text, strlen(text));

		char fpsstr[9];
		gcvt(1000/(time+1),4,fpsstr); //显示的FPS比实际要小一点 :-)
		                              //防止time=0时strcat出错
		strcat(fpsstr," FPS");
		TextOut(hdc,570,0,fpsstr, strlen(fpsstr));
		DDS[SBuffer]->ReleaseDC(hdc);
	}
//-----------------------------翻页并完成刷新------------------------
	HRESULT ddrval;
	ddrval = DDS[SPrimary]->Flip(NULL,DDFLIP_WAIT);
	if (ddrval==DDERR_SURFACELOST) 
		Restore();
}

void Graph::Restore()
{
	for (int i=0;i<DDSNum;i++)
		DDS[i]->Restore( );
//-----------------------------清空页面------------------------------
	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillPixel=0;
	DDS[SPrimary]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBuffer]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBack]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[STile]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SSprite]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SMouse]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
//-----------------------------向页面调入图像------------------------
	DDReLoadBitmap(DDS[STile],"Tile.bmp");
	DDReLoadBitmap(DDS[SSprite],"Sprite.bmp");
	DDReLoadBitmap(DDS[SMouse],"Mouse.bmp");
//-----------------------------设置透明色----------------------------
	DDSetColorKey(DDS[SSprite],RGB(0,0,0));
	DDSetColorKey(DDS[STile],RGB(255,0,255));
	DDSetColorKey(DDS[SMouse],RGB(0,255,0));
//-----------------------------初始化背景----------------------------
	srand(GetTickCount());
	for (i=0;i<20;i++)
		for (int j=0;j<20;j++)
		{
			int ran=rand()%2;
			MakeRect(0,ran*31,64,ran*31+31);
			DDS[SBack]->BltFast(608-32*i+32*j,16*i+16*j,DDS[STile],&rect,SrcKey);
		}
}

Graph::~Graph()
{
	for (int i=0;i<DDSNum;i++)
		DDS[i]->Release();
	lpDD->Release();
//其实一般情况下象上面那样释放DirectDraw对象就可以了
}

void Graph::Blt(int x,int y,int src_id,int dest_id,int method)
{
	int rl,rt,tx1,tx2,ty1,ty2,tl,tt;
	RECT rect2=rect;

	rl=rect.left;
	rt=rect.top;

	if (rect.left>=SW[src_id])
		goto noblt; //越界,不Blt
	if (rect.top>=SH[src_id])
		goto noblt;
	if (rect.right<=0)
		goto noblt;
	if (rect.bottom<=0)
		goto noblt;

	if (rect.left<0)
		rect.left=0;
	if (rect.top<0)
		rect.top=0;
	if (rect.right>SW[src_id])
		rect.right=SW[src_id];
	if (rect.bottom>SH[src_id])
		rect.bottom=SH[src_id];

	tx1=x+rect.left-rl;
	ty1=y+rect.top-rt;
	tx2=x+rect.right-rl;
	ty2=y+rect.bottom-rt;

	if (tx2<=0)
		goto noblt;
	if (ty2<=0)
		goto noblt;
	if (tx1>=SW[dest_id])
		goto noblt;
	if (ty1>=SH[dest_id])
		goto noblt;

	tl=tx1;
	tt=ty1;

	if (tx1<0)
		tx1=0;
	if (ty1<0)
		ty1=0;
	if (tx2>SW[dest_id])
		tx2=SW[dest_id];
	if (ty2>SH[dest_id])
		ty2=SH[dest_id];
	
	rl=rect.left;
	rt=rect.top;

	rect.left=tx1-tl+rl;
	rect.top=ty1-tt+rt;
	rect.right=tx2-tl+rl;
	rect.bottom=ty2-tt+rt;

	DDS[dest_id]->BltFast(tx1,ty1,DDS[src_id],&rect,method);
noblt: 
	rect=rect2;
}

⌨️ 快捷键说明

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