📄 地图编辑器dlg.cpp
字号:
// 地图编辑器Dlg.cpp : implementation file
/*********************************
[学VC编游戏]
编著、程序设计:唐明理 2004.7
E-mail: cqtml@163.com
**********************************/
#include "stdafx.h"
#include "地图编辑器.h"
#include "地图编辑器Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CString new_scr0;//选择地图大小
extern int new_js; //选择角色
extern CString new_map; //选择地面
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_SCROLLBAR1, m_hscroll);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
ON_WM_HSCROLL()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_WM_RBUTTONDOWN()
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
MoveWindow(0,0,SCRWI,SCRHE); //窗口定位
CenterWindow(); //居中窗口
//---------------------------------------------------------------
m_game.initedit(); //初始化类
m_game.loaddata(); //调资源包............................
fidtim=0; //寻路时间
down=0;dowx=0;dowy=0; //左键按键清0
//编辑用----------------------------------------------------------
no=-1; //物品区选择清0
dorj=0; //1动物或0景物
m_game.edi=0;
//................................................
int sw=m_game.mapw,sh=m_game.maph;
SetDlgItemText(IDC_STATIC8,m_game.dir);
GetDlgItem(IDC_STATIC0)->MoveWindow(0,8,WIDTH+4,HEIGHT+4,TRUE); //显示框
GetDlgItem(IDC_STATIC1)->MoveWindow(WIDTH+6-2,8,sw+4,sh+4,TRUE); //小地图框
GetDlgItem(IDC_STATIC6)->MoveWindow(WIDTH+6,sh+15,sw,30,TRUE); //标志
GetDlgItem(IDC_STATIC3)->MoveWindow(2,SCRHE-26,280,18,TRUE); //提示
GetDlgItem(IDC_STATIC4)->MoveWindow(2+280,SCRHE-26,280,18,TRUE); //时间
GetDlgItem(IDC_STATIC5)->MoveWindow(2+280*2,SCRHE-26,250,18,TRUE); //坐标
//编辑用----------------------------------------------------------
GetDlgItem(IDOK) ->MoveWindow(WIDTH+6,sh+50,sw,20,TRUE); //编辑、测试
GetDlgItem(IDC_BUTTON3)->MoveWindow(WIDTH+6,sh+75,sw,20,TRUE); //保存
GetDlgItem(IDC_BUTTON1)->MoveWindow(WIDTH+6,sh+100,sw,20,TRUE); //新建地图
GetDlgItem(IDC_BUTTON4)->MoveWindow(WIDTH+65,SCRHE-104, 80,25,TRUE);//景物
GetDlgItem(IDC_BUTTON5)->MoveWindow(WIDTH+65,SCRHE-104+28,80,25,TRUE);//动物
GetDlgItem(IDC_STATIC2)->MoveWindow(0,SCRHE-104,WIDTH+4,70,TRUE); //选择框
GetDlgItem(IDC_SCROLLBAR1)->MoveWindow(2,SCRHE-52,WIDTH,16,TRUE); //滚动条
GetDlgItem(IDC_STATIC7)->MoveWindow(WIDTH+6, SCRHE-104,55,54,TRUE); //被选物框
GetDlgItem(IDC_STATIC8)->MoveWindow(WIDTH+6,sh+157,sw,sh,TRUE); //提示信息1
GetDlgItem(IDC_STATIC9)->MoveWindow(WIDTH+6,2*sh+162,sw,sh,TRUE); //提示信息2
GetDlgItem(IDC_SCROLLBAR1)->EnableWindow(FALSE);//滚动条
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); //新建地图
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); //保存
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); //景物
GetDlgItem(IDC_BUTTON5)->EnableWindow(FALSE); //动物
m_hscroll.SetScrollRange(0,85); //纵向范围
m_hscroll.SetScrollPos(m_game.tml); //纵向初始点
//编辑用----------------------------------------------------------
//在状态栏隐藏对话框==============================
DWORD dwExStyle=GetExStyle();
dwExStyle =(~WS_EX_APPWINDOW & dwExStyle) | WS_EX_TOOLWINDOW;
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,dwExStyle);
//================================================
srand((unsigned)time(NULL)); //随机数种子
SetTimer(3,100,NULL); //启动延时
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::OnPaint()
{ CDialog::OnPaint();
}
HCURSOR CMyDlg::OnQueryDragIcon()
{ return (HCURSOR) m_hIcon;
}
void CMyDlg::OnCancel()//退出,[类向导中定义生成]
{ KillTimer(1);KillTimer(2);
if( ::MessageBox(GetSafeHwnd(), "退出程序吗?","请您确定!",
MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 ) == IDYES )
{m_game.exitedit(); //退出类
CDialog::OnCancel();
}
else {SetTimer(1,TIMER,NULL);SetTimer(2,TIMER*2,NULL);}
}
void CMyDlg::OnTimer(UINT nIDEvent) //时钟函数,[类向导中定义生成]
{ if(nIDEvent==1)//动画刷屏
{tim=timeGetTime(); //开始时间
CClientDC dc(this);
int i;
m_game.mlmap(); //地图块移动拼接
for(i=0;i<m_game.rs;i++)
m_game.Alphasetobj(i,0); //对象显示
for(i=0;i<m_game.rs;i++)
{m_game.Alphasetobj(i,1); //对象显示
m_game.lookit(i); //角色碰撞
}
/* for(i=0;i<m_game.rs;i++)
{m_game.setobj(i); //对象显示
m_game.lookit(i); //角色碰撞
}*/
if(m_game.edi==1) m_game.showline();//显示编辑方格
if(m_game.rs>1) m_game.smlmap(dc.m_hDC); //显示小地图
BitBlt(dc.m_hDC,2,10,WIDTH,HEIGHT,m_game.BkDC1,0,0,SRCCOPY);//用Bk1刷新窗口
tim=timeGetTime()-tim; //显示时间=结束时间-开始时间
}
//----------------------------------------------------------------------------
if(nIDEvent==2)//显示信息
{char cc[255],c1[255];
int q=m_game.mann;
sprintf(cc,"地图[X:%4d Y:%4d] 人[x:%4d y:%4d]",
m_game.scrx,m_game.scry,m_game.man[q].xix,m_game.man[q].xiy);
SetDlgItemText(IDC_STATIC5, cc);
sprintf(cc,"[显示区对象数:%3d] [%3dms/屏] [CPU占用%3d%]",m_game.mans,tim,tim*100/TIMER);
SetDlgItemText(IDC_STATIC4, cc);
switch(fidtim)
{case -1: {strcpy(c1,"障碍点"); break;}
case -2: {strcpy(c1,"起始点"); break;}
case -3: {strcpy(c1,"无路"); break;}
case -4: {strcpy(c1,"搜索忙"); break;}
case -5: {strcpy(c1,"太远了"); break;}
case -10: {strcpy(c1,"左上边界"); break;}
case -20: {strcpy(c1,"右下边界"); break;}
default: {sprintf(c1,"搜索时间:%dms",fidtim);}
}
sprintf(cc,"地图%dX%d 障碍%dX%d %s,%d",
WIDTH*m_game.SCRP0,HEIGHT*m_game.SCRP0,
WIDTH*m_game.SCRP0/GX,HEIGHT*m_game.SCRP0/GY,c1,m_game.man[q].pk);
SetDlgItemText(IDC_STATIC3, cc);
m_game.randxy();//随机产生兽的移动目标
int r=0,s=0,j=0,k=0;
for(int i=0;i<m_game.rs;i++)
{if(m_game.man[i].lb==0) r++;
if(m_game.man[i].lb==1) s++;
if(m_game.man[i].lb==2) j++;
if(m_game.man[i].zd==1) k++;
}
sprintf(cc,"对象数[%d]\r\n人[%d]\r\n兽[%d]\r\n景[%d]\r\n",m_game.rs,r,s,j);
if(k<1) k=1;
if(k>1) sprintf(c1,"%s\r\n有 %d 只动物向你进攻",cc,k-1);
else strcpy(c1,cc);
SetDlgItemText(IDC_STATIC9, c1);
if(MCIWndGetPosition(hMCI) >=MCIWndGetLength(hMCI)) MCIWndPlay(hMCI);
}
if(nIDEvent==3)//启动延时
{KillTimer(3);
//调入文件对话框------------------------------------------------------
CString name;
CString filt="dat (*.dat)|*.dat";
CFileDialog fileDlg(TRUE,"*.dat","*.dat",NULL,filt,this);
fileDlg.m_ofn.Flags|=OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle="调入地图文件";
if(fileDlg.DoModal()!=IDOK) goto aa;
name=fileDlg.GetPathName();
//--------------------------------------------------------------------
m_game.loadmap(name); //调入地图
m_game.loadza (name); //调入障碍表
m_game.getsmap(); //生成小地图
filt=fileDlg.GetFileName();
name=fileDlg.GetPathName();
name=name.Left(lstrlen(name)-lstrlen(filt));
char cc[255];
sprintf(cc,"%sMusic1.mid",name);
hMCI = MCIWndCreate(NULL, NULL,WS_POPUP|WS_VISIBLE|
MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU,
cc);
if(hMCI!=NULL) MCIWndPlay(hMCI);
/////////////////////////////////////////////////////////////
SetTimer(1,TIMER,NULL); //设定屏幕刷新TIMER毫秒
SetTimer(2,TIMER*2,NULL); //信息显示周期为1秒
/////////////////////////////////////////////////////////////
}
aa: CDialog::OnTimer(nIDEvent);
}
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{ CRect lpRect0;
GetWindowRect(&lpRect0);
int x0=pMsg->pt.x-lpRect0.left;
int y0=pMsg->pt.y-lpRect0.top;
if(m_game.edi==1)//是编辑状态
{ if(pMsg->message==WM_KEYDOWN)
{ int key=pMsg->wParam;
if(key==46) m_game.Delete(); //按DEL键,删除对象
}
if(pMsg->message==WM_LBUTTONDBLCLK) //双击左键
{m_game.Insert(no,dorj);} //插入对象
}
// CClientDC dc(this);
if(m_game.rs>0) //数据调入后
{m_game.movesmap(x0,y0); //移动地图
// m_game.smlmap(dc.m_hDC); //显示小地图
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)//按左键[类向导中定义生成]
{ int x=point.x,y=point.y;
if(y<10)//拖动窗口
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
CClientDC dc(this);
fidtim=m_game.leftdown(dc.m_hDC,x,y);//按左键
SetCursor(m_Cur); //显示光标
//编辑地图用///////////////////////////////////////////////////////
if(m_game.edi==1)
{CString cc;
down=1;
dowx=x;dowy=y;
if(x>2&&x<WIDTH&&y>HEIGHT+18&&y<HEIGHT+18+50)//在对象添加选择框
{no=(x-2)/50+m_game.tml;
m_game.getobj(dc.m_hDC,no);
SetDlgItemText(IDC_STATIC8,"提示:\r\n双击选择框的对象,可以加入对象到当前显示区。");
}
else
{m_game.getno(x,y);//选择对象
SetDlgItemText(IDC_STATIC8,"提示:\r\n可以移动选中的对象,或按DEL键删除它。");
}
return;
}
CDialog::OnLButtonDown(nFlags, point);
}
//地图编辑用//////////////////////////////////////////////////////////////////////////
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)//地图编辑用
{ down=dowx=dowy=0;
SetCursor(m_Cur);
CDialog::OnLButtonUp(nFlags, point);
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)//地图编辑用
{ int x=point.x-2-dowx;
int y=point.y-10-dowy;
int x0=(x+m_game.scrx)/GX,y0=(y+m_game.scry)/GY;
CMyApp* pApp = (CMyApp*)AfxGetApp();
if(x>0&&x<WIDTH&&y>0&&y<HEIGHT)
{if(m_game.m_fid.map[x0][y0]=='1'|| //目标点是障碍点
(x0<1||y0<1)|| //左上边界
((x0+1)>=WIDTH*m_game.SCRP0/GX||(y0+1)>=HEIGHT*m_game.SCRP0/GY) //右下边界
)
m_Cur=pApp->m_Cur3; //禁
else m_Cur=pApp->m_Cur1; //许
}
else m_Cur=pApp->m_Cur0; //普通光标
SetCursor(m_Cur);
//对象编辑移动---------------------------------------------------
if(m_game.gno<0||down==0||m_game.edi==0) return;
for(int i=0;i<m_game.rs;i++)
{if(m_game.man[i].jisu==m_game.gno) //对象编辑移动
{m_game.man[i].x0=m_game.man[i].xix=m_game.x1+x;
m_game.man[i].y0=m_game.man[i].xiy=m_game.y1+y;
return;
}
}
//对象编辑移动---------------------------------------------------
CDialog::OnMouseMove(nFlags, point);
}
void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)//地图编辑用
{ int tml=m_hscroll.GetScrollPos(); //取得滚动条当前位置
switch (nSBCode)
{case SB_LINEUP: tml-=1; break; //按上键
case SB_LINEDOWN: tml+=1; break; //按下键
case SB_PAGEUP: tml-=10; break; //上页
case SB_PAGEDOWN: tml+=10; break; //下页
case SB_THUMBTRACK:tml=nPos;break; //拖滑块
default:break;
}
m_game.tml=tml;
m_hscroll.SetScrollPos(tml); //设置滚动条新位置
CClientDC dc(this);
m_game.getwp(dc.m_hDC,dorj); //显示选择对象
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMyDlg::OnOK()//地图编辑用
{ CClientDC dc(this);
if(m_game.edi==0) //如果是测试转编辑
{m_game.edi=1;
m_game.getwp(dc.m_hDC,dorj);//显示选择对象
GetDlgItem(IDC_SCROLLBAR1)->EnableWindow(TRUE);//滚动条
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); //新建地图
GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);//存
GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE);//景物
GetDlgItem(IDC_BUTTON5)->EnableWindow(TRUE);//动物
SetDlgItemText(IDOK, "测试");
}
else //如果是编辑转测试
{m_game.edi=0;
m_game.getwp(dc.m_hDC,dorj);//显示选择对象
GetDlgItem(IDC_SCROLLBAR1)->EnableWindow(FALSE);//滚动条
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); //新建地图
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);//存
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);//景物
GetDlgItem(IDC_BUTTON5)->EnableWindow(FALSE);//动物
SetDlgItemText(IDOK, "编辑地图");
m_game.gno=-1;//对象选择重置
no=-1;
}
}
void CMyDlg::OnRButtonDown(UINT nFlags, CPoint point) //地图编辑用,右键
{//编辑障碍区
if(m_game.edi==0) return;//
int x0=(m_game.scrx+point.x)/GX;
int y0=(m_game.scry+point.y)/GY;
if(m_game.m_fid.map[x0][y0]=='0') m_game.m_fid.map[x0][y0]='1';
else m_game.m_fid.map[x0][y0]='0';
CDialog::OnRButtonDown(nFlags, point);
}
void CMyDlg::OnButton1() //新建地图
{ KillTimer(1);KillTimer(2);
newmap Dlg;Dlg.DoModal(); //显示新建地图对话框
SetTimer(1,TIMER,NULL);SetTimer(2,TIMER*2,NULL);
if(new_scr0=="") return; //新建地图时取消
m_game.SCRP0=atoi(new_scr0);//地图大小
m_game.man[0].js=new_js; //游戏主角
m_game.mapbak=new_map; //背景地图
m_game.newmap(); //新建地图初始化
CClientDC dc(this);
m_game.getwp(dc.m_hDC,dorj);//显示选择对象
}
void CMyDlg::OnButton3() //地图编辑用,保存地图
{ m_game.getsmap(); //生成小地图
//存文件对话框----------------------------------------------
CString filt="dat (*.dat)|*.dat";
CFileDialog fileDlg(FALSE,"*.dat","*.dat",NULL,filt,this);
fileDlg.m_ofn.Flags|=OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle="存入地图文件";
if (fileDlg.DoModal()!=IDOK) return;
CString na=fileDlg.GetPathName();
//----------------------------------------------------------
m_game.savemap(na);//保存地图
}
void CMyDlg::OnButton4()//景物
{ dorj=0; //1动物或0景物
CClientDC dc(this);
m_game.getwp(dc.m_hDC,dorj);//显示选择对象
GetDlgItem(IDC_SCROLLBAR1)->EnableWindow(TRUE);//滚动条
}
void CMyDlg::OnButton5()//动物
{ dorj=1; //1动物或0景物
CClientDC dc(this);
m_game.getwp(dc.m_hDC,dorj);//显示选择对象
GetDlgItem(IDC_SCROLLBAR1)->EnableWindow(FALSE);//滚动条
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -