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

📄 maingame.cpp

📁 坦克游戏
💻 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 + -