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