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

📄 tankmap.cpp

📁 在vc 6.0环境下的一个坦克小游戏
💻 CPP
字号:
// TankMap.cpp: implementation of the CTankMap class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "tank.h"
#include "TankMap.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CTankMap::CTankMap()
{
	m_bmpSoil=NULL;
	m_bmpStone=NULL;
	m_bmpSteel=NULL;
	m_bmpWater=NULL;
	m_bmpIce=NULL;
	m_bmpTree=NULL;
	m_bLockState=false;
	memset(m_nGrid,0,sizeof(CellType)*TANKMAPWIDTH*TANKMAPHEIGHT);
}

CTankMap::~CTankMap()
{
//	DestroyBmp();
}

bool CTankMap::LoadMapFromFile(LPCTSTR fn)
{
	CStdioFile file;
	if(!file.Open( fn, CFile::modeRead | CFile::typeText ) )
		return false;
	CString str;
	int i=0,j=0;
	while(file.ReadString(str)||i<TANKMAPWIDTH)
	{
         if(str.GetLength()!=0)
		 {
			m_nGrid[i][j].cell=(Cell)atoi(str.GetBuffer(str.GetLength()));
			switch(m_nGrid[i][j].cell)
			{
				case CT_SOIL:
                     m_nGrid[i][j].defence=100;
					 break;
				case CT_STONE:
					 m_nGrid[i][j].defence=150;
					 break;
				case CT_STEEL:
					 m_nGrid[i][j].defence=10000;
					 break;
				case CT_GENERAL:
					 m_nGrid[i][j].defence=50;
					 break;
			}
			m_nGrid[i][j].mask=0;
			str.ReleaseBuffer();
		 }
		j++;
		if(j==TANKMAPHEIGHT)
		{
			j=0;
			i++;
			if(i==TANKMAPWIDTH)
			{
				i=0;
				break;
			}
		}


	}			
	file.Close();
	return true;
}

void CTankMap::SetHeadQuarterBorder(CellType type)
{

	int i,j;
	for(i=17,j=36;j<40;j++)
		m_nGrid[i][j]=type;
	for(i=22,j=36;j<40;j++)
		m_nGrid[i][j]=type;
	for(i=17,j=36;i<23;i++)
		m_nGrid[i][j]=type;
}

void CTankMap::SetMapCell(int x,int y,Cell type,BYTE mask)
{
	if(m_bLockState==false)
	{
		if( x<0 || x>=TANKMAPWIDTH)return;
		if( y<0 || y>=TANKMAPHEIGHT)return;
		m_nGrid[x][y].cell=type;
		m_nGrid[x][y].mask=mask;

	}
}

void CTankMap::DrawShield(LPDIRECTDRAWSURFACE pdds)
{
	RECT rc;
	rc.left=0;
	rc.right=rc.left+TANKMAPCELL;
	rc.top=0;
	rc.bottom=rc.top+TANKMAPCELL;
	int xs;
	int ys;
	for(int i=0;i<TANKMAPWIDTH;i++)
		for(int j=0;j<TANKMAPHEIGHT;j++)
			if(m_nGrid[i][j].cell==CT_TREE)
			{
				xs=i*TANKMAPCELL;
				ys=j*TANKMAPCELL;
				pdds->BltFast( xs, ys, m_bmpTree, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
			}
}

void CTankMap::DrawMap(LPDIRECTDRAWSURFACE pdds)
{
	for(int i=0;i<TANKMAPWIDTH;i++)
		for(int j=0;j<TANKMAPHEIGHT;j++)
			DrawCell(i,j,pdds);

}

void CTankMap::DrawCell(int x, int y,LPDIRECTDRAWSURFACE pdds)
{
	if( x<0 || x>=TANKMAPWIDTH)return;
	if( y<0 || y>=TANKMAPHEIGHT)return;
	RECT rc;
	int xs=x*TANKMAPCELL;
	int ys=y*TANKMAPCELL;
	rc.left=0;
	rc.right=rc.left+TANKMAPCELL;
	rc.top=0;
	rc.bottom=rc.top+TANKMAPCELL;
	switch(m_nGrid[x][y].cell)
	{
	case CT_SOIL:
		if(m_nGrid[x][y].defence <= 60)
		{
			rc.left+=TANKMAPCELL;
			rc.right+=TANKMAPCELL;
		}
		pdds->BltFast( xs, ys, m_bmpSoil, &rc, DDBLTFAST_WAIT );
		break;
	case CT_STONE:
		if(m_nGrid[x][y].defence <= 70)
		{
			rc.left+=TANKMAPCELL;
			rc.right+=TANKMAPCELL;
		}
		pdds->BltFast( xs, ys, m_bmpStone, &rc, DDBLTFAST_WAIT );
		break;
	case CT_STEEL:
		pdds->BltFast( xs, ys, m_bmpSteel, &rc, DDBLTFAST_WAIT );
		break;
	case CT_WATER:
		pdds->BltFast( xs, ys, m_bmpWater, &rc, DDBLTFAST_WAIT );
		break;
	case CT_ICE:
		pdds->BltFast( xs, ys, m_bmpIce, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
		break;
	}
}

bool CTankMap::WriteMapToFile(LPCTSTR fn)
{
	CStdioFile file;
	if(!file.Open( fn, CFile::modeCreate | CFile::modeWrite | CFile::typeText ) )
		return false;
	CString str;
	for(int i=0;i<TANKMAPWIDTH;i++)
		for(int j=0;j<TANKMAPHEIGHT;j++)
		{
			str.Format("%d",m_nGrid[i][j].cell);
			str+="\n";
			file.WriteString(str);
		}			
	file.Close();
	return true;
}

CellType& CTankMap::GetCellType(int x, int y)
{
	ASSERT( x>=0 && x<TANKMAPWIDTH);
	ASSERT( y>=0 && y<TANKMAPHEIGHT);
	return m_nGrid[x][y];
}

void CTankMap::DestroyBmp()
{
	if(m_bmpSoil)
	{
		m_bmpSoil->Release();
		m_bmpSoil=NULL;
	}
	if(m_bmpStone)
	{
		m_bmpStone->Release();
		m_bmpStone=NULL;
	}
	if(m_bmpSteel)
	{
		m_bmpSteel->Release();
		m_bmpSteel=NULL;
	}
	if(m_bmpWater)
	{
		m_bmpWater->Release();
		m_bmpWater=NULL;
	}
	if(m_bmpIce)
	{
		m_bmpIce->Release();
		m_bmpIce=NULL;
	}
	if(m_bmpTree)
	{
		m_bmpTree->Release();
		m_bmpTree=NULL;
	}
}

void CTankMap::Lock()
{
	m_bLockState=true;
}

void CTankMap::UnLock()
{
	m_bLockState=false;
}

void CTankMap::ResetSurface()
{
	if(m_bmpSoil)
		m_bmpSoil->Restore();
	if(m_bmpStone)
		m_bmpStone->Restore();
	if(m_bmpSteel)
		m_bmpSteel->Restore();
	if(m_bmpWater)
		m_bmpWater->Restore();
	if(m_bmpIce)
		m_bmpIce->Restore();
	if(m_bmpTree)
		m_bmpTree->Restore();

}

⌨️ 快捷键说明

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