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

📄 directwnd.cpp

📁 坦克游戏
💻 CPP
字号:
// DirectWnd.cpp: implementation of the CDirectWnd class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DirectWnd.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDirectWnd::CDirectWnd()
{
	lpDD=NULL;
    lpFrontBuffer=NULL;
    lpBackBuffer=NULL;
    nBufferCount=1;
}

CDirectWnd::~CDirectWnd()
{
	if(lpDD)
    {
		CleanSurface();
		lpDD->Release();
        lpDD=NULL;
    }
}

void CDirectWnd::CleanSurface()
{
    if(lpBackBuffer)
    {
        lpBackBuffer->Release();
        lpBackBuffer=NULL;
    }
    if(lpFrontBuffer)
    {
        lpFrontBuffer->Release();
        lpFrontBuffer=NULL;
    }
    return;
}

void CDirectWnd::LoadBitmapResource()
{
	lpBKGObject[0]=DDLoadBitmap(lpDD,"pictures//loading.bmp",640,480);
	lpBKGObject[1]=DDLoadBitmap(lpDD,"pictures//choose.bmp",640,480);
	lpBKGObject[2]=DDLoadBitmap(lpDD,"pictures//Tanks.bmp",32*8,32*16);
	lpBKGObject[3]=DDLoadBitmap(lpDD,"pictures//Objects.bmp",7*32,32);
	lpBKGObject[4]=DDLoadBitmap(lpDD,"pictures//Bullet1.bmp",4*8,8);
	lpBKGObject[5]=DDLoadBitmap(lpDD,"pictures//birth.bmp",4*32,32);
	lpBKGObject[6]=DDLoadBitmap(lpDD,"pictures//lossgame.bmp",640,480);

	lpBKGObject[7]=DDLoadBitmap(lpDD,"pictures//bullet21.bmp",21*4,59);
	lpBKGObject[8]=DDLoadBitmap(lpDD,"pictures//bullet22.bmp",59,21*4);
	lpBKGObject[9]=DDLoadBitmap(lpDD,"pictures//bullet23.bmp",21*4,59);
	lpBKGObject[10]=DDLoadBitmap(lpDD,"pictures//bullet24.bmp",59,21*4);
	
	
	lpBKGObject[11]=DDLoadBitmap(lpDD,"pictures//explode1.bmp",32*7,32);
	lpBKGObject[12]=DDLoadBitmap(lpDD,"pictures//explode2.bmp",32*10,32);
	lpBKGObject[13]=DDLoadBitmap(lpDD,"pictures//explode3.bmp",32*8,32);
	lpBKGObject[14]=DDLoadBitmap(lpDD,"pictures//explode4.bmp",32*5,32);

	lpBKGObject[15]=DDLoadBitmap(lpDD,"pictures//plane.bmp",35,35);
	lpBKGObject[16]=DDLoadBitmap(lpDD,"pictures//bonus.bmp",32,32*10);

	lpBKGObject[17]=DDLoadBitmap(lpDD,"pictures//players.bmp",24*2,24);
	lpBKGObject[18]=DDLoadBitmap(lpDD,"pictures//instruction.bmp",640,480);
	lpBKGObject[19]=DDLoadBitmap(lpDD,"pictures//level.bmp",640,480);
	
	
}

void CDirectWnd::Create(LPCSTR lpszAppName)
{
	CString className=AfxRegisterWndClass(
		CS_DBLCLKS,
		AfxGetApp()->LoadCursor(IDC_CURSOR),
        NULL,
		AfxGetApp()->LoadIcon(IDR_MAINFRAME) );
	//===========================================
    CWnd::CreateEx(	WS_EX_APPWINDOW,
					className,
					lpszAppName,
					WS_VISIBLE|WS_SYSMENU|WS_POPUP,
					0,
					0,
					GetSystemMetrics(SM_CXSCREEN),
					GetSystemMetrics(SM_CYSCREEN),NULL,NULL	);
	//动态创建信息,通过调用父类的构造函数,被封装再CWnd::CreateEx()中
	return;
}

BOOL CDirectWnd::InitializeWnd(UINT GModeX,UINT GModeY,UINT GBPP)
{
	DDSURFACEDESC ddsd ; //表面描述
	DDSCAPS ddscaps ;
	
	::ZeroMemory(&ddsd,sizeof(ddsd));//清零(起始,长度)
	//创建DirectDraw对象
    DirectDrawCreate(NULL,&lpDD,NULL);
	//取得独占和全屏模式
    lpDD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
    //设置显示模式
	lpDD->SetDisplayMode(GModeX,GModeY,GBPP);
    //也可以加 HRESULT ddrval;	它是下面三个函数的返回值.
	DDCAPS ddcaps;
	ddcaps.dwSize=sizeof(ddcaps);
    lpDD->GetCaps(&ddcaps,NULL);
	
	//填充主表面信息
    ddsd.dwSize=sizeof(ddsd);
    ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount=nBufferCount;
	//创建主表面对象
    
	lpDD->CreateSurface(&ddsd,&lpFrontBuffer,NULL);		
    //提取后台缓存表面指针

    ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
    lpFrontBuffer->GetAttachedSurface(&ddscaps,&lpBackBuffer);

	LoadBitmapResource();
	return TRUE;
}

void CDirectWnd::BltBitMap(LPDIRECTDRAWSURFACE bk,CRect &rt1,
						   LPDIRECTDRAWSURFACE bitmap,CRect &rt2)
{// rt2 ---> rt1
	bk->Blt(
		CRect(rt1.left,rt1.top,rt1.right,rt1.bottom),//dest rect
		bitmap,//src surface
		CRect(rt2.left,rt2.top,rt2.right,rt2.bottom),//src rect
		DDBLT_WAIT,
		NULL);
	return;
}


void CDirectWnd::FlipScreen()
{
    while(TRUE)
    {
        HRESULT ddrval;
        ddrval=lpFrontBuffer->Flip(NULL,0);	//一经Flip,两个表面的指针互换!
		if(ddrval==DD_OK)break;
    }
//==================清空
/*	DDBLTFX ddbltfx;
	ddbltfx.dwSize=sizeof(ddbltfx);
    ddbltfx.dwFillColor=0;
	ddrval=lpBackBuffer->Blt(
        NULL,//dest rect
        NULL,//src surface
        NULL,//src rect
        DDBLT_COLORFILL|DDBLT_WAIT,
        &ddbltfx);
*/	return;
}

⌨️ 快捷键说明

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