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

📄 scndlg.cpp

📁 RPG四大编辑器:场景/道具/角色/地图四大编辑器源代码 vc++ 6.0
💻 CPP
字号:
// SCNDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SCNGenerator.h"
#include "SCNDlg.h"

#include "AddExitDlg.h"
#include "AddRoleDlg.h"
#include "AddObjDlg.h"

#include "resource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSceneDlg dialog

CSceneDlg::CSceneDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSceneDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSceneDlg)
	m_MapFile = _T("");
	m_szName = _T("");
	m_dwWidth = 0;
	m_dwHeight = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CSceneDlg::~CSceneDlg()
{

}

void CSceneDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSceneDlg)
	DDX_Control(pDX, IDC_LISTROLE, m_RoleList);
	DDX_Control(pDX, IDC_LISTOBJ, m_ObjList);
	DDX_Control(pDX, IDC_LISTEXIT, m_ExitList);
	DDX_Text(pDX, IDC_EDIT_MAPFILE, m_MapFile);
	DDV_MaxChars(pDX, m_MapFile, 31);
	DDX_Text(pDX, IDC_EDIT_SCENENAME, m_szName);
	DDV_MaxChars(pDX, m_szName, 15);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_dwWidth);
	DDV_MinMaxDWord(pDX, m_dwWidth, 0, 999999);
	DDX_Text(pDX, IDC_EDIT_HEIGHT, m_dwHeight);
	DDV_MinMaxDWord(pDX, m_dwHeight, 0, 999999);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSceneDlg, CDialog)
	//{{AFX_MSG_MAP(CSceneDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_GENERATE, OnButtonGenerate)
	ON_BN_CLICKED(IDC_BUTTON_BRC, OnButtonBrowseMAP)
	ON_BN_CLICKED(IDC_BUTTONDE, OnButtonDelExit)
	ON_BN_CLICKED(IDC_BUTTONDO, OnButtonDelObj)
	ON_BN_CLICKED(IDC_BUTTONDR, OnButtonDelRole)
	ON_BN_CLICKED(IDC_BUTTONAE, OnButtonAddExit)
	ON_BN_CLICKED(IDC_BUTTONAO, OnButtonAddObj)
	ON_BN_CLICKED(IDC_BUTTONAR, OnButtonAddRole)
	ON_BN_CLICKED(IDC_BUTTON_LOAD, OnButtonLoad)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSceneDlg message handlers

BOOL CSceneDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSceneDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSceneDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//////////////////////////// 生成场景文档 ////////////////////////////
void CSceneDlg::OnButtonGenerate() 
{
	UpdateData(TRUE);

	CString DefaultName=(m_szName=="")?"未命名场景.SCN":(m_szName+".SCN");
	CFileDialog dlg(FALSE,"SCN",(LPCTSTR)DefaultName,
					OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
					"RPG场景文件(*.SCN)|*.SCN|所有文件(*.*)|*.*||",
					this);
	
	if(dlg.DoModal()==IDOK)
	{
		CFile cf;
		if(!cf.Open(dlg.GetPathName(),CFile::typeBinary|CFile::modeWrite|CFile::modeCreate))
			AfxMessageBox(dlg.GetPathName()+"写入失败!");
		
		//WRITE TO FILE
		SceneHeader SCNHeader={{'G','S','C','N'},0x0106};
		
		SCNHeader.Width = m_dwWidth;
		SCNHeader.Height = m_dwHeight;
		SCNHeader.HCells = m_dwWidth/16;
		SCNHeader.VCells = m_dwHeight/16;
		
		memset(SCNHeader.szName,0,16);
		memset(SCNHeader.szMapName,0,32);
		
		strncpy(SCNHeader.szName,m_szName,15);
		strncpy(SCNHeader.szMapName,m_MapFile,31);

		cf.Write(&SCNHeader,sizeof(SCNHeader));
		
		LONG Count;
		
		Count = m_ObjList.GetCount();
		cf.Write(&Count,4);
		for(int i=0;i<Count;i++)
		{
			OBJECT *pData=(OBJECT *)m_ObjList.GetItemDataPtr(i);
			ASSERT(pData);
			cf.Write(pData,sizeof(OBJECT));
		}

		Count = m_ExitList.GetCount();
		cf.Write(&Count,4);
		for(i=0;i<Count;i++)
		{
			EXIT *pData=(EXIT *)m_ExitList.GetItemDataPtr(i);
			ASSERT(pData);
			cf.Write(pData,sizeof(EXIT));
		}
		
		Count = m_RoleList.GetCount();
		cf.Write(&Count,4);
		for(i=0;i<Count;i++)
		{
			ROLE *pData=(ROLE *)m_RoleList.GetItemDataPtr(i);
			ASSERT(pData);
			cf.Write(pData,sizeof(ROLE));
		}
		
		cf.Close();
	}
}

//////////////////////////// 浏览MAP文件 /////////////////////////////
void CSceneDlg::OnButtonBrowseMAP() 
{
	UpdateData(TRUE);
	CFileDialog dlg(TRUE,"MAP","*.MAP",
					OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
					"RPG地图文件(*.MAP)|*.MAP|所有文件(*.*)|*.*||",
					this);

	if(dlg.DoModal()==IDOK)
	{
		m_MapFile = dlg.GetFileName();
		UpdateData(FALSE);
	}
}

void CSceneDlg::OnButtonDelExit() 
{
	UpdateData(TRUE);
	int idx=m_ExitList.GetCurSel();
	if(idx!=LB_ERR)
	{
		EXIT *pData = (EXIT *)m_ExitList.GetItemDataPtr(idx);
		m_ExitList.SetItemDataPtr(idx,NULL);
		delete pData;
		m_ExitList.DeleteString(idx);
	}
}

void CSceneDlg::OnButtonDelObj() 
{
	UpdateData(TRUE);
	int idx=m_ObjList.GetCurSel();
	if(idx!=LB_ERR)
	{
		OBJECT *pData = (OBJECT *)m_ObjList.GetItemDataPtr(idx);
		m_ObjList.SetItemDataPtr(idx,NULL);
		delete pData;
		m_ObjList.DeleteString(idx);
	}	
}

void CSceneDlg::OnButtonDelRole() 
{
	UpdateData(TRUE);
	int idx=m_RoleList.GetCurSel();
	if(idx!=LB_ERR)
	{
		ROLE *pData = (ROLE *)m_RoleList.GetItemDataPtr(idx);
		m_RoleList.SetItemDataPtr(idx,NULL);
		delete pData;
		m_RoleList.DeleteString(idx);
	}	
}

void CSceneDlg::OnButtonAddExit() 
{
	UpdateData(TRUE);
	
	CAddExitDlg dlg(this);
	
	dlg.m_CellW = m_dwWidth/16;
	dlg.m_CellH = m_dwHeight/16;
	
	if(dlg.DoModal()==IDOK)
	{
		EXIT *data=new EXIT;
		ASSERT(data);
		memset(data->SCNName,0,32);
		strncpy(data->SCNName,dlg.m_strFName,31);
		CString item;
		item.Format("%s\tFROM(%d,%d,%d,%d)\tTO(%d,%d)",
							data->SCNName,
							data->X1 = dlg.m_lX1,
							data->Y1 = dlg.m_lY1,
							data->X2 = dlg.m_lX2,
							data->Y2 = dlg.m_lY2,		
							data->TX = dlg.m_lX,
							data->TY = dlg.m_lY
							);
		int idx=m_ExitList.AddString(item);
		if(idx!=LB_ERR)
		{
			m_ExitList.SetItemDataPtr(idx,data);
		}
		else delete data;
	}
}

void CSceneDlg::OnButtonAddObj() 
{
	UpdateData(TRUE);

	CAddObjDlg dlg(this);

	dlg.m_W = m_dwWidth;
	dlg.m_H = m_dwHeight;
	
	if(dlg.DoModal()==IDOK)
	{
		OBJECT *data=new OBJECT;
		ASSERT(data);
		data->Enable = dlg.m_bEnable;

		CString item;
		item.Format("OBJIndex=%d\tAT(%d,%d)\t",
					data->Idx = dlg.m_uIDX,
					data->X = dlg.m_lX,
					data->Y = dlg.m_lY
					);

		item+=data->Enable?"ENABLED":"DISABLED";
		
		int idx=m_ObjList.AddString(item);
		if(idx!=LB_ERR)
		{
			m_ObjList.SetItemDataPtr(idx,data);
		}
		else delete data;
	}
}

void CSceneDlg::OnButtonAddRole() 
{
	UpdateData(TRUE);
	
	CAddRoleDlg dlg(this);
	
	dlg.m_W = m_dwWidth;
	dlg.m_H = m_dwHeight;
	
	if(dlg.DoModal()==IDOK)
	{
		ROLE *data=new ROLE;
		ASSERT(data);
		memset(data->ROLName,0,32);
		strncpy(data->ROLName,dlg.m_strFName,31);
		
		CString item;
		item.Format("%s\tAT(%d,%d)\tDIR=(%d)",
			data->ROLName,
			data->X = dlg.m_lX,
			data->Y = dlg.m_lY,
			data->Dir = dlg.m_iDir
			);

		int idx=m_RoleList.AddString(item);
		if(idx!=LB_ERR)
		{
			m_RoleList.SetItemDataPtr(idx,data);
		}
		else delete data;
	}
}

void CSceneDlg::OnOK() 
{
	UpdateData(TRUE);
	
	for(int i=0;i<m_RoleList.GetCount();i++)
	{
		ROLE *pData=(ROLE *)m_RoleList.GetItemDataPtr(i);
		if(pData)	delete pData;
	}
	for(i=0;i<m_ExitList.GetCount();i++)
	{
		EXIT *pData=(EXIT *)m_ExitList.GetItemDataPtr(i);
		if(pData)	delete pData;
	}
	for(i=0;i<m_ObjList.GetCount();i++)
	{
		OBJECT *pData=(OBJECT *)m_ObjList.GetItemDataPtr(i);
		if(pData)	delete pData;
	}
	
	CDialog::OnOK();
}

void CSceneDlg::OnButtonLoad() 
{
	
}

⌨️ 快捷键说明

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