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

📄 cmapeditor.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(m_bShowGround)
		::CheckMenuItem(m_hMenuMain,IDM_SHOW_GROUND,MF_CHECKED);
	else
		::CheckMenuItem(m_hMenuMain,IDM_SHOW_GROUND,MF_UNCHECKED);
}
//-----------------------------------------------------------------------------------
//鼠标移动的消息(编辑状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseMoveEdit()
{
	POINT pt;
	::GetCursorPos(&pt);
	if(pt.x<3)
		this->m_xEditStart-=32;
	else if(pt.x>637)
		this->m_xEditStart+=32;
	
	if(pt.y<3)
		this->m_yEditStart-=32;
	else if(pt.y>=477)
		this->m_yEditStart+=32;

	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;//取32的整数倍

	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的整数倍

	return true;
}
//-----------------------------------------------------------------------------------
//鼠标移动的消息(选择图块状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseMoveSelectTile()
{
	POINT pt;
	::GetCursorPos(&pt);
	if(pt.x<3)
		m_axSelectStart[m_dwCurrentSelectSurface]-=32;
	else if(pt.x>637)
		m_axSelectStart[m_dwCurrentSelectSurface]+=32;
	
	if(pt.y<3)
		m_aySelectStart[m_dwCurrentSelectSurface]-=32;
	else if(pt.y>=477)
		m_aySelectStart[m_dwCurrentSelectSurface]+=32;

	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((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的整数倍

	return true;
}
//-----------------------------------------------------------------------------------
//鼠标移动的消息
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseMove()
{
	if(m_bWindowed)
		return true;
	if(m_bIsEdit)
		return OnMouseMoveEdit();
	else
		return OnMouseMoveSelectTile();
}
BOOL CMapEditor::OnDel()
{
	if(!m_pMap->m_ppTile)
	{
		MsgBox("目前还没有创建地图,请先创建!");
		return false;
	}
	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_xdwCurrentSelectTile=0xffffffff; 
	m_ydwCurrentSelectTile=0xffffffff;
	
	if(!m_bIsEdit)
		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;
	
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].IDObj_1=255;
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer1=1;
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].IDObj_2=255;
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer2=8;
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].flag=0;
	m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].flagdata=0;
	return true;
}
//-----------------------------------------------------------------------------------
//鼠标左键按下的消息(编辑状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseLButtonDownEdit()
{
	if(!m_pMap->m_ppTile)
	{
		MsgBox("目前还没有创建地图,请先创建!");
		return false;
	}
	
	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;
	}
	if(m_xdwCurrentSelectTile==0xffffffff || m_ydwCurrentSelectTile==0xffffffff)
		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_dwCurrentEditLayer==LOA_MAP_LAYER_GROUND)
	{
		if(m_dwCurrentSelectSurface==10)
		{
			MsgBox("不能用动态图块填充地表!");
			return false;
		}
		m_pSurfGround->Clear();

		m_pMap->m_head.groundID=m_dwCurrentSelectSurface;
		m_pMap->m_head.xGround=m_xdwCurrentSelectTile;
		m_pMap->m_head.yGround=m_ydwCurrentSelectTile;
		
		RECT rect;

		::SetRect(&rect,m_xdwCurrentSelectTile<<5,
						m_ydwCurrentSelectTile<<5,
						(m_xdwCurrentSelectTile+1)<<5,
						(m_ydwCurrentSelectTile+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;
	}
	else if(m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_1)
	{
		if(m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer1 
			> m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer2)
		{
			MsgBox("目前第一层的物体层次大于第二层的,不能填充,请先设置正确的层次!");
			return false;
		}
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].IDObj_1=m_dwCurrentSelectSurface;
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].xObj_1=m_xdwCurrentSelectTile;
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].yObj_1=m_ydwCurrentSelectTile;
		
	}
	else if(m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_2)
	{
		if(m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer1 
			> m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].Layer2)
		{
			MsgBox("目前第一层的物体层次大于第二层的,不能填充,请先设置正确的层次!");
			return false;
		}
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].IDObj_2=m_dwCurrentSelectSurface;
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].xObj_2=m_xdwCurrentSelectTile;
		m_pMap->m_ppTile[xTileStart+m_xdwCurrentEditTile][yTileStart+m_ydwCurrentEditTile].yObj_2=m_ydwCurrentSelectTile;
	}
	
	return true;
}
//-----------------------------------------------------------------------------------
//鼠标左键按下的消息(选择图块状态)
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseLButtonDownSelectTile()
{
	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_xdwCurrentSelectTile=(DWORD)(((float)(pt.x))/tileWidth)+(m_axSelectStart[m_dwCurrentSelectSurface]>>5);
	m_ydwCurrentSelectTile=(DWORD)(((float)(pt.y))/tileHeight)+(m_aySelectStart[m_dwCurrentSelectSurface]>>5);

	if(m_dwCurrentEditLayer==LOA_MAP_LAYER_GROUND)
		SendMessage(m_hWnd,WM_COMMAND,IDM_EDIT_GROUND,0);
	else if(m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_1)
		SendMessage(m_hWnd,WM_COMMAND,IDM_EDIT_OBJ_1,0);
	else if(m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_2)
		SendMessage(m_hWnd,WM_COMMAND,IDM_EDIT_OBJ_2,0);
	return true;
}
//-----------------------------------------------------------------------------------
//鼠标左键按下的消息
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseLButtonDown()
{
	if(m_bIsEdit)
		return OnMouseLButtonDownEdit();
	else
		return OnMouseLButtonDownSelectTile();
}
//-----------------------------------------------------------------------------------
//鼠标右键的消息
//-----------------------------------------------------------------------------------
BOOL CMapEditor::OnMouseRButtonDown()
{

	HMENU hmMain=::CreatePopupMenu();
	HMENU hmsub;
	char *ppszMenu[]={"文件","编辑","设置","显示","帮助"};
	for(int i=0;i<5;i++)
	{
		hmsub=::GetSubMenu(m_hMenuMain,i);
		::AppendMenu(hmMain,MF_POPUP|MF_STRING,(UINT)hmsub,ppszMenu[i]);
	}
	RECT rect;
	POINT pt;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);
	if(::PtInRect(&rect,pt))
	{
		::ClientToScreen(m_hWnd,&pt);
		if(m_bIsEdit)
		{
			::EnableMenuItem(m_hMenuMain,IDM_SET_BLOCK,MF_ENABLED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_LAYER,MF_ENABLED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_CHANGE_MAP,MF_ENABLED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_SCRIPT,MF_ENABLED);
		}
		else
		{
			::EnableMenuItem(m_hMenuMain,IDM_SET_BLOCK,MF_GRAYED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_LAYER,MF_GRAYED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_CHANGE_MAP,MF_GRAYED);
			::EnableMenuItem(m_hMenuMain,IDM_SET_SCRIPT,MF_GRAYED);
		}
		TrackPopupMenu(hmMain,TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,0,m_hWnd,NULL);
	}
	
	::DeleteMenu(hmMain,0,0);
	return true;
}
//-----------------------------------------------------------------------------------
//创建显示模式
//-----------------------------------------------------------------------------------
BOOL CMapEditor::CreateDisplayMode(BOOL bWindowed)
{
	if(bWindowed)
	{
		if(FAILED(m_pDisplay->CreateWindowedDisplay(m_hWnd,640,480,WS_OVERLAPPED | WS_CAPTION| WS_MINIMIZEBOX)))
 			return false;
		else
			return true;
	}
	else
	{
 		if(FAILED(m_pDisplay->CreateFullScreenDisplay(m_hWnd,640,480,16)))
			return false;
		else
			return true;
	}
}
//-----------------------------------------------------------------------------------
//初始化窗口,和DirectX库
//-----------------------------------------------------------------------------------
BOOL CMapEditor::InitDxlib(HINSTANCE hInstance)
{
	 
	if(::MessageBox(NULL,"\t要在全屏幕的环境下编辑么?\n\n"
						 "注意!!如果在窗口下编辑,请将颜色深度调为16位显示,\n"
						 "否则本程序不能正常运行!","LoaMapEditor",MB_YESNO)==IDYES)
	 
		m_bWindowed=false;
	
	 
	else
		m_bWindowed=true;
	 
	m_hInstance=hInstance;
	WNDCLASS wc;
	ZeroMemory(&wc,sizeof(wc));
    wc.style=0;
    wc.lpfnWndProc=WinProc;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hInstance=hInstance;
    wc.hIcon=::LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
	if(m_bWindowed)
	    wc.hCursor=NULL;
	else
		wc.hCursor=::LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR));
    wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

	wc.lpszMenuName=NULL;

	wc.lpszClassName="LOAMAPEDITOR";
    RegisterClass(&wc);

	m_hMenuMain=::LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MAIN));

	DWORD dwStyle;
	HMENU hmTemp;
	if(m_bWindowed)
	{
		dwStyle=WS_OVERLAPPED|WS_VSCROLL|WS_HSCROLL;
		hmTemp=m_hMenuMain;
	}
	else
	{
		hmTemp=NULL;
		dwStyle=WS_POPUP;
	}
	

    m_hWnd=CreateWindow("LOAMAPEDITOR","LOAMAPEDITOR",dwStyle,
		(::GetSystemMetrics(SM_CXSCREEN)-640)/2,
		(::GetSystemMetrics(SM_CYSCREEN)-480)/2,
		640,
		480,
		NULL,
		hmTemp,
		hInstance,
		NULL);
    if(!m_hWnd)		
	{
		m_pLog->WriteMessage("Create Window Failed!\n");
		return false;
	}

	m_pLog->WriteMessage("Create Window...OK!\n");
    
	SetCheckedMenu();
	
	ShowWindow(m_hWnd,SW_SHOW);
    UpdateWindow(m_hWnd);

	m_pDisplay=new CDisplay();
	if(!m_pDisplay)
	{
		m_pLog->WriteMessage("New CDisplay Failed! Out of Memory!\n");
		return false;
	}

	
	if(!CreateDisplayMode(m_bWindowed))
	{
		m_pLog->WriteMessage("Create DisplayMode Failed!\n");
		return false;
	}

	DDPIXELFORMAT ddpf;
	ZeroMemory(&ddpf,sizeof(ddpf));
	ddpf.dwSize=sizeof(ddpf);
	if(SUCCEEDED(m_pDisplay->GetFrontBuffer()->GetPixelFormat(&ddpf)))
	{
		if(ddpf.dwRGBBitCount!=16)
		{
			MessageBox(m_hWnd,"警告!您的桌面当前不是16位色!本程序无法运行!\n"
				"请在 桌面上-〉右键-〉属性-〉设置-〉颜色质量 中更改!\n"
				"然后重新运行本程序\0","错误",MB_OK);
			m_pLog->WriteMessage("当前桌面显示深度不是16位!程序不能在窗口模式下运行\n请在 桌面上-〉右键-〉属性-〉设置-〉颜色质量 中更改!然后重新运行本程序");
			return false;
		}
	}
	m_pLog->WriteMessage("Create DisplayMode...OK!\n");

	return true;	
}
//-----------------------------------------------------------------------------------
//设置表面数据
//-----------------------------------------------------------------------------------
void CMapEditor::SetSurfaceValue()
{
	m_adwSurfaceWidth[0]=640;
	m_adwSurfaceWidth[1]=640;
	m_adwSurfaceWidth[2]=640;
	m_adwSurfaceWidth[3]=640;
	m_adwSurfaceWidth[4]=640;
	m_adwSurfaceWidth[5]=640;
	m_adwSurfaceWidth[6]=640;
	m_adwSurfaceWidth[7]=640;
	m_adwSurfaceWidth[8]=640;
	m_adwSurfaceWidth[9]=640;
	m_adwSurfaceWidth[10]=640;							//AniTileSurface

	m_adwSurfaceHeight[0]=480;
	m_adwSurfaceHeight[1]=640;
	m_adwSurfaceHeight[2]=960;
	m_adwSurfaceHeight[3]=640;
	m_adwSurfaceHeight[4]=640;
	m_adwSurfaceHeight[5]=480;
	m_adwSurfaceHeight[6]=576;
	m_adwSurfaceHeight[7]=800;
	m_adwSurfaceHeight[8]=640;

⌨️ 快捷键说明

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