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

📄 gamelayouter.cpp

📁 游戏框架
💻 CPP
字号:
// ***************************************************************
//  GameLayouter   version:  1.0
//  -------------------------------------------------------------
//	File Name:	GameLayouter.cpp
//	Created:	2007/07/18
//	Modified:	2007/07/18   17:47
//	Author:		William.Liang
//  Msn:		lwq49@msn.com
//  Email:		lwq49@21cn.com, lwq49@msn.com
//	Description:
//
//	Purpose:	
//  -------------------------------------------------------------
//  license:
//
//  The contents of this file are subject to the Mozilla Public
//  License Version 1.1 (the "License"); you may not use this file
//  except in compliance with the License. You may obtain a copy
//  of the License at http://www.mozilla.org/MPL/ Software dis-
//  tributed under the License is distributed on an "AS IS" 
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or im-
//  plied. See the License for the specific language governing
//  rights and limitations under the License.
//
//  The Initial Developer of the Original Code is William.Liang .
//  Copyright (C) 2007 - All Rights Reserved.
// ***************************************************************
#include "StdAfx.h"
#include ".\gamelayouter.h"

//************************************
// <p>Description: 构造函数</p>
// <p>Parameters:  </p>
// <p>    LPFRAMEMANAGERHANDLE lpFMH</p>
//
// <p>Returns:   </p>
//************************************
CGameLayouter::CGameLayouter(LPFRAMEMANAGERHANDLE lpFMH)
{
	m_lpFMHandles	= lpFMH;
	m_bIsAsync		= false;

	//m_pCurrentSection	= NULL;
	//m_pCurrentView	= NULL;
	//m_pCurrentScene	= NULL;
	//m_pCurrentLayer	= NULL;
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CGameLayouter::~CGameLayouter(void)
{
}

//************************************
// <p>Description: 加载布局</p>
// <p>Parameters:  </p>
// <p>    _CString szFileName</p>
// <p>    _CString szRoot</p>
// <p>    bool bIsAsync</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayouter::LoadLayout(_CString szFileName, _CString szRoot, bool bIsAsync){
	//清空上一次的栈
	m_lstNodeStack.RemoveAll();
	m_bIsAsync	= bIsAsync;
	//m_pCurrentSection	= NULL;
	//m_pCurrentView	= NULL;
	//m_pCurrentScene	= NULL;
	//m_pCurrentLayer	= NULL;

	//加载XML分析器
	if(m_XmlParser.LoadXmlFromFile(szFileName)){
		m_XmlParser.SetLayouterSink(GET_OBJECTPTR_INTERFACE(this, IGameLayouterSink));
		return true;
	}

	return false;
}

//************************************
// <p>Description: 是否异步</p>
// <p>Parameters:  </p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayouter::IsAsynchronous(){
	return m_bIsAsync;
}

//************************************
// <p>Description: 下一结点</p>
// <p>Parameters:  </p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayouter::NextNode(){
	m_XmlParser.Parse();

	return true;
}

//************************************
// <p>Description: 返回结点</p>
// <p>Parameters:  </p>
// <p>    _CString szPath</p>
// <p>    bool bBackwards</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool CGameLayouter::GetNodePath(_CString szPath, LPVOID* lpParam, bool bBackwards){
	if(szPath.IsNull() || szPath=="") return false;
	INT_PTR		nDepth = m_lstNodeStack.GetCount();
	if(nDepth==0) return false;

	_CString		szTemp = (LPCTSTR)szPath;
	_CString		szNodeName;
	INT_PTR		nPos = szTemp.GetLength()-1;

	while(nPos>=0){
		if(*szTemp[nPos]=='.'){
			szNodeName = m_lstNodeStack.GetKey(nDepth--);
			//判断结点名
			if(!(szNodeName == szTemp[nPos+1]))
				return false;

			//结点栈到顶
			if(nDepth==0) return false;

			//将当前字符置空
			*szTemp[nPos] = 0;
		}
		nPos--;
	}

	//判断结点名
	szNodeName = m_lstNodeStack.GetKey(nDepth--);
	if(!(szNodeName == szTemp[nPos+1]))
		return false;

	//返回结点对应的值
	if(lpParam != NULL)
		*lpParam = m_lstNodeStack.Get(nDepth+1);

	return true;
}

//************************************
// <p>Description: 校验路径</p>
// <p>Parameters:  </p>
// <p>    _CString szPath</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayouter::ValidNodePath(_CString szPath){
	return GetNodePath(szPath)!=NULL;
}

//************************************
// <p>Description: 注册回调处理器</p>
// <p>Parameters:  </p>
// <p>    IGameLayouterSink * pIGameLayouterSink</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayouter::RegisterLayouterSink(IGameLayouterSink* pIGameLayouterSink){
	m_lstLayouterSinks.Push(pIGameLayouterSink, 0);
	pIGameLayouterSink->SetGameLayouter(GET_OBJECTPTR_INTERFACE(this, IGameLayouter), m_lpFMHandles);

	return true;
}

//************************************
// <p>Description: 回调处理方法</p>
// <p>Parameters:  </p>
// <p>    _CString szNodeName</p>
// <p>    _CString szParentName</p>
// <p>    LPVOID lpParam</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayouter::Processer(_CString szNodeName, _CString szParentName, LPVOID lpParam){
	//出栈处理
	if(szParentName!=""){
		INT_PTR	nIndex = m_lstNodeStack.GetPositionBy(szParentName);
		//移除索引后的所有结点
		if(nIndex>0){
			for(INT_PTR nPos=m_lstNodeStack.GetCount();nPos>=nIndex+1;nPos--){
				LPVOID		lpVoid = m_lstNodeStack.Get(nPos);
				SafeDelete(lpVoid);
				m_lstNodeStack.Pop();
			}
		}
		else{
			//移除所有结点
			LPVOID		lpVoid = m_lstNodeStack.Iterators(true);
			while(lpVoid){
				SafeDelete(lpVoid);
				lpVoid = m_lstNodeStack.Iterators();
			}
			m_lstNodeStack.RemoveAll();
		}
	}

	_CStringList*		pList = NULL;
	if(lpParam){
		pList		= new _CStringList();
		*pList = *((_CStringList*)lpParam);
	}

	if(m_lstLayouterSinks.GetCount()){
		IGameLayouterSink*		pGameLayouterSink = m_lstLayouterSinks.Iterators(true);
		while(pGameLayouterSink){
			pGameLayouterSink->Processer(szNodeName, szParentName, lpParam);
			pGameLayouterSink = m_lstLayouterSinks.Iterators();
		}
	}

	m_lstNodeStack.Push((LPVOID)pList, szNodeName);
}

//************************************
// <p>Description: 设置上级接口</p>
// <p>Parameters:  </p>
// <p>    IGameLayouter * pIGameLayouter</p>
// <p>    LPFRAMEMANAGERHANDLE pFMHandles</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayouter::SetGameLayouter(IGameLayouter*	pIGameLayouter, LPFRAMEMANAGERHANDLE pFMHandles){
	return;
}

//************************************
// <p>Description: 接口查询</p>
// <p>Parameters:  </p>
// <p>    const IID & Guid</p>
// <p>    DWORD dwQueryVer</p>
//
// <p>Returns:   void *</p>
//************************************
void * CGameLayouter::QueryInterface(const IID & Guid, DWORD dwQueryVer){
	QUERYINTERFACE(IGameLayouter,Guid,dwQueryVer);
	QUERYINTERFACE(IGameLayouterSink,Guid,dwQueryVer);
	QUERYINTERFACE_IUNKNOWNEX(IGameLayouter,Guid,dwQueryVer);
	return NULL;
}

⌨️ 快捷键说明

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