📄 cmap.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏地图模块
//CMap.cpp
//游戏引擎中的地图部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/27 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include"CMap.h"
#include"CError.h"
#include"CMacro.h"
////////////////////////////////////////////////////////////////////////////////////////////
//构造
////////////////////////////////////////////////////////////////////////////////////////////
CMap::CMap(CLog*pLog)
{
m_bOwnLog=false;
m_pLog=pLog;
if(!m_pLog)
{
m_bOwnLog=true;
m_pLog=new CLog("GameLog.txt",true);
}
m_ppTile=NULL;
memset(&m_head,0,sizeof(m_head));
}
////////////////////////////////////////////////////////////////////////////////////////////
//析构
////////////////////////////////////////////////////////////////////////////////////////////
CMap::~CMap()
{
if(m_ppTile)
{
for(int i=0;i<m_head.Width;i++)
{
delete [] m_ppTile[i];
}
delete [] m_ppTile;
m_ppTile=NULL;
}
if(m_bOwnLog)
{
if(m_pLog)
{
delete m_pLog;
m_pLog=NULL;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//保存地图
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMap::SaveMap(const char*szFile,int ID)
{
LOA_ASSERT(szFile);
if(!m_ppTile)
{
m_pLog->WriteMessage("No Map Data!\n");
return false;
}
SetFileAttributes(szFile,FILE_ATTRIBUTE_NORMAL); //确保文件属性为可写
FILE*fp;
strcpy(m_head.szMapInfo,LOA_MAP_INFO);
m_head.ID=ID;
fp=fopen(szFile,"wb"); //打开文件
if(!fp)
{
m_pLog->WriteMessage("Open Map File<%s> For Write Failed!\n",szFile);
return false;
}
fwrite(&m_head,sizeof(m_head),1,fp);
for(int i=0;i<m_head.Width;i++)
{
for(int j=0;j<m_head.Height;j++)
{
fwrite(&m_ppTile[i][j],sizeof(m_ppTile[i][j]),1,fp);
}
}
fclose(fp);
m_pLog->WriteMessage("Save Map <%s> size=%d*%d OK!\n",szFile,m_head.Width,m_head.Height);
return true;
}
BOOL CMap::GetMapHead(const char*szFile,STMapHead*pHead)
{
LOA_ASSERT(szFile);
LOA_ASSERT(pHead);
FILE*fp=fopen(szFile,"rb"); //打开文件
if(!fp)
{
m_pLog->WriteMessage("Open Map File<%s> Failed!\n",szFile);
return false;
}
fread(pHead,sizeof(STMapHead),1,fp); //读取文件头
fclose(fp);
if(strcmp(pHead->szMapInfo,LOA_MAP_INFO)!=0)
{
m_pLog->WriteMessage("Not LOA's Map file!\n");
return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//读取地图
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMap::LoadMap(const char*szFile)
{
LOA_ASSERT(szFile);
if(m_ppTile)
{
for(int i=0;i<m_head.Width;i++)
{
delete [] m_ppTile[i];
}
delete [] m_ppTile;
}
FILE*fp=fopen(szFile,"rb"); //打开文件
if(!fp)
{
m_pLog->WriteMessage("Open Map File<%s> Failed!\n",szFile);
return false;
}
fread(&m_head,sizeof(m_head),1,fp); //读取文件头
if(strcmp(m_head.szMapInfo,LOA_MAP_INFO)!=0)
{
m_pLog->WriteMessage("Not LOA's Map file!\n");
fclose(fp);
return false;
}
m_ppTile=new STTile*[m_head.Width]; //重新分配内存
if(!m_ppTile)
{
m_pLog->WriteMessage("Out Of Memory In New MapTile!\n");
fclose(fp);
return false;
}
for(int i=0;i<m_head.Width;i++) //为每一行分配内存
{
m_ppTile[i]=new STTile[m_head.Height];
if(!m_ppTile[i])
{
m_pLog->WriteMessage("Out Of Memory In New MapTile[%d]!\n",i);
fclose(fp);
return false;
}
}
for(i=0;i<m_head.Width;i++)
{
for(int j=0;j<m_head.Height;j++)
{
fread(&m_ppTile[i][j],sizeof(m_ppTile[i][j]),1,fp);
}
} //读取地图数据
fclose(fp);
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//新地图
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMap::NewMap(int width,int height)
{
strcpy(m_head.szMapInfo,LOA_MAP_INFO);
strcpy(m_head.szMapName,"无名地图");
m_head.Width=width;
m_head.Height=height;
m_head.ID=0;
m_head.bRandomBattle=false;
if(m_ppTile)
{
for(int i=0;i<this->m_head.Width;i++)
{
if(m_ppTile[i])
delete [] m_ppTile[i];
}
delete [] m_ppTile;
m_ppTile=NULL;
}
m_ppTile=new STTile*[m_head.Width]; //重新分配内存
if(!m_ppTile)
{
m_pLog->WriteMessage("Out Of Memory In New MapTile!\n");
return false;
}
for(int i=0;i<m_head.Width;i++) //为每一行分配内存
{
m_ppTile[i]=new STTile[m_head.Height];
if(!m_ppTile[i])
{
m_pLog->WriteMessage("Out Of Memory In New MapTile[%d]!\n",i);
return false;
}
}
for(i=0;i<m_head.Width;i++)
{
for(int j=0;j<m_head.Height;j++)
{
m_ppTile[i][j].bCross=true;
m_ppTile[i][j].flag=0;
m_ppTile[i][j].flagdata=0;
m_ppTile[i][j].IDObj_1=255;
m_ppTile[i][j].IDObj_2=255;
m_ppTile[i][j].Layer1=1;
m_ppTile[i][j].Layer2=8;
m_ppTile[i][j].xObj_1=0;
m_ppTile[i][j].yObj_1=0;
m_ppTile[i][j].xObj_2=0;
m_ppTile[i][j].yObj_2=0;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -