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

📄 cmapeditor.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
	return 1;
}
BOOL CMapEditor::OnSetMapScript()
{
	POINT pt;
	RECT rect;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);

	float tileWidth=((float)(rect.right-rect.left))/20.0f;
	float tileHeight=((float)(rect.bottom-rect.top))/15.0f;

	if(!::PtInRect(&rect,pt))
	{
		return false;
	}
	 
	m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
	m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
	DWORD xTileStart=m_xEditStart>>5;
	DWORD yTileStart=m_yEditStart>>5;

	
	s_dwxCurrentEdit=m_xdwCurrentEditTile+xTileStart;
	s_dwyCurrentEdit=m_ydwCurrentEditTile+yTileStart; 

	memset(s_szTileData,0,128);

	s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flag;
	switch(s_dwTileFlag)
	{
	case LOA_MAP_FLAG_CHANGE_MAP:
		wsprintf(s_szTileData,"切换地图到ID为%d的地图",s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata);
		break;
	case LOA_MAP_FLAG_LOAD_SCRIPT:
		wsprintf(s_szTileData,"读取ID为%d的地图脚本",s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata);
		break;
	default:
		wsprintf(s_szTileData,"没有任何事件");
		break;
	}

	s_dwScriptID=0;
 
	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_SET_TILE_DATA),
			  m_hWnd,
			  (DLGPROC)DlgSetMapScript);

	if(s_dwScriptID)
	{
		m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flag=LOA_MAP_FLAG_LOAD_SCRIPT;
		m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata=s_dwScriptID;
	}

	return true;
}
BOOL CMapEditor::OnSetChangeMap()
{
	
	POINT pt;
	RECT rect;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);

	float tileWidth=((float)(rect.right-rect.left))/20.0f;
	float tileHeight=((float)(rect.bottom-rect.top))/15.0f;

	if(!::PtInRect(&rect,pt))
	{
		return false;
	}
	 
	m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
	m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
	DWORD xTileStart=m_xEditStart>>5;
	DWORD yTileStart=m_yEditStart>>5;
	
	s_dwxCurrentEdit=m_xdwCurrentEditTile+xTileStart;
	s_dwyCurrentEdit=m_ydwCurrentEditTile+yTileStart; 

	memset(s_szTileData,0,128);

	s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flag;
	switch(s_dwTileFlag)
	{
	case LOA_MAP_FLAG_CHANGE_MAP:
		wsprintf(s_szTileData,"切换地图到ID为%d的地图",s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata);
		break;
	case LOA_MAP_FLAG_LOAD_SCRIPT:
		wsprintf(s_szTileData,"读取ID为%d的地图脚本",s_dwTileFlag=m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata);
		break;
	default:
		wsprintf(s_szTileData,"没有任何事件");
		break;
	}

	s_dwChangeMapID=0;
 
	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_SET_TILE_DATA),
			  m_hWnd,
			  (DLGPROC)DlgSetChangeMap);

	if(s_dwChangeMapID)
	{
		m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flag=LOA_MAP_FLAG_CHANGE_MAP;
		m_pMap->m_ppTile[s_dwxCurrentEdit][s_dwyCurrentEdit].flagdata=s_dwChangeMapID;
	}

	return true;
}
//-----------------------------------------------------------------------------------
//打开文件的对话框
//-----------------------------------------------------------------------------------
char*CMapEditor::OpenFileDialog(char*lpstrFile,char*lpstrFilter,BOOL bSave)
{
	
	char tmp[256];
	strcpy(tmp,lpstrFile);
	OPENFILENAME ofn;
	ZeroMemory(&ofn,sizeof(ofn));
	ofn.lStructSize=sizeof(OPENFILENAME);
	ofn.hwndOwner=m_hWnd;
	ofn.hInstance=m_hInstance;
	ofn.lpstrFilter=lpstrFilter;
	ofn.lpstrCustomFilter=NULL;
	ofn.nFilterIndex=0;
	ofn.nMaxCustFilter=0;
	ofn.lpstrFile=tmp;
	ofn.nMaxFile=1024;
	ofn.lpstrTitle=NULL;
	ofn.lpstrFileTitle=NULL;
	ofn.lpstrInitialDir=m_szInitDir;
	ofn.Flags=OFN_SHOWHELP|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_SHAREAWARE;
	ofn.lpstrDefExt = "";
	ofn.lpfnHook = NULL;
	if(bSave)
	{
		if(::GetSaveFileName((LPOPENFILENAME)&ofn)==0)
		{
			return "";
		}
	}
	else
	{
		if(::GetOpenFileName((LPOPENFILENAME)&ofn)==0)
		{
			return "";
		}
	}

	int i=strlen(ofn.lpstrFile)-1;
	while(i>=0 && ofn.lpstrFile[i]!='\\')
	{
		i--;
	}
	strncpy(m_szInitDir,ofn.lpstrFile,i);
	return ofn.lpstrFile;
}
//-----------------------------------------------------------------------------------
//水平滚动条(编辑状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnHScrollBarMessageEdit(WPARAM wParam)
{
	switch(LOWORD(wParam))
	{
	case SB_LINEUP:
		m_xEditStart-=32;
		break;
	case SB_LINEDOWN:
		m_xEditStart+=32;
		break;
	case SB_PAGEUP:
		m_xEditStart-=640;
		break;
	case SB_PAGEDOWN:
		m_xEditStart+=640;
		break;
	default:
		break;
	}
	if((int)m_xEditStart<0)
		m_xEditStart=0;

	if(m_xEditStart>(s_dwNewMapWidth<<5)-640)
		m_xEditStart=(s_dwNewMapWidth<<5)-640;
	if(m_xEditStart % 32 !=0)
		m_xEditStart=(m_xEditStart>>5)<<5;//取整数倍

 	if(m_xEditStart>>5 !=(DWORD)::GetScrollPos(m_hWnd,SB_HORZ))
	{
		::SetScrollPos(m_hWnd,SB_HORZ,m_xEditStart>>5,true);
	}
	return true;
}
//-----------------------------------------------------------------------------------
//水平滚动条(选择图块状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnHScrollBarMessageSelectTile(WPARAM wParam)
{
	switch(LOWORD(wParam))
	{
	case SB_LINEUP:
		m_axSelectStart[m_dwCurrentSelectSurface]-=32;
		break;
	case SB_LINEDOWN:
		m_axSelectStart[m_dwCurrentSelectSurface]+=32;
		break;
	case SB_PAGEUP:
		m_axSelectStart[m_dwCurrentSelectSurface]-=640;
		break;
	case SB_PAGEDOWN:
		m_axSelectStart[m_dwCurrentSelectSurface]+=640;
		break;
	default:
		break;
	}
	if((int)m_axSelectStart[m_dwCurrentSelectSurface]<0)
		m_axSelectStart[m_dwCurrentSelectSurface]=0;
	if(m_axSelectStart[m_dwCurrentSelectSurface]>m_adwSurfaceWidth[m_dwCurrentSelectSurface]-640)
		m_axSelectStart[m_dwCurrentSelectSurface]=m_adwSurfaceWidth[m_dwCurrentSelectSurface]-640;
	if(m_axSelectStart[m_dwCurrentSelectSurface] % 32 !=0)
		m_axSelectStart[m_dwCurrentSelectSurface]=(m_axSelectStart[m_dwCurrentSelectSurface]>>5)<<5;//取32的整数倍

	if(m_axSelectStart[m_dwCurrentSelectSurface]>>5 !=(DWORD)::GetScrollPos(m_hWnd,SB_HORZ))
	{
		::SetScrollPos(m_hWnd,SB_HORZ,(DWORD)(m_axSelectStart[m_dwCurrentSelectSurface]>>5),true);
	}
	return true;
}
//-----------------------------------------------------------------------------------
//重新设置滚动条
//-----------------------------------------------------------------------------------
void CMapEditor::ResetScrollBarRange()
{
	if(!m_bWindowed)
		return;
	if(m_bIsEdit)
	{
		::SetScrollRange(m_hWnd,SB_VERT,0,s_dwNewMapHeight,false);
		::SetScrollRange(m_hWnd,SB_HORZ,0,s_dwNewMapWidth,false);
		::SetScrollPos(m_hWnd,SB_VERT,m_yEditStart>>5,true);
		::SetScrollPos(m_hWnd,SB_HORZ,m_xEditStart>>5,true);
	}
	else
	{
		::SetScrollRange(m_hWnd,SB_VERT,0,(m_adwSurfaceHeight[m_dwCurrentSelectSurface]-480)>>5,false);
		::SetScrollRange(m_hWnd,SB_HORZ,0,(m_adwSurfaceWidth[m_dwCurrentSelectSurface]-640)>>5,false);
		::SetScrollPos(m_hWnd,SB_VERT,m_aySelectStart[m_dwCurrentSelectSurface]>>5,true);
		::SetScrollPos(m_hWnd,SB_HORZ,m_axSelectStart[m_dwCurrentSelectSurface]>>5,true);
	}
}
//-----------------------------------------------------------------------------------
//水平滚动条
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnHScrollBarMessage(WPARAM wParam)
{
	if(m_bIsEdit)
		return OnHScrollBarMessageEdit(wParam);
	else
		return OnHScrollBarMessageSelectTile(wParam);
}
//-----------------------------------------------------------------------------------
//垂直滚动条(编辑状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnVScrollBarMessageEdit(WPARAM wParam)
{
	switch(LOWORD(wParam))
	{
	case SB_LINEUP:
		m_yEditStart-=32;
		break;
	case SB_LINEDOWN:
		m_yEditStart+=32;
		break;
	case SB_PAGEUP:
		m_yEditStart-=640;
		break;
	case SB_PAGEDOWN:
		m_yEditStart+=640;
		break;
	default:
		break;
	}
	if((int)m_yEditStart<0)
		m_yEditStart=0;
	if(m_yEditStart>(s_dwNewMapHeight<<5)-480)
		m_yEditStart=(s_dwNewMapHeight<<5)-480;
	if(m_yEditStart % 32 !=0)
		m_yEditStart=(m_yEditStart>>5)<<5;//取32的整数倍

	if(m_yEditStart>>5 !=(DWORD)::GetScrollPos(m_hWnd,SB_VERT))
	{
		::SetScrollPos(m_hWnd,SB_VERT,(DWORD)(m_yEditStart>>5),true);
	}
	return true;
}
//-----------------------------------------------------------------------------------
//垂直滚动条(选择图块状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnVScrollBarMessageSelectTile(WPARAM wParam)
{
	switch(LOWORD(wParam))
	{
	case SB_LINEUP:
		m_aySelectStart[m_dwCurrentSelectSurface]-=32;
		break;
	case SB_LINEDOWN:
		m_aySelectStart[m_dwCurrentSelectSurface]+=32;
		break;
	case SB_PAGEUP:
		m_aySelectStart[m_dwCurrentSelectSurface]-=480;
		break;
	case SB_PAGEDOWN:
		m_aySelectStart[m_dwCurrentSelectSurface]+=480;
		break;
	default:
		break;
	}
	if((int)m_aySelectStart[m_dwCurrentSelectSurface]<0)
		m_aySelectStart[m_dwCurrentSelectSurface]=0;
	if(m_aySelectStart[m_dwCurrentSelectSurface]>m_adwSurfaceHeight[m_dwCurrentSelectSurface]-480)
		m_aySelectStart[m_dwCurrentSelectSurface]=m_adwSurfaceHeight[m_dwCurrentSelectSurface]-480;
	if(m_aySelectStart[m_dwCurrentSelectSurface] % 32 !=0)
		m_aySelectStart[m_dwCurrentSelectSurface]=(m_aySelectStart[m_dwCurrentSelectSurface]>>5)<<5;//取32的整数倍

	if(m_aySelectStart[m_dwCurrentSelectSurface]>>5 !=(DWORD)::GetScrollPos(m_hWnd,SB_VERT))
	{
		::SetScrollPos(m_hWnd,SB_VERT,(DWORD)(m_aySelectStart[m_dwCurrentSelectSurface]>>5),true);
	}
	return true;
}
//-----------------------------------------------------------------------------------
//垂直滚动条
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnVScrollBarMessage(WPARAM wParam)
{
	if(m_bIsEdit)
		return OnVScrollBarMessageEdit(wParam);
	else
		return OnVScrollBarMessageSelectTile(wParam);
}
//-----------------------------------------------------------------------------------
//设置层次
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnSetLayer()
{

	POINT pt;
	RECT rect;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);

	float tileWidth=((float)(rect.right-rect.left))/20.0f;
	float tileHeight=((float)(rect.bottom-rect.top))/15.0f;

	if(!::PtInRect(&rect,pt))
	{
		return false;
	}
	 
	m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
	m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
	DWORD xTileStart=m_xEditStart>>5;
	DWORD yTileStart=m_yEditStart>>5;

	if(!m_pMap->m_ppTile)
		return false;
	
	s_dwTileLayer1=0xffffffff;
	s_dwTileLayer2=0xffffffff;
	int TempX=m_xdwCurrentEditTile+xTileStart;
	int TempY=m_ydwCurrentEditTile+yTileStart;
	if(m_pMap->m_ppTile[TempX][TempY].IDObj_1==255 && m_pMap->m_ppTile[TempX][TempY].IDObj_2==255)
	{
		MsgBox("这个格子没有任何数据!");
		return false;
	}
	s_dwTileLayer1=m_pMap->m_ppTile[TempX][TempY].Layer1;
 	s_dwTileLayer2=m_pMap->m_ppTile[TempX][TempY].Layer2;

	DialogBox(m_hInstance,
			  MAKEINTRESOURCE(IDD_GET_INT_VALUE),
			  m_hWnd,
			  (DLGPROC)DlgSetTileLayer);
	if(s_dwTileLayer1>15 || s_dwTileLayer2>15)
	{
		MsgBox("物体层次不得大于15!或小于0");
		return false;
	}
	if(m_pMap->m_ppTile[TempX][TempY].IDObj_1!=255
		&& m_pMap->m_ppTile[TempX][TempY].IDObj_2!=255
		&& s_dwTileLayer1>s_dwTileLayer2)
	{
		m_pMap->m_ppTile[TempX][TempY].Layer1=1;
		m_pMap->m_ppTile[TempX][TempY].Layer2=8;
		MsgBox("在有两层物体层的情况下,物体层1的层次不得大于物体层2!\n重新默认(第一层:1,第二层8)完毕");
		return false;
	}
	if(m_pMap->m_ppTile[TempX][TempY].IDObj_1!=255)
		m_pMap->m_ppTile[TempX][TempY].Layer1=s_dwTileLayer1;
	if(m_pMap->m_ppTile[TempX][TempY].IDObj_2!=255)
		m_pMap->m_ppTile[TempX][TempY].Layer2=s_dwTileLayer2;
	return true;
}
//-----------------------------------------------------------------------------------
//设置或取消障碍
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnSetBlock()
{
	POINT pt;
	RECT rect;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);

	float tileWidth=((float)(rect.right-rect.left))/20.0f;
	float tileHeight=((float)(rect.bottom-rect.top))/15.0f;

	if(!::PtInRect(&rect,pt))
	{
		return false;
	}
	 
	m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
	m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
	DWORD xTileStart=m_xEditStart>>5;
	DWORD yTileStart=m_yEditStart>>5;

	if(!m_pMap->m_ppTile)
		return false;

	m_pMap->m_ppTile[m_xdwCurrentEditTile+xTileStart][m_ydwCurrentEditTile+yTileStart].bCross=!m_pMap->m_ppTile[m_xdwCurrentEditTile+xTileStart][m_ydwCurrentEditTile+yTileStart].bCross;
	
	return true;
}
LRESULT CALLBACK CMapEditor::DlgEditMapID(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

⌨️ 快捷键说明

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