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

📄 graphics.cpp

📁 this block game source
💻 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 + -