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

📄 basetank.cpp

📁 坦克游戏
💻 CPP
字号:
// BaseTank.cpp: implementation of the CBaseTank class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BaseTank.h"
#include "MainGame.h"
#include "Bullet.h"
#include "Missile.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBaseTank::CBaseTank(CBaseTank *aTank):CContainerObject(aTank)
{

}

CBaseTank::~CBaseTank()
{

}


void CBaseTank::displayObject()
{
//////////////////////////////////////////////////////////
//  算出此种坦克在图中的位置mapX: 0 -- 3, mapY: 0 -- 15
//////////////////////////////////////////////////////////
	int mapX,mapY;	
	mapX=2*(type%4);
	mapY=direction+(type/4)*4;
///////////////////////刚出世的小星星
	if(appearance<80)
	{
		CMainGame *pWnd=(CMainGame*)AfxGetMainWnd();
		CRect rt1(positionX,positionY,positionX+32,positionY+32);
		CRect rt2(32*(appearance/20),0,32*(appearance/20+1),32);
		pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[5],rt2);
		appearance++;
		return;
	}
///////////////////坦克28*28  方格32*32
	CMainGame *pWnd=(CMainGame*)AfxGetMainWnd();
	if(boolFlip)
	{
	CRect rt1(positionX+2,positionY+2,positionX+2+width,positionY+2+height);
	CRect rt2(32*mapX,32*mapY,32*(mapX+1),32*(mapY+1));
	pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[2],rt2);
	if(movement)boolFlip=0;
	}
	else	
	{
	CRect rt1(positionX+2,positionY+2,positionX+2+width,positionY+2+height);
	CRect rt2(32*(mapX+1),32*mapY,32*(mapX+2),32*(mapY+1));
	pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[2],rt2);
	if(movement)boolFlip=1;
	}
}


bool CBaseTank::ActiveObject()//move
{
//检查坦克是否可移动,必须在iPos等于0时.
	if(iPos==0)
	{
		if(ChargeMove()==false)goto GoGoGo;
		else
			if(movement)iPos++;
	}

///////////////////////////////////////
	if(iPos<17&&iPos>0)
	{
	int i;
	switch(direction)
	{
	case 0:	for(i=0;i<speed;i++)
			{
				positionY--;
				if(++iPos==17)
				{
					iPos=0;
					break;
				}
			}break;
	case 1:	for(i=0;i<speed;i++)
			{
				positionX++;
				if(++iPos==17)
				{
					iPos=0;
					break;
				}
			}break;	
	case 2:	for(i=0;i<speed;i++)
			{
				positionY++;
				if(++iPos==17)
				{
					iPos=0;
					break;
				}
			}break;	
	case 3:	for(i=0;i<speed;i++)
			{
				positionX--;
				if(++iPos==17)
				{
					iPos=0;
					break;
				}
			}break;	
	}
	}

//分不出是CPlayerTank的还是CBaseTank的displayObject.	
GoGoGo:
	CBaseTank::displayObject();
	return true;
}



bool CBaseTank::ChargeMove()
{
///////////////////////////////////////////矩形边界:
	if(positionX==0&&direction==3)
	{
		return false;
	}
	if(positionY==0&&direction==0)
	{
		return false;
	}
	if(positionX==640-32&&direction==1)
	{
		return false;
	}
	if(positionY==480-32&&direction==2)
	{
		return false;
	}
///////////////////////////////////////////物体
	int across=positionY/8;	//横坐标
	int column=positionX/8;	//纵坐标
	CMainGame *pMainGame=(CMainGame*)AfxGetMainWnd();
	switch(direction)
	{
	int i;
	case 0:
		for(i=0;i<4;i++)
		{
		if(pMainGame->theMap->GameMap[across-1][column+i]==3	//砖
			||pMainGame->theMap->GameMap[across-2][column+i]==3	
			||pMainGame->theMap->GameMap[across-1][column+i]==1	//石
			||pMainGame->theMap->GameMap[across-2][column+i]==1
			||pMainGame->theMap->GameMap[across-1][column+i]==4	//泽	
			||pMainGame->theMap->GameMap[across-1][column+i]==5
			||pMainGame->theMap->GameMap[across-2][column+i]==5)//将
			{
			return false;
			}
		}
		break;
	case 1:
		for(i=0;i<4;i++)
		{
		if(pMainGame->theMap->GameMap[across+i][column+4]==3
			||pMainGame->theMap->GameMap[across+i][column+5]==3
			||pMainGame->theMap->GameMap[across+i][column+4]==1
			||pMainGame->theMap->GameMap[across+i][column+5]==1
			||pMainGame->theMap->GameMap[across+i][column+4]==4
			||pMainGame->theMap->GameMap[across+i][column+4]==5
			||pMainGame->theMap->GameMap[across+i][column+5]==5)
			{
			return false;
			}
		}
		break;
	case 2:
		for(i=0;i<4;i++)
		{
		if(pMainGame->theMap->GameMap[across+4][column+i]==3
			||pMainGame->theMap->GameMap[across+5][column+i]==3
			||pMainGame->theMap->GameMap[across+4][column+i]==1
			||pMainGame->theMap->GameMap[across+4][column+i]==4
			||pMainGame->theMap->GameMap[across+4][column+i]==5
			||pMainGame->theMap->GameMap[across+5][column+i]==5)
			{
			return false;
			}
		}
		break;
	case 3: 
		for(i=0;i<4;i++)
		{
		if(pMainGame->theMap->GameMap[across+i][column-1]==3
			||pMainGame->theMap->GameMap[across+i][column-2]==3
			||pMainGame->theMap->GameMap[across+i][column-1]==1
			||pMainGame->theMap->GameMap[across+i][column-1]==4
			||pMainGame->theMap->GameMap[across+i][column-1]==5
			||pMainGame->theMap->GameMap[across+i][column-2]==5)
			{
			return false;
			}
		}
		break;
	}//switch
	return true;//可以移动
}

void CBaseTank::Tankfire(int n)
{
	if(!GetBulletNum(this) && bulletNum==0)
	{
		bulletNum+=2;
	}

	if(bulletNum)
	{
		switch(n)		//子弹
		{
		case 1:
		{
		if(type<=7)
			sndPlaySound("sound//gunfire.wav",SND_ASYNC|SND_NODEFAULT);
			CBullet *pBullet=new 
				CBullet(positionX,positionY,type,power,bulletSpeed,direction);
			pBullet->displayObject();
		}break;
		case 2:
		{
			sndPlaySound("sound//missile.wav",SND_ASYNC|SND_NODEFAULT);
			CMissile *pBullet=new 
				CMissile(positionX,positionY,type,power,3,direction);
			pBullet->displayObject();
		}break;
		}//switch
		bulletNum--;
	}//if
}

⌨️ 快捷键说明

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