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

📄 cmapeditor.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include<stdio.h>
#include"CMapEditor.h"
#include"Resource.h"
#include"..\\CError.h"
#include"..\\CMap.h"
#include"..\\CIniFile.h"
#pragma comment(lib,"winmm")
//--------------------------静态变量声明---------------------------------------------
DWORD CMapEditor::s_dwNewMapHeight=15;
DWORD CMapEditor::s_dwNewMapWidth=20;
DWORD CMapEditor::s_dwTileLayer1=0;
DWORD CMapEditor::s_dwTileLayer2=0;
DWORD CMapEditor::s_dwxCurrentEdit=0;
DWORD CMapEditor::s_dwyCurrentEdit=0;
DWORD CMapEditor::s_dwChangeMapID=0;
DWORD CMapEditor::s_dwTileFlag=0;
DWORD CMapEditor::s_dwScriptID=0;
char CMapEditor::s_szMapName[24];
char CMapEditor::s_szTileData[128];
int CMapEditor::s_nID=0;
char CMapEditor::s_szCurrentPath[256];
//-----------------------------------------------------------------------------------
//构造函数
//-----------------------------------------------------------------------------------
CMapEditor::CMapEditor()
{
	m_pLog=new CLog("MapEditor.log");
	char szFile[256];
	::GetModuleFileName(NULL,szFile,256);
	::GetFullPathName(szFile,256,m_szInitDir,NULL);
	m_pSurfGround=NULL;
	m_dwCurrentSelectSurface=1;
	m_xdwCurrentEditTile=0;
	m_ydwCurrentEditTile=0;
	m_xdwCurrentSelectTile=0xffffffff;
	m_ydwCurrentSelectTile=0xffffffff;
	m_bIsEdit=true;
	m_bShowObj1=true;
	m_bShowObj2=true;
	m_bShowGround=true;
	m_bShowBlockSign=true;
	m_bShowGrid=true;
	m_bWindowed=true;
	m_hMenuMain=NULL;

	m_xEditStart=0;
	m_yEditStart=0;
	for(int i=0;i<11;i++)
	{
		m_axSelectStart[i]=0;
		m_aySelectStart[i]=0;
		m_aSurface[i]=NULL;
	}
	m_dwCurrentEditLayer=LOA_MAP_LAYER_GROUND;
	m_pMap=NULL;
	m_aTileAni=NULL;
	
	::SetFileAttributes("mapid.dat",FILE_ATTRIBUTE_NORMAL);
	FILE*fp=fopen("mapid.dat","rb");
	if(fp)
	{
		fread(&m_MapID,4,1,fp);
		fclose(fp);
	}
	else
	{
		m_MapID=1;
		fp=fopen("mapid.dat","wb");
		fwrite(&m_MapID,4,1,fp);
		fclose(fp);
	}
	::GetCurrentDirectory(256,s_szCurrentPath);
	
	ResetScrollBarRange();
}
//-----------------------------------------------------------------------------------
//析构函数
//-----------------------------------------------------------------------------------
CMapEditor::~CMapEditor()
{
	
}
//-----------------------------------------------------------------------------------
//消息框
//-----------------------------------------------------------------------------------
void CMapEditor::MsgBox(char*str,...)
{
	char msg[1024];
	va_list vl;
	va_start(vl,str);
	wvsprintf(msg,str,vl);
	va_end(vl);
	MessageBox(m_hWnd,msg,"Message",MB_OK);
}
//-----------------------------------------------------------------------------------
//退出
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnExit()
{
	return PostMessage(m_hWnd,WM_CLOSE,0,0);
}
//-----------------------------------------------------------------------------------
//新地图
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnNew()
{
	if(MessageBox(m_hWnd,"确实要创建新地图么?(注意保存现在正在编辑的地图)","注意",MB_YESNO)==IDNO)
		return false;
	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_GET_INT_VALUE),
			  m_hWnd,
			  (DLGPROC)DlgGetMapSize);
	if(s_dwNewMapHeight>=15 && s_dwNewMapWidth>=20)
	{
		if(!m_pMap->NewMap(s_dwNewMapWidth,s_dwNewMapHeight))
		{
			m_pLog->WriteMessage("New Map Failed!\n");
			return false;
		}
		m_pSurfGround->Clear();

		m_xEditStart=0;
		m_yEditStart=0;
		m_xdwCurrentSelectTile=0xffffffff;
		m_ydwCurrentSelectTile=0xffffffff;
		ResetScrollBarRange();
		for(int i=0;i<11;i++)
		{
			m_axSelectStart[i]=0;
			m_aySelectStart[i]=0;
		}
		return true;
	}
	MsgBox("地图高不能小于15,地图宽不能小于20");
	return false;
}
//-----------------------------------------------------------------------------------
//读取地图
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnLoad()
{
	char str[256];
	strcpy(str,OpenFileDialog("","地图文件(*.lmp)\0*.lmp\0所有文件(*.*)\0*.*;\0\0",false)); 
	if(strcmp(str,"")==0)
		return false;
	
	if(!m_pMap->LoadMap(str))
	{
		MsgBox("读取地图文件<%s>失败!",str);
		return false;
	}
	m_xEditStart=0;
	m_yEditStart=0;
	s_dwNewMapWidth=m_pMap->m_head.Width;
	s_dwNewMapHeight=m_pMap->m_head.Height;
	ResetScrollBarRange();

	m_pSurfGround->Clear();


	RECT rect;

	::SetRect(&rect,m_pMap->m_head.xGround<<5,
					m_pMap->m_head.yGround<<5,
					(m_pMap->m_head.xGround+1)<<5,
					(m_pMap->m_head.yGround+1)<<5);
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<15;j++)
		{
			m_pSurfGround->BltFast(i<<5,j<<5,m_aSurface[m_pMap->m_head.groundID]->GetDDrawSurface(),&rect,true);
		}
	}
	return true;
}
//-----------------------------------------------------------------------------------
//保存地图
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnSave()
{
	char str[256];
	strcpy(str,OpenFileDialog("","地图文件(*.lmp)\0*.lmp\0所有文件(*.*)\0*.*;\0\0",true)); 
	if(strcmp(str,"")==0)
		return false;
	int j=0;
	char szFile[256];
	memset(szFile,0,256);
	for(int w=strlen(str)-1;w>=0;w--)
	{
		if(str[w]=='\\')
		{
			w++;
			strcpy(szFile,&str[w]);
			break;
		}
	}
	char szMsg[1024];
	wsprintf(szMsg,"文件 %s 已经存在,要覆盖么?",szFile);
	FILE*fp=fopen(str,"rb");
	if(fp)
	{
		fclose(fp);
		
		if(IDNO==MessageBox(m_hWnd,szMsg,"注意",MB_YESNO))
			return false;
/*
		CMap tmpmap(m_pLog);
		STMapHead head;
		tmpmap.GetMapHead(str,&head);
		m_pMap->m_head.ID=head.ID;
*/		
	}
	else
	{
/*
		char szMapIDFile[256];
		wsprintf(szMapIDFile,"%s\\mapID.dat",s_szCurrentPath);
		fp=fopen(szMapIDFile,"rb");
		fread(&m_MapID,4,1,fp);
		fclose(fp);
		m_MapID++;
		fp=fopen(szMapIDFile,"wb");
		fwrite(&m_MapID,4,1,fp);
		fclose(fp);
*/
	}
	BOOL bExt=false;
	for(w=0;w<(int)strlen(str);w++)
	{
		if(str[w]=='.')											//检查是否已经有后缀了
		{
			bExt=true;
			break;
		}
	}
	if(!bExt)
	{
		w=strlen(str);
		if(w<250)
		{
			str[w]='.';
			str[w+1]='l';
			str[w+2]='m';
			str[w+3]='p';
			str[w+4]='\0';
		}
	}

	if(!m_pMap->SaveMap(str,m_pMap->m_head.ID))
	{
		MsgBox("保存地图文件<%s>失败!",str);
		return false;
	}
	return true;
}
BOOL CMapEditor::OnEditID()
{
	if(!m_pMap)
	{
		MsgBox("请先创建地图!");
		return false;
	}
	s_nID=m_pMap->m_head.ID;
	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_GET_ID),
			  m_hWnd,
			  (DLGPROC)DlgEditMapID);
	
	m_pMap->m_head.ID=s_nID;
	return true;
}
BOOL CMapEditor::OnEditMapInfo()
{
	if(!m_pMap)
	{
		MsgBox("请先创建地图!");
		return false;
	}
	memset(s_szMapName,0,32);
	strcpy(s_szMapName,m_pMap->m_head.szMapName);
	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_EDIT_MAP_INFO),
			  m_hWnd,
			  (DLGPROC)DlgEditMapInfo);
	
	if(strcmp(s_szMapName,"")!=0)
	{
		strcpy(m_pMap->m_head.szMapName,s_szMapName);
	}
	return true;
}
LRESULT CMapEditor::DlgSetMapScript(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_INITDIALOG:
		{
			::SetDlgItemInt(hWnd,IDC_POS_X,s_dwxCurrentEdit,false);
			::SetDlgItemInt(hWnd,IDC_POS_Y,s_dwyCurrentEdit,false);
			::SetDlgItemText(hWnd,IDC_LIST_BOX_NAME,"请选择要执行的脚本:");
			::SetDlgItemText(hWnd,IDC_TILE_DATA,s_szTileData);
			HWND hListBox=::GetDlgItem(hWnd,IDC_LIST_MAPNAME);
			WIN32_FIND_DATA wfd;
			ZeroMemory(&wfd,sizeof(wfd));

			char szFindFile[256];
			wsprintf(szFindFile,"%s\\script\\*.lsr",s_szCurrentPath);
			HANDLE hff=::FindFirstFile(szFindFile,&wfd);
			char tmp[256];
			CIniFile inifile;
			if(hff!=INVALID_HANDLE_VALUE)
			{
				memset(tmp,0,256);
				int iID=0;
				wsprintf(szFindFile,"%s\\script\\%s",s_szCurrentPath,wfd.cFileName);
				iID=::GetPrivateProfileInt("Info","ID",0,szFindFile);
//				if(inifile.LoadFile(wfd.cFileName))
//				{
//					inifile.GetIntValueInSet("Info","ID",iID);
//				}
				wsprintf(tmp,"脚本ID:%d,脚本文件名字:%s",iID,wfd.cFileName);
				::SendMessage(hListBox,LB_INSERTSTRING,0,(LPARAM)tmp);
				while(::FindNextFile(hff,&wfd))
				{
					memset(tmp,0,256);
					wsprintf(szFindFile,"%s\\script\\%s",s_szCurrentPath,wfd.cFileName);
					iID=::GetPrivateProfileInt("Info","ID",0,szFindFile);
	//				if(inifile.LoadFile(wfd.cFileName))
	//				{
	//					inifile.GetIntValueInSet("Info","ID",iID);
	//				}
					wsprintf(tmp,"脚本ID:%d,脚本文件名字:%s",iID,wfd.cFileName);
					::SendMessage(hListBox,LB_INSERTSTRING,0,(LPARAM)tmp);
				}
				::FindClose(hff);
			}
			 
		}
        break;
	case WM_COMMAND:
		{
			switch(wParam)
			{
			case IDOK:
				{	
					 
					HWND hListBox=::GetDlgItem(hWnd,IDC_LIST_MAPNAME);
					int index=SendMessage(hListBox,LB_GETCURSEL,0,0);
					char tmp[256];
					memset(tmp,0,256);
					::SendMessage(hListBox,LB_GETTEXT,(WPARAM)index,(LPARAM)tmp);

					int id;
					sscanf(tmp,"脚本ID:%d",&id);
					
					s_dwScriptID=id;

					 
					EndDialog(hWnd,1);
					return 1;
				}
				break;
			case IDCANCEL:
				{
					EndDialog(hWnd,1);
					return 1;
				}
				break;
			}
		}
		break;
	default:
		return 0;
	}
	return 1;
}
LRESULT CMapEditor::DlgSetChangeMap(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_INITDIALOG:
		{
			::SetDlgItemInt(hWnd,IDC_POS_X,s_dwxCurrentEdit,false);
			::SetDlgItemInt(hWnd,IDC_POS_Y,s_dwyCurrentEdit,false);
			::SetDlgItemText(hWnd,IDC_LIST_BOX_NAME,"请选择要切换到的地图:");
			::SetDlgItemText(hWnd,IDC_TILE_DATA,s_szTileData);
			HWND hListBox=::GetDlgItem(hWnd,IDC_LIST_MAPNAME);
			WIN32_FIND_DATA wfd;
			ZeroMemory(&wfd,sizeof(wfd));
			HANDLE hff=::FindFirstFile("*.lmp",&wfd);
			char tmp[256];
			if(hff!=INVALID_HANDLE_VALUE)
			{
				memset(tmp,0,256);
				CMap map(NULL);
				STMapHead maphead;
				map.GetMapHead(wfd.cFileName,&maphead);
				wsprintf(tmp,"地图ID:%d,地图名字:%s",maphead.ID,wfd.cFileName);
				::SendMessage(hListBox,LB_INSERTSTRING,0,(LPARAM)tmp);
				while(::FindNextFile(hff,&wfd))
				{
					memset(tmp,0,256);
					map.GetMapHead(wfd.cFileName,&maphead);
					wsprintf(tmp,"地图ID:%d,地图名字:%s",maphead.ID,wfd.cFileName);
					::SendMessage(hListBox,LB_INSERTSTRING,0,(LPARAM)tmp);
				}
				::FindClose(hff);
			}
		}
        break;
	case WM_COMMAND:
		{
			switch(wParam)
			{
			case IDOK:
				{	
					HWND hListBox=::GetDlgItem(hWnd,IDC_LIST_MAPNAME);
					int index=SendMessage(hListBox,LB_GETCURSEL,0,0);
					char tmp[256];
					memset(tmp,0,256);
					::SendMessage(hListBox,LB_GETTEXT,(WPARAM)index,(LPARAM)tmp);

					int id;
					sscanf(tmp,"地图ID:%d",&id);
					
					s_dwChangeMapID=id;

					EndDialog(hWnd,1);
					return 1;
				}
				break;
			case IDCANCEL:
				{
					EndDialog(hWnd,1);
					return 1;
				}
				break;
			}
		}
		break;
	default:
		return 0;

⌨️ 快捷键说明

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