📄 gamemap.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 + -