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

📄 cmapeditor.cpp

📁 一个利用MAP的类,可以方便地使用多维数组.
💻 CPP
字号:
#include "CMapEditor.h"

CMapEditor::CMapEditor(int iWidth,int iHeight,int nLevels)
{
	m_iWidth = iWidth;
	m_iHeight = iHeight;
	m_nLevels = nLevels;
	
	m_prgMap = new int**[m_iWidth];

	for(int x=0;x<m_iWidth;x++)
		m_prgMap[x] = new int*[m_iHeight];

	for(int x=0;x<m_iWidth;x++)
		for(int y=0;y<m_iHeight;y++)
			m_prgMap[x][y] = new int[m_nLevels];

	for(int x=0;x<m_iWidth;x++)
		for(int y=0;y<m_iHeight;y++)
			for(int l=0;l<m_nLevels;l++)
				m_prgMap[x][y][l] = NULL;

	m_iUndoPos = -1;

	if(!m_prgMap) delete this;

}

CMapEditor::~CMapEditor(void)
{
	for(int x=0;x<m_iWidth;x++)
		for(int y=0;y<m_iHeight;y++)
				if(m_prgMap[x][y]) delete[] m_prgMap[x][y];

	for(int x=0;x<m_iWidth;x++)
			if(m_prgMap[x]) delete[] m_prgMap[x];
	
	if(m_prgMap) delete[] m_prgMap;
}

bool CMapEditor::EndDrag(int ptX, int ptY, int iValue)
{
	if(!IsValidCoord(ptX,ptY,m_iDragLevel)) return false;
	
	if(ptX > m_ptDragX)
		for(int x=m_ptDragX;x<=ptX;x++)	
			if(ptY > m_ptDragY)
				for(int y=m_ptDragY;y<=ptY;y++)
					SetMapValue(x,y,m_iDragLevel,iValue);
			else
				for(int y=ptY;y<=m_ptDragY;y++)
					SetMapValue(x,y,m_iDragLevel,iValue);

	else
		for(int x=ptX;x<=m_ptDragX;x++)
			if(ptY > m_ptDragY)
				for(int y=m_ptDragY;y<=ptY;y++)
					SetMapValue(x,y,m_iDragLevel,iValue);
			else
				for(int y=ptY;y<=m_ptDragY;y++)
					SetMapValue(x,y,m_iDragLevel,iValue);

	return true;
}

bool CMapEditor::Fill(int ptX, int ptY, int iLevel, int iReplace, int iValue)
{
	if(!IsValidCoord(ptX,ptY,iLevel)) return false;
	
	SetMapValue(ptX,ptY,iLevel,iValue);
	
	SPOINT ptFill[4];

	ptFill[0].x = ptX;		
	ptFill[0].y = ptY-1;

	ptFill[1].x = ptX+1;	
	ptFill[1].y = ptY;

	ptFill[2].x = ptX;		
	ptFill[2].y = ptY+1;

	ptFill[3].x = ptX-1;	
	ptFill[3].y = ptY;

	for(int i=0;i<4;i++)
		if(IsValidCoord(ptFill[i].x,ptFill[i].y,iLevel) && GetMapValue(ptFill[i].x,ptFill[i].y,iLevel) == iReplace)
			Fill(ptFill[i].x,ptFill[i].y,iLevel,iReplace,iValue);

	return true;
}

MAPINFO CMapEditor::GetMapInfo(void)
{
	MAPINFO minfoTemp;
	minfoTemp.iHeight = m_iHeight;
	minfoTemp.iWidth = m_iWidth;
	minfoTemp.nLevels = m_nLevels;
	return minfoTemp;
}

int CMapEditor::GetMapValue(int ptX, int ptY, int iLevel)
{
	if(IsValidCoord(ptX,ptY,iLevel)) return m_prgMap[ptX][ptY][iLevel];
	else return -32767;
}

bool CMapEditor::IsValidCoord(int ptX, int ptY, int iLevel)
{
	if(ptX < 0 || ptX >= m_iWidth || ptY < 0 || ptY >= m_iHeight || iLevel < 0 || iLevel >= m_nLevels) return false;
	else return true;
}

void CMapEditor::NextUndo(void)
{
	vector <SUNDO>::iterator Iter;
	
	SUNDO temp_SUndo;
	m_vUndos.insert(m_vUndos.begin()+m_iUndoPos+1,temp_SUndo);
	m_iUndoPos++;
	m_vUndos.erase(m_vUndos.begin()+m_iUndoPos+1,m_vUndos.end());
	m_vUndos.push_back(temp_SUndo);
}

int CMapEditor::Redo(void)
{
	vector<SPOINT>::iterator Iter;
	int i=-1;

	m_iUndoPos++;

	for(Iter = m_vUndos[m_iUndoPos].vPoints.begin();Iter != m_vUndos[m_iUndoPos].vPoints.end();Iter++)
		m_prgMap[m_vUndos[m_iUndoPos].vPoints[++i].x][m_vUndos[m_iUndoPos].vPoints[i].y][m_vUndos[m_iUndoPos].vPoints[i].l] = m_vUndos[m_iUndoPos].vpiRedo[i];

	return m_iUndoPos;
}

bool CMapEditor::SetMapValue(int ptX, int ptY, int iLevel,int iValue)
{
	if(!IsValidCoord(ptX,ptY,iLevel)) return false;

	SPOINT sptPos;
	sptPos.x = ptX;
	sptPos.y = ptY;
	sptPos.l = iLevel;

	m_vUndos[m_iUndoPos].vPoints.push_back(sptPos);
    m_vUndos[m_iUndoPos].vpiUndo.push_back(m_prgMap[ptX][ptY][iLevel]);

	m_prgMap[ptX][ptY][iLevel] = iValue;

	m_vUndos[m_iUndoPos].vpiRedo.push_back(m_prgMap[ptX][ptY][iLevel]);

	return true;
}

bool CMapEditor::StartDrag(int ptX, int ptY,int iLevel)
{
	if(!IsValidCoord(ptX,ptY,iLevel)) return false;
	
	m_ptDragX = ptX;
	m_ptDragY = ptY;
	m_iDragLevel = iLevel;

	return true;
}

int CMapEditor::Undo(void)
{
	vector<SPOINT>::iterator Iter;
	int i=-1;
	
	for(Iter = m_vUndos[m_iUndoPos].vPoints.begin();Iter != m_vUndos[m_iUndoPos].vPoints.end();Iter++)
		m_prgMap[m_vUndos[m_iUndoPos].vPoints[++i].x][m_vUndos[m_iUndoPos].vPoints[i].y][m_vUndos[m_iUndoPos].vPoints[i].l] = m_vUndos[m_iUndoPos].vpiUndo[i];
	
	return --m_iUndoPos;
}

⌨️ 快捷键说明

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