📄 cmapeditor.cpp
字号:
#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 + -