📄 game.cpp
字号:
#include "game.h"
CGame::CGame(void)
{
m_pDraw = NULL;
m_pSurface = NULL;
m_pSurfacePlayer = NULL;
m_pSurfaceWord = NULL;
m_pInput = NULL;
m_pSound = NULL;
m_pBackgroundMusic = NULL;
for (int i=0;i<SoundEffectNum;i++)
{
m_pSoundEffect[i] = NULL;
}
m_bWindowed = TRUE;
m_bHelp = TRUE;
}
CGame::~CGame(void)
{
delete m_pDraw;
delete m_pSurface;
delete m_pSurfacePlayer;
delete m_pSurfaceWord;
delete m_pInput;
for (int i=0;i<SoundEffectNum;i++)
{
delete m_pSoundEffect[i];
}
delete m_pBackgroundMusic;
delete m_pSound;
}
bool CGame::Create(HWND hWnd, HINSTANCE hInstance)
{
m_hWnd = hWnd;
m_pDraw = new CDraw;
m_pDraw->CreateWindowedDisplay(m_hWnd,800,600);
m_pDraw->CreateSurface(&m_pSurface,800,600);
m_pSurface->DrawBitmap(".\\picture\\pic.bmp",800,600);
m_pSurface->SetColorKey(RGB(255,0,255),RGB(255,0,255));
m_pDraw->CreateSurface(&m_pSurfacePlayer,1040,248);
m_pSurfacePlayer->DrawBitmap(".\\picture\\player.bmp",1040,248);
m_pSurfacePlayer->SetColorKey(RGB(255,0,255),RGB(255,0,255));
m_pDraw->CreateSurface(&m_pSurfaceWord,240,320);
m_pSurfaceWord->DrawBitmap(".\\picture\\word.bmp",240,320);
m_pSurfaceWord->SetColorKey(RGB(255,0,255),RGB(255,0,255));
m_pInput = new CInput;
m_pInput->Create(hWnd,hInstance);
m_pSound = new CSound();
m_pSound->Initialize(hWnd);
m_pSound->InitialiseMP3(&m_pBackgroundMusic);
m_pBackgroundMusic->Load("Pirate.mp3");
char filename[][255]={ "start.wav",
"win.wav",
"deuce.wav",
"lost.wav",
"lay.wav",
"detonation.wav",
"appear.wav",
"get.wav",
"die.wav"};
for (int i=0;i<SoundEffectNum;i++)
{
m_pSound->InitialiseWavMidi(&m_pSoundEffect[i]);
m_pSoundEffect[i]->Load(filename[i]);
}
ResetMapInfor();
return true;
}
HRESULT CGame::Run()
{
if (!(m_pBackgroundMusic->IsPlaying()))
{
m_pBackgroundMusic->Play();
}
if (m_GameCounter == 0 && m_GameState != GAME_FREE && m_GameState != GAME_START )
{
while (m_pSoundEffect[m_GameState]->IsPlaying())
{
// 等待播放结束
}
ResetMapInfor();
}
RECT rect;
int i,j;
// 1.逻辑处理部分
if (m_GameState == GAME_FREE || m_GameState == GAME_START)
{
DoInput(); // 处理按键
DoMove(); // 处理角色移动
DoProperty(); // 处理道具
DoKill();
}
/*
for (i=0;i<PLAYER_NUM;i++)
{
if (m_Player[i].type != TYPE_NULL && m_Player[i].status == STATUS_DELAY)
{
m_Delay[i]--;
if (m_Delay[i] == 0)
{
m_Player[i].status == STATUS_FREE;
}
}
}
*/
for (i=0;i<PLAYER_NUM;i++) // 判断是否被炸
{
if (m_Player[i].type != TYPE_NULL && m_Player[i].status != STATUS_DIED && m_Player[i].status != STATUS_MOVE)
{
if (m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type == 9)
{
m_Player[i].status = STATUS_DIED;
m_Player[i].counter = 600;
}
}
}
// 判断游戏结果
if (m_GameState == GAME_FREE)
{
int computerdie = false;
int userdie = false;
for (i=0;i<PLAYER_NUM;i++)
{
if (m_Player[i].type == TYPE_COMPUTER && m_Player[i].status == STATUS_DIED && m_Player[i].counter < 60)
{
computerdie = true;
}
}
if (m_Player[0].status == STATUS_DIED && m_Player[0].counter < 60)
{
userdie = true;
}
if (computerdie && userdie)
{
m_GameState = GAME_DEUCE;
m_GameCounter = DISPLAYCOUNTER;
}
else if (computerdie && !userdie)
{
m_GameState = GAME_WIN;
m_GameCounter = DISPLAYCOUNTER;
}
else if (!computerdie && userdie)
{
m_GameState = GAME_LOST;
m_GameCounter = DISPLAYCOUNTER;
}
}
// 以下5个函数用于处理电脑玩家的人工智能(每移动一个格子判断一次,因为背景上的信息随时在改变)
for (i=0;i<PLAYER_NUM;i++)
{
if (m_Player[i].type == TYPE_COMPUTER && m_Player[i].status == STATUS_FREE)
{
// 已经在整个格子上了,m_MoveCount[i]在走之前设置,走完一步之后减1
if (!FindSafety(i)) // 查找一个安全的位置,找到后去躲藏
{
// 目前所站位置是安全的
// if (!FindTeammateForRescue(i)) // 查找需要营救的队友的位置
{
if (!FindPropertyForGet(i)) // 查看道具的位置,若找到则去吃
{
if (!FindAdversaryForAttack(i)) // 查找对手的位置,找到后去攻击
{
if (!FindLay(i)) // 查找一个放置炸弹的位置,以便炸出一些道具
{
}
}
}
}
}
//判断是否要放炸弹
if (m_PlayerLay[i])
{
if (m_Player[i].x == m_LayX[i]*40 && m_Player[i].y == m_LayY[i]*40)
{
if ( (m_Player[i].bomb != 0) &&
(m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type!=7))
{
m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type = 7;
m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].counter = 180;
m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].status = m_Player[i].power;
m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].who = i;
m_Player[i].bomb--;
}
m_PlayerLay[i] = false;
}
}
}
}
// 2.显示图形部分
// 清除背景
m_pDraw->Clear(0);
// 框架窗口
m_pDraw->Blt(0,0,m_pSurface);
// 地面
rect.top = 160;
rect.bottom = 200;
for(i=0;i<13;i++)
{
for(j=0;j<15;j++)
{
rect.left = 40+(i+j)%2*40;
rect.right = 80+(i+j)%2*40;
m_pDraw->Blt(j*40+19,i*40+40,m_pSurface,&rect);
}
}
// 显示物体
for(i=0;i<13;i++)
{
for(j=14;j>=0;j--)
{
switch(m_ScreenItem[i][j].type)
{
case 1: // 木块
rect.left = 120;
rect.top = 120;
rect.right = 160;
rect.bottom = 200;
m_pDraw->Blt(j*40+19,i*40,m_pSurface,&rect);
if (j!=0) // 左边阴影
{
rect.left = 480;
rect.top = 348;
rect.right = 480+5;
rect.bottom = 348+39;
m_pDraw->Blt(j*40+19-5,i*40+40+1,m_pSurface,&rect);
}
if (i!=12) // 下边阴影
{
rect.top = 387;
rect.right = 480+44;
rect.bottom = 387+5;
if (j == 0)
{
rect.left = 480+5;
m_pDraw->Blt(j*40+19,i*40+40+40,m_pSurface,&rect);
}
else
{
rect.left = 480;
m_pDraw->Blt(j*40+19-5,i*40+40+40,m_pSurface,&rect);
}
}
break;
case 2: // 箱子
// 判断箱子是否在运动,若是修改其坐标偏移量
if (m_ScreenItem[i][j].counter != 0)
{
m_ScreenItem[i][j].counter--;
switch(m_ScreenItem[i][j].way)
{
case WAY_UP:
m_ScreenItem[i][j].yoffset = -40+m_ScreenItem[i][j].counter;
if (m_ScreenItem[i][j].counter == 0)
{
m_ScreenItem[i-1][j].type = m_ScreenItem[i][j].type;
m_ScreenItem[i-1][j].status = m_ScreenItem[i][j].status;
m_ScreenItem[i-1][j].counter = m_ScreenItem[i][j].counter;
m_ScreenItem[i][j].type = 0;
}
break;
case WAY_DOWN:
m_ScreenItem[i][j].yoffset = 40-m_ScreenItem[i][j].counter;
if (m_ScreenItem[i][j].counter == 0)
{
m_ScreenItem[i+1][j].type = m_ScreenItem[i][j].type;
m_ScreenItem[i+1][j].status = m_ScreenItem[i][j].status;
m_ScreenItem[i+1][j].counter = m_ScreenItem[i][j].counter;
m_ScreenItem[i][j].type = 0;
}
break;
case WAY_LEFT:
m_ScreenItem[i][j].xoffset = -40+m_ScreenItem[i][j].counter;
if (m_ScreenItem[i][j].counter == 0)
{
m_ScreenItem[i][j-1].type = m_ScreenItem[i][j].type;
m_ScreenItem[i][j-1].status = m_ScreenItem[i][j].status;
m_ScreenItem[i][j-1].counter = m_ScreenItem[i][j].counter;
m_ScreenItem[i][j].type = 0;
}
break;
case WAY_RIGHT:
m_ScreenItem[i][j].xoffset = 40-m_ScreenItem[i][j].counter;
if (m_ScreenItem[i][j].counter == 0)
{
m_ScreenItem[i][j+1].type = m_ScreenItem[i][j].type;
m_ScreenItem[i][j+1].status = m_ScreenItem[i][j].status;
m_ScreenItem[i][j+1].counter = m_ScreenItem[i][j].counter;
m_ScreenItem[i][j].type = 0;
}
break;
default:
break;
}
}
rect.left = 160;
rect.top = 120;
rect.right = 200;
rect.bottom = 200;
m_pDraw->Blt(j*40+19+m_ScreenItem[i][j].xoffset,i*40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
if (j!=0) // 左边阴影
{
rect.left = 480;
rect.top = 348;
rect.right = 480+5;
rect.bottom = 348+39;
m_pDraw->Blt(j*40+19-5+m_ScreenItem[i][j].xoffset,i*40+40+1+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
}
if (i!=12) // 下边阴影
{
rect.top = 387;
rect.right = 480+44;
rect.bottom = 387+5;
if (j == 0)
{
rect.left = 480+5;
m_pDraw->Blt(j*40+19+m_ScreenItem[i][j].xoffset,i*40+40+40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
}
else
{
rect.left = 480;
m_pDraw->Blt(j*40+19-5+m_ScreenItem[i][j].xoffset,i*40+40+40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
}
}
break;
case 3: // 木桩
rect.left = 200;
rect.top = 120;
rect.right = 240;
rect.bottom = 200;
m_pDraw->Blt(j*40+19,i*40,m_pSurface,&rect);
break;
case 4: // 海盗旗
if (m_ScreenItem[i][j].status == 0)
{
rect.left = 240;
rect.top = 40;
rect.right = 440;
rect.bottom = 240;
m_pDraw->Blt(5*40+19,2*40+40,m_pSurface,&rect);
}
break;
case 7: // 泡泡(静止的,相对于移动的而言)
rect.left = 480+m_ScreenItem[i][j].counter/30%3*44;
rect.top = 304;
rect.right = 480+44+m_ScreenItem[i][j].counter/30%3*44;
rect.bottom = 304+44;
m_pDraw->Blt(j*40+19-2,i*40+40-4,m_pSurface,&rect);
m_ScreenItem[i][j].counter--;
if (m_ScreenItem[i][j].counter == 0) // 泡泡爆炸
{
SetBlast(i,j);
m_pSoundEffect[DETONATION]->Play(); // 播放爆炸音效
}
break;
case 8: // 道具
if (m_ScreenItem[i][j].counter % 10 == 0)
{
if (m_ScreenItem[i][j].status == 0) // 加
{
m_ScreenItem[i][j].yoffset++;
if (m_ScreenItem[i][j].yoffset == 3)
{
m_ScreenItem[i][j].status = -1;
}
}
else // 减
{
m_ScreenItem[i][j].yoffset--;
if (m_ScreenItem[i][j].yoffset == -3)
{
m_ScreenItem[i][j].status = 0;
}
}
}
rect.left = 120;
rect.top = 40;
rect.right = 120+20;
rect.bottom = 40+20;
if (m_ScreenItem[i][j].yoffset>0)
{
rect.left = 120+20;
rect.right = 120+20+20;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -