📄 gamelayouter.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 + -