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

📄 game.cpp

📁 在vc 6.0环境下的一个坦克小游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		if(!m_bSinglePlayer && m_tankright==NULL && !m_bRightBring && m_nRightPlayer>0)
		{
				CExplode *p=new CExplode;
				if(p)
				{
					p->Init(23*TANKMAPCELL,38*TANKMAPCELL,5,8,m_pTankAppBuffer,32,32,1,2);
					m_Explode.AddTail(p);
					m_bRightBring=true;
				}
		}
		if(!m_tankleft && !m_tankright && m_nLeftPlayer==0 && m_nRightPlayer==0 && !m_bLeftBring && !m_bRightBring)
			m_nGameState=GAMEOVER;
	}
}

void CGame::PlaySound(int sort)
{
	switch(sort)
	{
	case 0:
		m_wavBang.Play();
		break;
	case 1:
		m_wavDie.Play();
		break;
	case 2:
		m_wavShoot.Play();
	case 3:
		m_wavEgg.Play();
	}
}

void CGame::UpdateScreen()
{
	switch(m_nGameState)
	{
	case GAMEBEGIN:
		DrawBegin();
		break;
	case GAMEMENU:
		DrawSelectMenu();
		break;
	case GAMEACTIVE:
		DrawWorldMap();
		break;
	case GAMEWIN:
		DrawWin();
		break;
	case GAMEPAUSE:
		DrawPause();
		break;
	case GAMEOVER:
		DrawGameOver();
		break;
	}
}


BOOL CGame::Init(HWND hWnd)
{
	if(!DDinit(hWnd))
		return FALSE;
	if(!GameInit())
		return FALSE;
	return TRUE;	
}

void CGame::DestroyObject()
{
	POSITION  position;
	position=m_Explode.GetHeadPosition();
	while(position)
	{
	   CExplode *p=m_Explode.GetNext(position);
	   delete p;
	}
	m_Explode.RemoveAll();

	position=m_BulletList.GetHeadPosition();
	while(position)
	{
	   CBullet *p=m_BulletList.GetNext(position);
	   delete p;
	}
	m_BulletList.RemoveAll();

	position=m_Player.GetHeadPosition();
	while(position)
	{
		CTank *p=m_Player.GetNext(position);
		delete p;
	}
	m_Player.RemoveAll();
	m_tankleft=m_tankright=NULL;

	position=m_Enemy.GetHeadPosition();
	while(position)
	{
		CTank *p=m_Enemy.GetNext(position);
		delete p;
	}
	m_Enemy.RemoveAll();

	position=m_Egg.GetHeadPosition();
	while(position)
	{
		CEgg *p=m_Egg.GetNext(position);
		delete p;
	}
	m_Egg.RemoveAll();
	m_midiBKMusic.Stop();

}

BOOL CGame::StartGame(int level)
{
	if(level > GAMETOTALLEVEL)return FALSE;
	m_nGameLevel=level;
	m_nBorderTime=0;
	m_nFreezeTime=0;
	m_bFreeze=FALSE;

	if(m_bSinglePlayer)
		m_nEnemyCount=10;
	else
		m_nEnemyCount=20;
	m_nEnemyCount+=(level-1)*3;
	m_nLeftEnemy=m_nEnemyCount;
	
	m_bLeftBring=false;			//左边正在产生坦克
	m_bRightBring=false;

	m_nLeftKills=0;
	m_nRightKills=0;
//销毁除player以外的东西
	DestroyObjectForNewLevel();
//保存player的属性,但要调整坦克位置
   	if(m_tankleft!=NULL && m_nLeftPlayer>=0)
	{
			m_tankleft->SetTankPos(15,38);
            m_tankleft->SetDirection(UP);
			m_tankleft->SetTankLife(200);
			m_tankleft->SetRect();
	}
	if(!m_bSinglePlayer && m_tankright!=NULL && m_nRightPlayer>=0)
	{
			m_tankright->SetTankPos(23,38);
            m_tankright->SetDirection(UP);
			m_tankright->SetTankLife(200);
			m_tankright->SetRect();
	}       
	m_nGameState=GAMEACTIVE;
	m_midiBKMusic.Play(TRUE);
	m_midiBKMusic.SetVolume(3);
	return TRUE;
}

void CGame::BringTank(int pos)
{
	if(m_nLeftEnemy <= 0)return;
	CTank * pTank;
	int x,y;
	CRect rct;
	switch(pos)
	{
	case 1://在左边产生一辆坦克
		x=-2;y=0;
		do{
			x+=2;
			rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
		}while(TankInRect(rct) && x<10);
		if(x==10)break;
		pTank=new CTank;
		if(pTank)
		{
			pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
			pTank->SetDirection(DOWN);
			m_Enemy.AddTail(pTank);
			m_nLeftEnemy--;
		}
		break;
	case 2://在中间产生一辆坦克
		x=17;y=0;
		do{
			x+=2;
			rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
		}while(TankInRect(rct) && x<28);
		if(x==28)break;
		pTank=new CTank;
		if(pTank)
		{
			pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
			pTank->SetDirection(DOWN);
			m_Enemy.AddTail(pTank);
			m_nLeftEnemy--;
		}
		break;
	case 3://在右边产生一辆坦克
		x=40;y=0;
		do{
			x-=2;
			rct.SetRect(x*TANKMAPCELL,y*TANKMAPCELL,x*TANKMAPCELL+TANKWIDTH,y*TANKMAPCELL+TANKHEIGHT);
		}while(TankInRect(rct) && x>20);
		if(x==20)break;
		pTank=new CTank;
		if(pTank)
		{
			pTank->Init(this,x,y,m_pEnemyBuffer,m_pTankStateBuffer,rand()%9);
			pTank->SetDirection(DOWN);
			m_Enemy.AddTail(pTank);
			m_nLeftEnemy--;
		}
		break;
	}
}

BOOL CGame::TankInRect(CRect &rc)
{
	CTank *p;
	CRect rect;
	POSITION position=m_Player.GetHeadPosition();
	while(position)
	{
		p=m_Player.GetNext(position);
		BOOL ret=rect.IntersectRect(&rc,&(p->rect));
		if(ret)
			return TRUE;
	}
	position=m_Enemy.GetHeadPosition();
	while(position)
	{
		p=m_Enemy.GetNext(position);
		BOOL ret=rect.IntersectRect(&rc,&(p->rect));
		if(ret)
			return TRUE;
	}
	return FALSE;
}

void CGame::DestroyObjectForNewLevel()
{
	POSITION  position;
	position=m_Explode.GetHeadPosition();
	while(position)
	{
	   CExplode *p=m_Explode.GetNext(position);
	   delete p;
	}
	m_Explode.RemoveAll();

	position=m_BulletList.GetHeadPosition();
	while(position)
	{
	   CBullet *p=m_BulletList.GetNext(position);
	   delete p;
	}
	m_BulletList.RemoveAll();

	position=m_Enemy.GetHeadPosition();
	while(position)
	{
		CTank *p=m_Enemy.GetNext(position);
		delete p;
	}
	m_Enemy.RemoveAll();

	position=m_Egg.GetHeadPosition();
	while(position)
	{
		CEgg *p=m_Egg.GetNext(position);
		delete p;
	}
	m_Egg.RemoveAll();
	m_midiBKMusic.Stop();
}

void CGame::DrawBegin()
{
	static int xx=75;
	static float yy=390;
	static CString str[4];
	str[0].LoadString(IDS_STRING001);
	str[1].LoadString(IDS_STRING002);
	str[2].LoadString(IDS_STRING003);
	str[3].LoadString(IDS_STRING004);
	RECT rc;
	rc.left=0;
	rc.right=SCREEN_WIDTH;
	rc.top=0;
	rc.bottom=SCREEN_HEIGHT;	
	DDClear(&rc,RGB(0,0,0));
	rc.right=300;
	rc.bottom=194;	
	m_pddsBackBuffer->BltFast(150,200, m_pBeginBuffer, &rc, DDBLTFAST_WAIT );

	CFont font;
	font.CreateFont(20,10, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");

	for(int i=0;i<4;i++)
	{
		yy-=0.07;
		if(int(yy)<100)
		{
			yy=390;
			m_nGameState=GAMENEXT;
			if(m_pBeginBuffer)
			{
				m_pBeginBuffer->Release();
				m_pBeginBuffer=NULL;
			}
		}
		OutputText(xx,int(yy)+i*25,str[i],RGB(255,0,0),&font);
	}
	font.DeleteObject();
	rc.left=0;
	rc.right=SCREEN_WIDTH;
	rc.top=0;
	rc.bottom=200;	
	DDClear(&rc,RGB(0,0,0));
	rc.left=0;
	rc.right=SCREEN_WIDTH;
	rc.top=394;
	rc.bottom=SCREEN_HEIGHT;	
	DDClear(&rc,RGB(0,0,0));


	LPDIRECTDRAWSURFACE tempbuffer=NULL;
	tempbuffer=DDLoadBitmap("pic\\bmp\\select.bmp");

	rc.left=0;
	rc.right=rc.left+106;
	rc.top=0;
	rc.bottom=rc.top+48;
	if(tempbuffer)
		m_pddsBackBuffer->BltFast(120,500, tempbuffer, &rc, DDBLTFAST_WAIT );

	rc.left=0;
	rc.right=rc.left+106;
	rc.top=48;
	rc.bottom=rc.top+48;
	if(tempbuffer)
		m_pddsBackBuffer->BltFast(400,500, tempbuffer, &rc, DDBLTFAST_WAIT );
	if(tempbuffer)
	{
		tempbuffer->Release();
		tempbuffer=NULL;
	}	
	rc.left=96;
	rc.top=0;
	rc.right=128;
	rc.bottom=32;
	if(m_bSinglePlayer)
		m_pddsBackBuffer->BltFast( 80, 510, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	else
		m_pddsBackBuffer->BltFast( 360, 510, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
    FlipScreen();
}

void CGame::DrawLevel(int level)
{
		if(level>GAMETOTALLEVEL)return;
		RECT rc;
		rc.left=0;
		rc.right=SCREEN_WIDTH;
		rc.top=0;
		rc.bottom=SCREEN_HEIGHT;	
		DDClear(&rc,RGB(0,0,0));
		m_pLevelBuffer=DDLoadBitmap("pic\\bmp\\level.bmp");
		if(!m_pLevelBuffer){AfxMessageBox("载入游戏关图失败");return;}
		DDSetColorKey(m_pLevelBuffer, RGB(0,0,255) );
		if(m_pLevelBuffer)
		{
			rc.left=0;
			rc.top=(level-1)*100;
			rc.right=rc.left+640;
			rc.bottom=rc.top+100;
			m_pddsBackBuffer->BltFast(0,250, m_pLevelBuffer, &rc, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY );
			FlipScreen();
			m_pLevelBuffer->Release();
			m_pLevelBuffer=NULL;
		}
}

void CGame::DrawWin()
{
	CFont font;
	font.CreateFont(30,12, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");

	CString strTemp("你已经经过敌人的重重炮火,到达了胜利的彼岸!");
	OutputText(80,200,strTemp,RGB(255,0,255),&font);
	font.DeleteObject();

	font.CreateFont(50,30, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
	strTemp="祝:";
	OutputText(300,250,strTemp,RGB(255,0,255),&font);
	font.DeleteObject();

	font.CreateFont(40,30, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");
	strTemp="新年快乐, 万事如意!";
    OutputText(80,350,strTemp,RGB(255,0,255),&font);
	font.DeleteObject();
	FlipScreen();
	
}

void CGame::DrawPause()
{
	CFont font;
	font.CreateFont(20,10, 0, 0, FW_BOLD , 0, 0, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_ROMAN, "楷体");

	CString strTemp("暂 停");
	OutputText(590,10,strTemp,RGB(255,255,0),&font);
	FlipScreen();
	font.DeleteObject();
}

BOOL CGame::DrawSelectMenu()
{

	
	CRect rc;
	rc.left=0;
	rc.right=rc.left+351;
	rc.top=0;
	rc.bottom=rc.top+240;
	if(m_pMenuBuffer)
		m_pddsBackBuffer->BltFast(150,200, m_pMenuBuffer, &rc, DDBLTFAST_WAIT |DDBLTFAST_SRCCOLORKEY);
	rc.left=96;
	rc.top=0;
	rc.right=128;
	rc.bottom=32;
	m_pddsBackBuffer->BltFast( 155, 212+(m_nMenuPos-1)*60, m_pPlayerBuffer, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	FlipScreen();
   return FALSE;
}

⌨️ 快捷键说明

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