?? 地圖編輯器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 + -