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

📄 地图编辑器dlg.cpp

📁 学游戏不错的实例教程
💻 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 + -