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

📄 bmframe.cpp

📁 类似泡泡堂程序代码 类属游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BMFrame.cpp : implementation file
//
#define DIRECTINPUT_VERSION 0x0700
#include "stdafx.h"
#include "resource.h"
#include "BMFrame.h"
#include "BMBomb.h"
#include "BMPlayer.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// BMFrame
IMPLEMENT_DYNCREATE(BMFrame, CFrameWnd)

//声明 DirectDraw 变量
LPDIRECTDRAW7              DD;  
LPDIRECTDRAWSURFACE7       DDSur; 
LPDIRECTDRAWSURFACE7       DDBuf; 
LPDIRECTDRAWSURFACE7	   DDPla[15];
DDSCAPS2				   DDcaps;
DDSURFACEDESC2             DDde;
HRESULT					   result;
DDCOLORKEY                 key;

//声明 DirectSound 变量
LPDIRECTSOUND			   DS;          
LPDIRECTSOUNDBUFFER        DSPri;  
LPDIRECTSOUNDBUFFER        DSBuf[15];  
WAVEFORMATEX			   DSfmt;         
WAVEFORMATEX			   wfmt;        
DSBUFFERDESC			   DSde;        
MMCKINFO				   ckRiff;       
MMCKINFO				   ckInfo;     
MMRESULT				   mmresult;    
HMMIO					   hmmio;              
DWORD					   wsize;                 
LPVOID					   pAudio;
DWORD					   bytesAudio;

//声明 DirectInput 变量
LPDIRECTINPUT7			   DI;       
LPDIRECTINPUTDEVICE7	   DIkb;
char					keybuffer[256];

//声明其它变量
HDC hdc,dhdc;
HBITMAP bitmap;
int i, j, k, l;

int posP1, posP2;
char map[13][18];
bool isthing; 
bool isstate; 
int picnum;
int gametime = 0;		//游戏时钟
int bombtotal = 0;		//炸弹总数

BMPlayer player[6];		//玩家
BMBomb bomb[36];		//炸弹

int gamestate = MAINMENU;	//游戏状态
int menuselect = 0;
bool menudown;

//constructor & destructor
BMFrame::BMFrame()
{
	Create(NULL,"绘图窗口",WS_POPUP); 
	hdc = ::CreateCompatibleDC(NULL);
	::ShowCursor(false);

	//加载图片
	CreateDDPla(800,600,"resource\\image\\back.bmp",0);
	CreateDDPla(540,240,"resource\\image\\move.bmp",1);
	ColorKey(1);
	CreateDDPla(200,320,"resource\\image\\thing.bmp",2);
	ColorKey(2);
	CreateDDPla(200,480,"resource\\image\\state.bmp",3);
	ColorKey(3);
	CreateDDPla(960,480,"resource\\image\\over.bmp",4);
	ColorKey(4);
	CreateDDPla(800,600,"resource\\image\\enter.bmp",5);	
	CreateDDPla(600,150,"resource\\image\\menu.bmp",6);
	ColorKey(6);


	//加载音乐
	CreateDSBuf("resource\\sound\\back.wav",0);
	CreateDSBuf("resource\\sound\\lay.wav",1);
	CreateDSBuf("resource\\sound\\bomb.wav",2);
	CreateDSBuf("resource\\sound\\award.wav",3);
	CreateDSBuf("resource\\sound\\get.wav",4);
	CreateDSBuf("resource\\sound\\trap.wav",5);
	CreateDSBuf("resource\\sound\\out.wav",6);
	CreateDSBuf("resource\\sound\\main.wav",7);
	CreateDSBuf("resource\\sound\\select.wav",8);
	CreateDSBuf("resource\\sound\\click.wav",9);

	//读取地图
	readMap();

	srand((unsigned)time(NULL));

	DSBuf[7]->Play(0,0,1);

}

BMFrame::~BMFrame()
{
	for (i=0; i<15; i++)
		if (DDPla[i])
			DDPla[i]->Release();
	if (DDBuf)
		DDBuf->Release();
	if (DDSur)
		DDSur->Release();
	if (DD)
		DD->Release();

	if (DIkb)
		DIkb->Release();
	if (DI)
		DI->Release();

	for(i=0; i<15; i++)
		if (DSBuf[i])
			DSBuf[i]->Release();
	if (DSPri)
		DSPri->Release();
	if (DS)
		DS->Release();
}


BEGIN_MESSAGE_MAP(BMFrame, CFrameWnd)
	//{{AFX_MSG_MAP(BMFrame)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	ON_WM_CREATE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// BMFrame message handlers
int BMFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	InitDD();
	InitDS();
	InitDI();
	SetTimer(1,10,NULL);
	return 0;
}


void BMFrame::OnTimer(UINT nIDEvent) 
{
	gametime ++;
	if (gametime == 30000)
		gametime = 0;
	//接收玩家动作
	checkAction();

	switch (gamestate)
	{
	case SINGLE:
		playSingle();    //单人游戏进行中
		break;
	case VERSUS:
		playVersus();    //游戏正在进行中
		break;
	default:
		break;
	}
	
	//绘制图像
	renderFrame();

	while (1){
		result = DDSur->Flip( NULL , DDFLIP_WAIT );
			
		if ( result==DD_OK)
			break ;
		if ( result==DDERR_SURFACELOST ){
			if (DD->RestoreAllSurfaces()!=DD_OK)
				break;
			CreateDDPla(800,600,"resource\\image\\back.bmp",0);
			CreateDDPla(180,240,"resource\\image\\move.bmp",1);
			ColorKey(1);
			CreateDDPla(200,320,"resource\\image\\thing.bmp",2);
			ColorKey(2);
			CreateDDPla(200,480,"resource\\image\\state.bmp",3);
			ColorKey(3);
			CreateDDPla(320,480,"resource\\image\\over.bmp",4);
			ColorKey(4);
		}
		if (result != DDERR_WASSTILLDRAWING){
	            break;
		}
	}

	CFrameWnd::OnTimer(nIDEvent);
}

void BMFrame::Over()
{

}

void BMFrame::readMap()
{
	FILE *stream;
	if ((stream = fopen( "resource\\map.dat", "r")) == NULL ) 
	{
		MessageBox("读取地图失败!");
		return;
	}
	fread(map, sizeof(char),234, stream);
	fclose(stream);
}

void BMFrame::checkAction()
{
	result = DIkb->GetDeviceState(sizeof(keybuffer),(LPVOID)&keybuffer);
	if (result != DI_OK)
	{
		MessageBox("取得键盘状态失败!");
		return;
	}

	if (keybuffer[DIK_ESCAPE] & 0x80)	//按下 Esc 键
	{
		PostMessage(WM_CLOSE);  //结束程序
	}

	if (keybuffer[DIK_RETURN] & 0x80)	//按下 Esc 键
	{
		player[0].alive = true;  //结束程序
		player[1].alive = true;
	}

	if (gamestate == MAINMENU)
	{
		if (keybuffer[DIK_RETURN] & 0x80)	//按下 Enter 键
		{
			DSBuf[9]->Play(0,0,0);
			DSBuf[7]->Stop();
			gamestate = SINGLE + menuselect;

			//随机初始位置
			posP1 = rand()%6;
			player[0].initPos();
			if (menuselect == 1)
			{
				posP2 = posP1;
				posP1 = (posP1+rand()%5+1)%6;
				player[1].initPos();
			}

			DSBuf[0]->Play(0,0,1);
		}
		if ((keybuffer[DIK_UP] & 0x80) && gametime>20)	//按下 上 键
		{
			DSBuf[8]->Play(0,0,0);
			menuselect = (menuselect+2)%3;
			gametime = 0;
			menudown = false;
		}
		if ((keybuffer[DIK_DOWN] & 0x80) && gametime>20)	//按下 下 键
		{
			DSBuf[8]->Play(0,0,0);
			menuselect = (menuselect+1)%3;
			gametime = 0;
			menudown = true;
		}
	}
	else if (gamestate==SINGLE && player[0].alive)
	{
		//方向判断
		if (keybuffer[DIK_DOWN] & 0x80)	//按下 下 键
		{
			//贴图选择
			if (player[0].lastaction == 0)
			{
				player[0].movetime++;
				if (player[0].movetime == 20)
				{
					player[0].movetime = 0;
				}
			}
			else
			{
				player[0].movetime = 0;
				player[0].lastaction = 0;
			}		
			player[0].offsetX = 60 * (player[0].movetime/10+1);

			//位置移动	
			player[0].doMove();
		}
		else if (keybuffer[DIK_UP] & 0x80)	//按下 上 键
		{
			//贴图选择
			if (player[0].lastaction == 1)
			{
				player[0].movetime++;
				if (player[0].movetime == 20)
				{
					player[0].movetime = 0;
				}
			}
			else
			{
				player[0].movetime = 0;
				player[0].lastaction = 1;
			}		
			player[0].offsetX = 60 * (player[0].movetime/10+1);

			//位置移动	
			player[0].doMove();
		}
		else if (keybuffer[DIK_LEFT] & 0x80)	//按下 左 键
		{
			//贴图选择
			if (player[0].lastaction == 2)
			{
				player[0].movetime++;
				if (player[0].movetime == 20)
				{
					player[0].movetime = 0;
				}
			}
			else
			{
				player[0].movetime = 0;
				player[0].lastaction = 2;
			}		
			player[0].offsetX = 60 * (player[0].movetime/10+1);

			//位置移动	
			player[0].doMove();
		}
		else if (keybuffer[DIK_RIGHT] & 0x80)	//按下 右 键
		{
			//贴图选择
			if (player[0].lastaction == 3)
			{
				player[0].movetime++;
				if (player[0].movetime == 20)
				{
					player[0].movetime = 0;
				}
			}
			else
			{
				player[0].movetime = 0;
				player[0].lastaction = 3;
			}		
			player[0].offsetX = 60 * (player[0].movetime/10+1);

			//位置移动
			player[0].doMove();
		}
		else
		{
			player[0].movetime = 0;
			player[0].offsetX = 0;
		}
		player[0].offsetY = 60 * player[0].lastaction;

		if (keybuffer[DIK_SPACE] & 0x80)	//按下 空格 键
		{
			i = ((int)player[0].posY+40)/40-1;
			j = ((int)player[0].posX+30)/40-1;

			if (player[0].laytime==0 && player[0].bombcount<player[0].bombsum && map[i][j]>='`')
			{
				player[0].laytime++;
				bomb[bombtotal].index = 0;
				bomb[bombtotal].setStart();
				DSBuf[1]->Play(0,0,0);
				player[0].bombcount ++;
				bombtotal ++;
			}
		}	
	}
	else if (gamestate==VERSUS || gamestate==COORPERATE)
	{
		//1号按键
		if (player[0].alive)
		{
			//方向判断
			if (keybuffer[DIK_S] & 0x80)	//按下 S 键
			{
				//贴图选择
				if (player[0].lastaction == 0)
				{
					player[0].movetime++;
					if (player[0].movetime == 20)
					{
						player[0].movetime = 0;
					}
				}
				else
				{
					player[0].movetime = 0;
					player[0].lastaction = 0;
				}		
				player[0].offsetX = 60 * (player[0].movetime/10+1);

				//位置移动	
				player[0].doMove();
			}
			else if (keybuffer[DIK_W] & 0x80)	//按下 W 键
			{
				//贴图选择
				if (player[0].lastaction == 1)
				{
					player[0].movetime++;
					if (player[0].movetime == 20)
					{
						player[0].movetime = 0;
					}
				}
				else
				{
					player[0].movetime = 0;
					player[0].lastaction = 1;
				}		
				player[0].offsetX = 60 * (player[0].movetime/10+1);

				//位置移动	
				player[0].doMove();
			}
			else if (keybuffer[DIK_A] & 0x80)	//按下 A 键
			{
				//贴图选择
				if (player[0].lastaction == 2)
				{
					player[0].movetime++;
					if (player[0].movetime == 20)
					{
						player[0].movetime = 0;
					}
				}
				else
				{
					player[0].movetime = 0;
					player[0].lastaction = 2;
				}		
				player[0].offsetX = 60 * (player[0].movetime/10+1);

				//位置移动	
				player[0].doMove();
			}
			else if (keybuffer[DIK_D] & 0x80)	//按下 D 键
			{
				//贴图选择
				if (player[0].lastaction == 3)
				{
					player[0].movetime++;
					if (player[0].movetime == 20)
					{
						player[0].movetime = 0;
					}
				}
				else
				{
					player[0].movetime = 0;
					player[0].lastaction = 3;
				}		
				player[0].offsetX = 60 * (player[0].movetime/10+1);

				//位置移动
				player[0].doMove();
			}
			else
			{
				player[0].movetime = 0;
				player[0].offsetX = 0;
			}
			player[0].offsetY = 60 * player[0].lastaction;

			if (keybuffer[DIK_SPACE] & 0x80)	//按下 空格 键
			{
				i = ((int)player[0].posY+40)/40-1;
				j = ((int)player[0].posX+30)/40-1;

				if (player[0].laytime==0 && player[0].bombcount<player[0].bombsum && map[i][j]>='`')
				{
					player[0].laytime++;
					bomb[bombtotal].index = 0;
					bomb[bombtotal].setStart();
					DSBuf[1]->Play(0,0,0);
					player[0].bombcount ++;
					bombtotal ++;
				}
			}	
		}
		//2号按键
		if (player[1].alive)
		{
			//方向判断
			if (keybuffer[DIK_DOWN] & 0x80)	//按下 下 键
			{
				//贴图选择
				if (player[1].lastaction == 0)
				{
					player[1].movetime++;

⌨️ 快捷键说明

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