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

📄 gamescene.cpp

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

//************************************
// <p>Description: 构造函数</p>
//************************************
CGameScene::CGameScene(void)
{
}

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

//************************************
// <p>Description: 创建层</p>
// <p>Parameters:  </p>
// <p>    _CString szName</p>
// <p>    INT_PTR nPosition</p>
//
// <p>Returns:   CGameLayer*</p>
//************************************
CGameLayer* CGameScene::Create(_CString szName, INT_PTR nPosition){
	CGameLayer*	pGameLayer = new CGameLayer();
	pGameLayer->SetObjectName(szName);
	pGameLayer->SetObjectType(Type_Layer);
	pGameLayer->SetSize(GetSize());

	if(pGameLayer){
		if(Add(pGameLayer, szName, nPosition))
			return pGameLayer;
	}

	return NULL;
}

//************************************
// <p>Description: 计算容器坐标</p>
// <p>Parameters:  </p>
//
// <p>Returns:   void</p>
//************************************
void CGameScene::CalcContainerPosition(){
	//__super::CalcContainerPosition();
	//设置上一级的容器坐标
	if(m_pParent!=NULL){
		m_BasalInfo.ContainerPos = ((IFrameObject*)m_pParent)->GetScreenPosition();
		m_BasalInfo.ContainerPos.x *= -1;
		m_BasalInfo.ContainerPos.y *= -1;
		m_BasalInfo.ScreenPos.x = m_BasalInfo.LocalPos.x + m_BasalInfo.ContainerPos.x;
		m_BasalInfo.ScreenPos.y = m_BasalInfo.LocalPos.y + m_BasalInfo.ContainerPos.y;
	}

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

	return;
}

//************************************
// <p>Description: 返回层数</p>
// <p>Parameters:  </p>
//
// <p>Returns:   INT_PTR</p>
//************************************
INT_PTR CGameScene::GetLength(){
	return m_lstGameLayers.GetCount();
}

//************************************
// <p>Description: 返回层</p>
// <p>Parameters:  </p>
// <p>    INT_PTR nIndex</p>
//
// <p>Returns:   CGameLayer*</p>
//************************************
CGameLayer* CGameScene::Get(INT_PTR nIndex){
	return m_lstGameLayers.Get(nIndex);
}

//************************************
// <p>Description: 返回层</p>
// <p>Parameters:  </p>
// <p>    LPCTSTR szKey</p>
//
// <p>Returns:   CGameLayer*</p>
//************************************
CGameLayer* CGameScene::GetBy(LPCTSTR szKey){
	return m_lstGameLayers.GetBy(szKey);
}

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

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

//************************************
// <p>Description: 添加层</p>
// <p>Parameters:  </p>
// <p>    CGameLayer * pGameLayer</p>
// <p>    _CString szName</p>
// <p>    INT_PTR nPosition</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameScene::Add(CGameLayer* pGameLayer, _CString szName, INT_PTR nPosition){
	if(nPosition==LISTTEMPLATE_LAST_ITEM)
		m_lstGameLayers.Push(pGameLayer, szName);
	else
		m_lstGameLayers.Insert(pGameLayer, nPosition, szName);

	//关联层
	pGameLayer->SetParent(GET_OBJECTPTR_INTERFACE(this, IUnknownEx));
	//设置坐标
	pGameLayer->CalcContainerPosition();

	return true;
}

//************************************
// <p>Description: 移除层</p>
// <p>Parameters:  </p>
// <p>    INT_PTR nIndex</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameScene::Remove(INT_PTR nIndex){
	m_lstGameLayers.Remove(nIndex);
	return true;
}

//************************************
// <p>Description: 移除层</p>
// <p>Parameters:  </p>
// <p>    _CString szKey</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameScene::Remove(_CString szKey){
	m_lstGameLayers.RemoveBy(szKey);
	return true;
}

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

//************************************
// <p>Description: 预渲染视图</p>
// <p>Parameters:  </p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   void</p>
//************************************
void CGameScene::PreRender(WPARAM wParam){
	CGameLayer*		pGameLayer = m_lstGameLayers.Iterators(true);
	while(pGameLayer){
		//渲染所有可视层
		if(pGameLayer->IsVisabled())
			pGameLayer->PreRender(wParam);

		pGameLayer = m_lstGameLayers.Iterators();
	}
}

//************************************
// <p>Description: 渲染场景</p>
// <p>Parameters:  </p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   void</p>
//************************************
void CGameScene::Render(WPARAM wParam){
	CGameLayer*		pGameLayer = m_lstGameLayers.Iterators(true);
	while(pGameLayer){
		//渲染所有可视层
		if(pGameLayer->IsVisabled())
			pGameLayer->Render(wParam);

		pGameLayer = m_lstGameLayers.Iterators();
	}
}

//************************************
// <p>Description: 返回指定的路径下的对象</p>
//			例:defaultscene\defaultlayer\objectname
// <p>Parameters:  </p>
// <p>    _CString & szPath</p>
//
// <p>Returns:   IGameObject*</p>
//************************************
IGameObject* CGameScene::GetObject(_CString& szPath){
	TCHAR		SubPath[2][MAX_NAME];
	LPCTSTR		pStart = szPath;
	LPCTSTR		pEnd = pStart;
	int			i = 0;
	int			Flag = 0;

	ZeroMemory(SubPath, sizeof(SubPath));
	Flag = (_tcschr(pStart, '.')!=NULL)?1:0;
	Flag = (Flag==0 && _tcschr(pStart, '\\')!=NULL)?2:Flag;
	if(Flag > 0){
		while((pEnd = strchr(pStart, Flag==1?'.':'\\'))!=NULL && i<2){
			_tcsncpy(SubPath[i], pStart, pEnd-pStart);

			pStart = pEnd+1;
			i++;
		}

		if(*pStart!=0){
			_tcsncpy(SubPath[i], pStart, MAX_NAME);
		}

		if(i==1){
			CGameLayer*		pGameLayer = m_lstGameLayers.GetBy(SubPath[0]);
			if(pGameLayer){
				return pGameLayer->GetBy(SubPath[1]);
			}
		}
	}
	return NULL;
}

//************************************
// <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 CGameScene::FindObject(float x, float y, CGameScene** pGameScene, CGameLayer** pGameLayer, IGameObject** pIGameObject)
{
	bool		bFound = false;
	*pGameLayer = m_lstGameLayers.Iterators(true);
	while(*pGameLayer){
		//所有可视层
		if((*pGameLayer)->IsVisabled() && !(*pGameLayer)->IsDisabled()){
			bFound = (*pGameLayer)->FindObject(x, y, pGameScene, pGameLayer, pIGameObject);
		}
		if(bFound)
			return true;
		(*pGameLayer) = m_lstGameLayers.Iterators();
	}
	return false;
}

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

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

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

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

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

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

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

		}
	}
}

//************************************
// <p>Description: 释放对象</p>
// <p>Parameters:  </p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameScene::Release(){
	if (IsValid()){
		CGameLayer*		pGameLayer = m_lstGameLayers.Iterators(true);
		while(pGameLayer){
			delete pGameLayer;
			pGameLayer = m_lstGameLayers.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* CGameScene::QueryInterface(const IID &Guid, DWORD dwQueryVer){
	QUERYINTERFACE(IFrameObject,Guid,dwQueryVer);
	QUERYINTERFACE_IUNKNOWNEX(IFrameObject,Guid,dwQueryVer);
	return NULL;
}

⌨️ 快捷键说明

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