📄 graph.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 + -