📄 maingame.cpp
字号:
// MainGame.cpp: implementation of the CMainGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MainGame.h"
#include <stdlib.h>
int produceNum;
int palyer1bulletType=4,palyer2bulletType=0;
int palyer1bulletSpeed=5,palyer2bulletSpeed=5;
int score1=0,score2=0;
int staticspeed1=1,staticspeed2=1;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMainGame::CMainGame()
{
aObject = new CContainerObject;
theMap = NULL;
playerTank1 = NULL;
playerTank2 = NULL;
enemyTank = NULL;
GameProcess = 0;//游戏状态
level = 0; //第几关
choose = false; //有没选好
status = 0; //选择几人游戏
gameover=1;
}
CMainGame::~CMainGame()
{
aObject->ReleaseAll();
delete aObject;
}
///////////////////////////////////////////
//
// 进入游戏前的画面
///////////////////////////////////////////
void CMainGame::ShowLoadingBitmap()
{
static int i=1;
if(i)
{
sndPlaySound("sound//loading.wav",SND_ASYNC|SND_NODEFAULT);
i=0;
}
CRect rt1(0,0,640,480);
CRect rt2(0,0,640,480);
BltBitMap(lpFrontBuffer,rt1,lpBKGObject[0],rt2);
}
///////////////////////////////////////////
//
// 游戏初始化
///////////////////////////////////////////
void CMainGame::InitGameLevel()
{
////////////////////////地图对象
if(level==21)level=0;
theMap = new CGameMap(level++);
///////////////////////我方坦克
if(player1>0)
{
playerTank1=new CPlayerTank(32*8,32*14,0,4);
playerTank1->type=palyer1bulletType;
playerTank1->bulletSpeed=palyer1bulletSpeed;
}
if(player2>0)
{
playerTank2=new CPlayerTank(32*11,32*14,0,0);
playerTank2->type=palyer2bulletType;
playerTank2->bulletSpeed=palyer2bulletSpeed;
}
/////////////////////////敌人
for(int i=0;i<4;i++)enemyTank=new CEnemyTank();
Enemy=4;
if(status==0)
produceNum=5;
else
if(status==1)
produceNum=18;
showLevelMap();
}
void CMainGame::showLevelMap()
{
static int i=0;
CRect rt1(0,0,640,480);
CRect rt2(0,0,640,480);
BltBitMap(lpFrontBuffer,rt1,lpBKGObject[19],rt2);
///=============================
char ch[20];
CString str("Stage ");
str+=ltoa(level,ch,10);
CString life1("Life: ");
life1+=ltoa(player1,ch,10);
CString scorep1("Score: ");
scorep1+=ltoa(score1,ch,10);
CString life2("Life: ");
CString scorep2("Score: ");
if(player2)
{
life2+=ltoa(player2,ch,10);
scorep2+=ltoa(score2,ch,10);
}
else
{
life2+="Game Over";
}
DDSURFACEDESC ddsd; //页面描述
HDC hdc; //设备环境句柄
char szMsg1[] = "Hello World, I am DirectDraw boy !";
lpDD->CreateSurface( &ddsd, &lpFrontBuffer, NULL );
//输出文字
lpFrontBuffer->GetDC(&hdc);
SetBkColor( hdc, RGB( 4, 4, 4 ) );
SetTextColor( hdc, RGB( 150, 150, 0) );
TextOut( hdc, 280, 50, str, lstrlen(str));
SetTextColor( hdc, RGB( 0, 180, 180) );
TextOut( hdc, 130, 160, life1, lstrlen(life1));
TextOut( hdc, 130, 180, scorep1, lstrlen(scorep1));
TextOut( hdc, 400, 160, life2, lstrlen(life2));
TextOut( hdc, 400, 180, scorep2, lstrlen(scorep2));
TextOut( hdc, 300, 400, "Loading.....", 12);
lpFrontBuffer->ReleaseDC(hdc);
///=============================
if(i==1)
{
sndPlaySound("sound//count.wav",SND_ASYNC|SND_NODEFAULT);
}
i=1;
Sleep(4000);
}
///////////////////////////////////////////
//
// 处动产生敌人
///////////////////////////////////////////
void CMainGame::produceEnemy()
{
static CTime time = CTime::GetCurrentTime();
CTime currentTime=CTime::GetCurrentTime();;
if((currentTime-time)>4)
{
if(produceNum>0)
{
enemyTank=new CEnemyTank();
produceNum--;
Enemy++;
}
time=currentTime;
staticspeed1=1;
staticspeed2=1;
}
}
///////////////////////////////////////////
//
// 画右下角和左下角的玩家坦克个数
///////////////////////////////////////////
void CMainGame::DrawPlayerNum()
{
int i;
DDSetColorKey(lpBKGObject[17],RGB(4,4,4));
for(i=0;i<player1-1;i++)
{
lpBackBuffer->Blt(
CRect(15*i+3,32*14+15,15*(i+1)+3,32*14+15+15),//dest rect 22*22
lpBKGObject[17],//src surface
CRect(24,0,24*2,24),//src rect
DDBLT_WAIT|DDBLT_KEYSRC,
NULL);
}
for(i=0;i<player2-1;i++)
{
lpBackBuffer->Blt(
CRect(640-15*(i+1),32*14+15,640-15*i,32*14+15+15),//dest rect 22*22
lpBKGObject[17],//src surface
CRect(0,0,24,24),//src rect
DDBLT_WAIT|DDBLT_KEYSRC,
NULL);
}
}
///////////////////////////////////////////
//
// 主循环:处理游戏各阶段
///////////////////////////////////////////
void CMainGame::GameFight()
{
static int wait=0;
FlipScreen();
switch(GameProcess)
{
case 0: ShowLoadingBitmap(); break;
case 1:
{
if(!choose)
{
ChooseItem();
score1=0;
score2=0;
return;
}
else
{
if(status==0)
{
player1=3;
player2=0;
}
else
if(status==1)
{
player1=3;
player2=3;
}
else
{
CRect rt1(0,0,640,480);
CRect rt2(0,0,640,480);
BltBitMap(lpFrontBuffer,rt1,lpBKGObject[18],rt2);
return;
}
InitGameLevel();
GameProcess++;
}
}break;
case 2:
{
if(score1>=10000)
{
player1++;
score1-=10000;
sndPlaySound("sound//Fanfare.wav",SND_ASYNC|SND_NODEFAULT);
}
if(score2>=10000)
{
player2++;
score2-=10000;
sndPlaySound("sound//Fanfare.wav",SND_ASYNC|SND_NODEFAULT);
}
aObject->ActiveAll();
produceEnemy();
DrawPlayerNum();
if(player1<=0 && player2<=0)
{
if(wait>280)
{
LossGame();
PostMessage(WM_CLOSE);
}
else wait++;
}
else
if(Enemy<=0 && produceNum<=0)
{
if(player1>0)
{
palyer1bulletType=playerTank1->type;
palyer1bulletSpeed=playerTank1->bulletSpeed;
}
if(player2>0)
{
palyer2bulletType=playerTank2->type;
palyer2bulletSpeed=playerTank2->bulletSpeed;
}
if(wait>350)
{
wait=0;
aObject->ReleaseAll();
InitGameLevel();
return;
}
else wait++;
}
theMap->DrawGrass();
break;
}
case 3:
{
// VictoryGame();
break;
}
case 4:
{
// LossGame();
break;
}
}
}
///////////////////////////////////////////
//
// Game Over
///////////////////////////////////////////
void CMainGame::LossGame()
{
CRect rt1(0,0,640,480);
CRect rt2(0,0,640,480);
BltBitMap(lpFrontBuffer,rt1,lpBKGObject[6],rt2);
Sleep(4000);
PostMessage(WM_CLOSE);
}
///////////////////////////////////////////
//
// 选择几人游戏
///////////////////////////////////////////
void CMainGame::ChooseItem()
{
CRect rt1(0,0,640,480);
CRect rt2(0,0,640,480);
BltBitMap(lpBackBuffer,rt1,lpBKGObject[1],rt2);
if(status==0)
{
DDSetColorKey(lpBKGObject[2],RGB(4,4,4));
lpBackBuffer->Blt(
CRect(250,295,272,317),//dest rect 22*22
lpBKGObject[2],//src surface
CRect(0,32,32,64),//src rect
DDBLT_WAIT|DDBLT_KEYSRC,
NULL);
}
else
if(status==1)
{
DDSetColorKey(lpBKGObject[2],RGB(4,4,4));
lpBackBuffer->Blt(
CRect(250,320,272,342),//dest rect 22*22
lpBKGObject[2],//src surface
CRect(0,32,32,64),//src rect
DDBLT_WAIT|DDBLT_KEYSRC,
NULL);
}
else
{
DDSetColorKey(lpBKGObject[2],RGB(4,4,4));
lpBackBuffer->Blt(
CRect(250,355,272,377),//dest rect 22*22
lpBKGObject[2],//src surface
CRect(0,32,32,64),//src rect
DDBLT_WAIT|DDBLT_KEYSRC,
NULL);
}
}
////////////////////////////////////////////////
//
// 处理各种按键信息.CDirectXWnd message handlers
//
///////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMainGame,CWnd)
//{{AFX_MSG_MAP(CDirectWnd,Cwnd)
ON_WM_KEYDOWN()
ON_WM_KEYUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////
void CMainGame::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
{
///////////////////////////////
if(nChar==VK_ESCAPE)
{
if(GameProcess==0)
{
GameProcess++;
goto over;
}
if(GameProcess==1)
{
if(status==2)
{
status=0;
choose=false;
goto over;
}
else PostMessage(WM_CLOSE);
}
else
{
if(GameProcess==2)
{
GameProcess--;
choose=false; //重新选择
status = 0;
level = 0;
aObject->ReleaseAll();
theMap = NULL;
playerTank1 = NULL;
playerTank2 = NULL;
goto over;
}
}
}
///////////////////////////////
if(GameProcess==0)goto over;
if(!choose)
{
switch(nChar)
{
case VK_UP:
if(status!=0)
{
sndPlaySound("sound//menu.wav",SND_ASYNC|SND_NODEFAULT);
status--;
goto over;
}break;
case VK_DOWN:
if(status!=2)
{
sndPlaySound("sound//menu.wav",SND_ASYNC|SND_NODEFAULT);
status++;
goto over;
}break;
case '\r':
{
sndPlaySound("sound//upselect.wav",SND_ASYNC|SND_NODEFAULT);
choose=true;
goto over;
}break;
}//switch
goto over;
}//if
//////////////////////////////////////
if(playerTank1 && playerTank1->appearance>75 && gameover)
{
int n;
switch(nChar)
{
case 119:
case 87: n=1;break;
case 100:
case 68: n=2;break;
case 115:
case 83: n=3;break;
case 97:
case 65: n=4;break;
case 74:
case 106: n=5;break;
}
playerTank1->KeyPress(n);
}
if(playerTank2 && playerTank2->appearance>75 && gameover)
{
int n;
switch(nChar)
{
case VK_UP: n=1;break;
case VK_RIGHT: n=2;break;
case VK_DOWN: n=3;break;
case VK_LEFT: n=4;break;
case 96: n=5;break;
}
playerTank2->KeyPress(n);
}
over:
CWnd::OnKeyDown(nChar,nRepCnt,nFlags);
}
void CMainGame::OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags)
{
if(playerTank1 && playerTank1->appearance>75 && gameover)
{
int n;
switch(nChar)
{
case 119:
case 87: n=1;break;
case 100:
case 68: n=2;break;
case 115:
case 83: n=3;break;
case 97:
case 65: n=4;break;
}
playerTank1->KeyRelease(n);
}
if(playerTank2 && playerTank2->appearance>75 && gameover)
{
int n;
switch(nChar)
{
case VK_UP: n=1;break;
case VK_RIGHT: n=2;break;
case VK_DOWN: n=3;break;
case VK_LEFT: n=4;break;
}
playerTank2->KeyRelease(n);
}
CWnd::OnKeyUp(nChar,nRepCnt,nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -