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

📄 gamemap.cpp

📁 是一个基于热血战国协议的网络游戏。现在脱机客户端先放出来给大家研究
💻 CPP
字号:

/*
 * name: GameMap.cpp
 *
 * desc: 游戏地图,读取传奇2地图文件数据,每个游戏都不一样
 *
*/

#include "StdAfx.h"
#include "GameMir.h"

/*
=======================================================================
函数名       : GetMainDir2
功能描述     : 得到程序主目录
参数         : void
返回值       : NULL
=======================================================================
*/
static std::string GetMainDir2(void) //2007-07-20 添加
{
	char buf[MAX_PATH];
	ZeroMemory(buf,sizeof(buf));
	GetModuleFileName(0,buf,sizeof(buf));
	long len=strlen(buf);
	while ( len>0 ) { if ( buf[len]=='\\' ) { buf[len]=static_cast<char>(0); break; } --len; }
	strcat(buf,"\\");

	return std::string(buf);
}

/*
=======================================================================
函数名       : CGameMap
功能描述     : 构造函数
参数         : void
返回值       : NULL
=======================================================================
*/
CGameMap::CGameMap(LPCTSTR mapfile) 
:m_File((GetMainDir2()+mapfile).c_str(),CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite)
,m_Maps(NULL)
,m_MapData(NULL) //2007-07-20
{
	m_MapName.clear();
	m_File.Seek(0,CFile::begin);
	m_File.Read(&m_Head,sizeof(m_Head));
	if(strcmp(m_Head.CopyRight,"#TurboMir#")!=0)
	{
		AfxMessageBox("地图格式错误!");
		throw "地图格式错误!";
	}
	if(m_Maps!=NULL)
		delete[]m_Maps;
	m_Maps=new MAP_INDEX[m_Head.IdxCount];
	m_File.Read(m_Maps,sizeof(MAP_INDEX)*m_Head.IdxCount);
}

/*
=======================================================================
函数名       : ~CGameMap
功能描述     : 拆构函数
参数         : void
返回值       : NULL
=======================================================================
*/
CGameMap::~CGameMap(void)
{
	if(m_Maps!=NULL)
		delete[]m_Maps;
}

/*
=======================================================================
函数名       : LoadMap
功能描述     : 导入地图
参数         : void
返回值       : NULL
=======================================================================
*/
void CGameMap::LoadMap(LPCTSTR mapname)
{
	for(unsigned long i=0;i<m_Head.IdxCount;i++)
	{
		if(strcmp(m_Maps[i].MapEnName,mapname)==0)
		{
			m_File.Seek(m_Maps[i].Offset,CFile::begin);
			char Id[3];
			m_File.Read(Id,3);
			if((Id[0]=='S')&&(Id[1]=='H')&&(Id[2]=='K'))
			{
				m_File.Read(&m_MapWidth,4);
				m_File.Read(&m_MapHeight,4);
				
				long ds = (m_MapWidth*m_MapHeight+7)>>3;
				if(m_MapData!=NULL)
					delete[]m_MapData;

				m_MapData = new BYTE[ds];
				m_File.Read(m_MapData,ds);
				m_MapName = mapname;
				return;
			}
			else
			{
				AfxMessageBox("地图格式错误!");
			}
		}
	}
	AfxMessageBox("地图加载失败!");
}

/*
=======================================================================
函数名       : TestMap
功能描述     : 测试地图
参数         : void
返回值       : NULL
=======================================================================
*/
bool CGameMap::TestMap(long x, long y)
{
	if (m_MapData==NULL)
	{
		return false;
	}
	if ( x>0 && y>0 && x<m_MapWidth && y<m_MapHeight)
	{
		BYTE bits;
		long index = y * m_MapWidth + x ;
		bits  = (~index) & 0x07;
		index >>= 3;

		BYTE d=m_MapData[index];
		d>>=bits;

		return (d&1)!=0;
	}
	return false;
}

⌨️ 快捷键说明

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