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

📄 cmap.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 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 + -