📄 graphics.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////////////////
// GRAPHICS.CPP
/////////////////////////////////////////////////////////////////////////////////////////////
#include "graphics.h"
#include "engine.h"
#include <ddutil.h>
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSFront;
LPDIRECTDRAWSURFACE lpDDSBack;
LPDIRECTDRAWSURFACE lpDDSBackground;
LPDIRECTDRAWSURFACE lpDDSForeground;
extern OBJECT Blocks;
extern OBJp Player;
extern OBJp Ball;
/////////////////////////////////////////////////////////////////////////////////////////////
// InitGraphics
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL InitGraphics(HWND hWnd)
{
HRESULT rval;
DDSCAPS ddscaps;
DDSURFACEDESC ddsd;
rval = DirectDrawCreate(NULL, &lpDD, NULL);
if(rval != DD_OK) return FALSE;
rval = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if(rval != DD_OK) return FALSE;
rval = lpDD->SetDisplayMode(640, 480, 16);
if(rval != 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;
rval = lpDD->CreateSurface(&ddsd, &lpDDSFront, NULL);
if(rval != DD_OK) return FALSE;
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
rval = lpDDSFront->GetAttachedSurface(&ddscaps, &lpDDSBack);
if(rval != DD_OK) return FALSE;
lpDDSBackground = DDLoadBitmap(lpDD, "BACK", 0, 0);
if(FAILED(rval)) return FALSE;
lpDDSForeground = DDLoadBitmap(lpDD, "FORE", 0, 0);
if(FAILED(rval)) return FALSE;
DDSetColorKey(lpDDSForeground, RGB(255,255,255));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// FiniGraphics
/////////////////////////////////////////////////////////////////////////////////////////////
void FiniGraphics()
{
if(lpDD)
{
if(lpDDSFront)
{
lpDDSFront->Release();
lpDDSFront = NULL;
}
if(lpDDSBackground)
{
lpDDSBackground->Release();
lpDDSBackground = NULL;
}
if(lpDDSForeground)
{
lpDDSForeground->Release();
lpDDSForeground = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// RestoreGraphics
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL RestoreGraphics()
{
HRESULT rval;
rval = lpDDSFront->Restore();
if(FAILED(rval)) return FALSE;
rval = lpDDSBackground->Restore();
if(FAILED(rval)) return FALSE;
DDReLoadBitmap(lpDDSBackground, "BACK");
rval = lpDDSForeground->Restore();
if(FAILED(rval)) return FALSE;
DDReLoadBitmap(lpDDSForeground, "FORE");
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// UpdateGraphics
/////////////////////////////////////////////////////////////////////////////////////////////
void UpdateGraphics()
{
HRESULT rval;
RECT SrcRect;
OBJp node;
SetRect(&SrcRect, 0, 0, 640, 480);
lpDDSBack->BltFast(0, 0, lpDDSBackground, &SrcRect, DDBLTFAST_WAIT);
SetRect(&SrcRect, 0, 0, 60, 15);
lpDDSBack->BltFast(Player->PosX, Player->PosY, lpDDSForeground, &SrcRect, DDBLTFAST_SRCCOLORKEY);
SetRect(&SrcRect, 0, 15, 10, 25);
lpDDSBack->BltFast(Ball->PosX, Ball->PosY, lpDDSForeground, &SrcRect, DDBLTFAST_SRCCOLORKEY);
SetRect(&SrcRect, 0, 25, 31, 45);
for(node = Blocks.Next; node != &Blocks; node = node->Next)
{
lpDDSBack->BltFast(node->PosX, node->PosY, lpDDSForeground, &SrcRect, DDBLTFAST_WAIT);
}
rval = lpDDSFront->Flip(NULL, DDFLIP_WAIT);
if(rval == DDERR_SURFACELOST) RestoreGraphics();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -