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

📄 gamelayer.cpp

📁 游戏框架
💻 CPP
字号:
// ***************************************************************
//  GameLayer   version:  1.0
//  -------------------------------------------------------------
//	File Name:	GameLayer.cpp
//	Created:	2007/07/18
//	Modified:	2007/07/18   16:27
//	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 ".\gamelayer.h"
#include ".\gamescene.h"

//************************************
// <p>Description: 构造函数</p>
//************************************
CGameLayer::CGameLayer()
{
	m_pBufferPage = NULL;

	SetDisabled(true);
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CGameLayer::~CGameLayer(void)
{
	if(m_pBufferPage)
		SafeDelete(m_pBufferPage);

	Release();
}

//************************************
// <p>Description: 计算容器坐标</p>
// <p>Parameters:  </p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayer::CalcContainerPosition(){

	//设置上一级的容器坐标
	__super::CalcContainerPosition();

	IGameObject*		pGameObject = m_lstGameObjects.Iterators(true);
	while(pGameObject){
		//重置该场下的所有层的容器坐标
		pGameObject->CalcContainerPosition();
		pGameObject = m_lstGameObjects.Iterators();
	}

	return;
}

//************************************
// <p>Description: 对象个数</p>
// <p>Parameters:  </p>
//
// <p>Returns:   INT_PTR</p>
//************************************
INT_PTR CGameLayer::GetLength(){
	return m_lstGameObjects.GetCount();
}

//************************************
// <p>Description: 返回对象</p>
// <p>Parameters:  </p>
// <p>    INT_PTR nIndex</p>
//
// <p>Returns:   IGameObject*</p>
//************************************
IGameObject* CGameLayer::Get(INT_PTR nIndex){
	return m_lstGameObjects.Get(nIndex);
}

//************************************
// <p>Description: 返回对象</p>
// <p>Parameters:  </p>
// <p>    LPCTSTR szKey</p>
//
// <p>Returns:   IGameObject*</p>
//************************************
IGameObject* CGameLayer::GetBy(LPCTSTR szKey){
	return m_lstGameObjects.GetBy(szKey);
}

//************************************
// <p>Description: 返回对象</p>
// <p>Parameters:  </p>
// <p>    INT_PTR nIndex</p>
//
// <p>Returns:   IGameObject*</p>
//************************************
IGameObject* CGameLayer::operator[](INT_PTR nIndex){
	return Get(nIndex);
}

//************************************
// <p>Description: 返回对象</p>
// <p>Parameters:  </p>
// <p>    LPCTSTR szKey</p>
//
// <p>Returns:   IGameObject*</p>
//************************************
IGameObject* CGameLayer::operator[](LPCTSTR szKey){
	return GetBy(szKey);
}

//************************************
// <p>Description: 添加对象</p>
// <p>Parameters:  </p>
// <p>    IGameObject * pIGameObject</p>
// <p>    _CString szName</p>
// <p>    INT_PTR nPosition</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::Add(IGameObject* pIGameObject, _CString szName, INT_PTR nPosition){
	if(nPosition==LISTTEMPLATE_LAST_ITEM)
		m_lstGameObjects.Push(pIGameObject, szName);
	else
		m_lstGameObjects.Insert(pIGameObject, nPosition, szName);

	//关联对象
	pIGameObject->SetParent(GET_OBJECTPTR_INTERFACE(this, IBaseObject));
	pIGameObject->CalcContainerPosition();

	//带缓冲
	if(m_wCacheType>0 && m_pBufferPage){
		m_pBufferPage->Add(pIGameObject, szName);
	}
	NotifiyChange();

	return true;
}

//************************************
// <p>Description: 移除对象</p>
// <p>Parameters:  </p>
// <p>    INT_PTR nIndex</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::Remove(INT_PTR nIndex){
	m_lstGameObjects.Remove(nIndex);

	//带缓冲
	if(m_wCacheType>0 && m_pBufferPage){
		m_pBufferPage->Remove(nIndex);
	}

	return true;
}

//************************************
// <p>Description: 移除对象</p>
// <p>Parameters:  </p>
// <p>    _CString szKey</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::Remove(_CString szKey){
	m_lstGameObjects.RemoveBy(szKey);

	//带缓冲
	if(m_wCacheType>0 && m_pBufferPage){
		m_pBufferPage->RemoveBy(szKey);
	}
	return true;
}

//************************************
// <p>Description: 移除所有对象</p>
// <p>Parameters:  </p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::ClearAll(){
	m_lstGameObjects.RemoveAll();
	return true;
}

//************************************
// <p>Description: 渲染层</p>
// <p>Parameters:  </p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayer::Render(WPARAM wParam){
	if(m_wCacheType>0){
		m_pBufferPage->Render(wParam);
	}
	else{
		IGameObject*		pIGameObject = m_lstGameObjects.Iterators(true);
		while(pIGameObject){
			//渲染所有可视场景
			if(pIGameObject->IsVisabled()){
				pIGameObject->Render(wParam);
			}
			pIGameObject = m_lstGameObjects.Iterators();
		}
	}
}

//************************************
// <p>Description: 预渲染</p>
// <p>Parameters:  </p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayer::PreRender(WPARAM wParam){
	//自动模式
	if(m_wCacheType==1 && m_bChanged){
		m_pBufferPage->GenerateBuffer();
		m_bChanged = false;
	}
}

//设置缓冲类型
void CGameLayer::SetCacheType(WORD wType){
	WORD	wOldCacheType = __super::GetCacheType();
	//新旧设置相等,返回
	if(wOldCacheType==wType) return;

	if(wOldCacheType==0){
		//未开启缓冲,要转为带缓冲
		m_pBufferPage = new CGameBufferPage();
		m_pBufferPage->Create("_FrameBuffer_", m_BasalInfo.Size, wType==1);

		//将层内的所有对象关联至缓冲对象
		IGameObject*		pIGameObject = m_lstGameObjects.Iterators(true);
		while(pIGameObject){
			m_pBufferPage->Add(pIGameObject, "");
			pIGameObject = m_lstGameObjects.Iterators();
		}
	}
	else{
		//已开启缓冲,要转回不带缓冲
		if(wType==0){
			//清空缓冲对象
			SafeDelete(m_pBufferPage);
			m_pBufferPage = NULL;
		}
	}

	__super::SetCacheType(wType);
}

//************************************
// <p>Description: 查找指定坐标下的对象</p>
// <p>Parameters:  </p>
// <p>    float x</p>
// <p>    float y</p>
// <p>    CGameScene * * pGameScene</p>
// <p>    CGameLayer * * pGameLayer</p>
// <p>    IGameObject * * pIGameObject</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::FindObject(float x, float y, CGameScene** pGameScene, CGameLayer** pGameLayer, IGameObject** pIGameObject)
{
	bool		bFound = false;
	for(INT_PTR i=m_lstGameObjects.GetCount();i>0;i--){
		*pIGameObject = m_lstGameObjects.Get(i);
		if((*pIGameObject)->IsVisabled() && (!(*pIGameObject)->IsDisabled()) && (*pIGameObject)->Hitting(x, y)){
			return true;
		}
	}
	//*pIGameObject = m_lstGameObjects.Iterators(true);
	//while(*pIGameObject){
	//	//所有可视对象及在X,Y点之下
	//	if((*pIGameObject)->IsVisabled() && (*pIGameObject)->Hitting(x, y)){
	//		return true;
	//	}
	//	(*pIGameObject) = m_lstGameObjects.Iterators();
	//}
	return false;
}

//************************************
// <p>Description: 交换深度</p>
// <p>Parameters:  </p>
// <p>    IUnknownEx * pIObject1</p>
// <p>    IUnknownEx * pIObject2</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayer::SwitchDepth(IUnknownEx* pIObject1, IUnknownEx* pIObject2){
	m_lstGameObjects.Switch((IGameObject*)pIObject1, (IGameObject*)pIObject2);
}

//************************************
// <p>Description: 交换深度</p>
// <p>Parameters:  </p>
// <p>    IUnknownEx * pIObject</p>
// <p>    DWORD dwNewDepth</p>
//
// <p>Returns:   void</p>
//************************************
void CGameLayer::SwitchDepth(IUnknownEx* pIObject, DWORD dwNewDepth){
	IGameObject*		pIGameObject = (IGameObject*)pIObject;

	//位置没有变化,不处理
	if(dwNewDepth == pIGameObject->GetDepth()) return;

	bool			bDirection = dwNewDepth > pIGameObject->GetDepth();
	INT_PTR			nOrignalPos = m_lstGameObjects.GetPosition(pIGameObject);
	IGameObject*	pNextIGameObject = NULL;
	if(bDirection){
		//向后搜索
		for(INT_PTR nPos=nOrignalPos+1;nPos<=GetLength();nPos++){
			pNextIGameObject = m_lstGameObjects.Get(nPos);
			//后一个对象的深度比新的深度要大,则退出
			if(pNextIGameObject->GetDepth()> dwNewDepth) return;

			SwitchDepth(pIObject, (IUnknownEx*)pNextIGameObject->QueryInterface(IID_IUnknownEx, VER_IUnknownEx));

		}
	}
	else{
		//向前搜索
		for(INT_PTR nPos=nOrignalPos-1;nPos>=1;nPos--){
			pNextIGameObject = m_lstGameObjects.Get(nPos);
			//后一个对象的深度比新的深度要小,则退出
			if(pNextIGameObject->GetDepth()< dwNewDepth) return;

			SwitchDepth(pIObject, (IUnknownEx*)pNextIGameObject->QueryInterface(IID_IUnknownEx, VER_IUnknownEx));

		}
	}
}

//************************************
// <p>Description: 释放对象</p>
// <p>Parameters:  </p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameLayer::Release(){
	if (IsValid()){
		IGameObject*		pIGameObject = m_lstGameObjects.Iterators(true);
		while(pIGameObject){
			pIGameObject->Release();
			pIGameObject = m_lstGameObjects.Iterators();
		}
		return true;
	}

	return false;
}

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

⌨️ 快捷键说明

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