?? bmframe.cpp
字號:
// 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 + -