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