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

📄 gameframedlg.cpp

📁 游戏框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ***************************************************************
//  GameFrameDlg   version:  1.0
//  -------------------------------------------------------------
//	File Name:	GameFrameDlg.cpp
//	Created:	2007/07/18
//	Modified:	2007/07/18   17:43
//	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 "GameFrameDlg.h"

//全局(导出)变量
GAME_FRAME_CLASS CGameFrameDlg* theGame;
HHOOK	g_hHook;
//************************************
// <p>Description: 消息处理钩子函数</p>
//************************************
LRESULT CALLBACK CallWndProc(
	int nCode,      // hook code
	WPARAM wParam,  // current-process flag
	LPARAM lParam   // message data
){
	if(nCode==HC_ACTION){
		MSG* Msg = (MSG*)lParam;
		theGame->WindowMsgProce(Msg->message,Msg->wParam,Msg->lParam);	
	}

	return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}

//************************************
// <p>Description: 构造函数</p>
//************************************
CGameFrameDlg::CGameFrameDlg()
{
	m_GameFrameSetting.szWindowTitle	= "William Game Framework";
	m_GameFrameSetting.szLogFile		= "GameFrame.log";
	m_GameFrameSetting.szAppPath		= "";
	m_GameFrameSetting.bDoNTSuspend		= true;
	m_GameFrameSetting.bHiddenMouse		= true;
	m_GameFrameSetting.bEncrypted		= true;
	m_GameFrameSetting.bUseSound		= false;
	m_GameFrameSetting.bMouseMoveNotify	= false;
	m_GameFrameSetting.bWindowMode		= true;
	m_GameFrameSetting.wScreenBpp		= 32;
	m_GameFrameSetting.wScreenWidth		= 800;
	m_GameFrameSetting.wScreenHeight	= 600;
	m_GameFrameSetting.wFPS				= 12;
	m_GameFrameSetting.bUsePropertiesManager = true;
	m_GameFrameSetting.tagMouseSet.nMouseNormalFrames = 0;
	m_GameFrameSetting.tagMouseSet.nMouseDownFrames = 0;
	m_GameFrameSetting.tagMouseSet.nMouseWaitFrames = 0;
	m_pCurrentObject					= NULL;
	m_pFocusObject						= NULL;
	m_pMouseIcon						= NULL;

	ZeroMemory(&m_FMHandles, sizeof(m_FMHandles));

	//返回目录
	TCHAR		szFileName[MAX_PATH];
	if(GetModuleFileName(NULL, szFileName, MAX_PATH)){
		int		nPos = (int)strlen(szFileName)-1;
		while(szFileName[nPos]!='\\') nPos--;
		if(nPos>0) szFileName[nPos+1] = 0;
		m_GameFrameSetting.szAppPath = szFileName;
	}
	SetCurrentDirectory(szFileName);
	
	return;
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CGameFrameDlg::~CGameFrameDlg()
{
	GameExitInstanct();
	return;
}

//************************************
// <p>Description: 框架初始化。配置文件、环境设置、帧数设定。。。</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameFrameDlg::GameInit(){

	//后台开启
#if defined _DEBUG_FRAME
	AllocConsole();
#endif

	//安装钩子函数
	g_hHook = SetWindowsHookEx(WH_GETMESSAGE,CallWndProc,NULL,GetCurrentThreadId());

	m_FMHandles.lpGDI = hgeCreate(HGE_VERSION);

	// Set our frame function
	m_FMHandles.lpGDI->System_SetState(HGE_SHOWSPLASH, false);
	m_FMHandles.lpGDI->System_SetState(HGE_FRAMEFUNC, g_FrameFunc);
	m_FMHandles.lpGDI->System_SetState(HGE_RENDERFUNC, g_RenderFunc);
	m_FMHandles.lpGDI->System_SetState(HGE_FOCUSLOSTFUNC, g_FocusLostFunc);
	m_FMHandles.lpGDI->System_SetState(HGE_GFXRESTOREFUNC, g_FocusGainFunc);

	// Set the window title
	m_FMHandles.lpGDI->System_SetState(HGE_TITLE, m_GameFrameSetting.szWindowTitle);
	// Set runtime log
	m_FMHandles.lpGDI->System_SetState(HGE_LOGFILE, m_GameFrameSetting.szLogFile);
	
	m_FMHandles.lpGDI->System_SetState(HGE_HIDEMOUSE, m_GameFrameSetting.bHiddenMouse);
	m_FMHandles.lpGDI->System_SetState((hgeIntState)14,(int)0xFACE0FF);
	m_FMHandles.lpGDI->System_SetState(HGE_DONTSUSPEND, m_GameFrameSetting.bDoNTSuspend);
	// Run in windowed mode
	// Default window size is 800x600
	m_FMHandles.lpGDI->System_SetState(HGE_WINDOWED, m_GameFrameSetting.bWindowMode);
	m_FMHandles.lpGDI->System_SetState(HGE_SCREENWIDTH, m_GameFrameSetting.wScreenWidth);
	m_FMHandles.lpGDI->System_SetState(HGE_SCREENHEIGHT, m_GameFrameSetting.wScreenHeight);
	m_FMHandles.lpGDI->System_SetState(HGE_SCREENBPP, m_GameFrameSetting.wScreenBpp);
	m_FMHandles.lpGDI->System_SetState(HGE_FPS, m_GameFrameSetting.wFPS);

	// Don't use BASS for sound
	m_FMHandles.lpGDI->System_SetState(HGE_USESOUND, m_GameFrameSetting.bUseSound);

	if(m_FMHandles.lpGDI->System_Initiate()){
		m_FMHandles.pGameFrameDlg = this;
		//设置纹理库
		m_FMHandles.pResourceLib	= new CResourceLib(m_FMHandles.lpGDI);
		g_lpDefaultResource = m_FMHandles.pResourceLib->GetTexture("_SYSTEM_");
		//开启声音库支持
		m_FMHandles.pSoundHelper	= new CSoundHelper(m_FMHandles.pResourceLib);

		return true;
	}

	return false;
}

//************************************
// <p>Description: 开始游戏</p>
//
// <p>Returns:   void</p>
//************************************
void CGameFrameDlg::GameStart(){
	//框架初始化成功
	if(GameInit()){
		//游戏主体的回调钩子已设置
		if(m_FMHandles.pGameBody){
			m_FMHandles.pAttemperEngine = new CAttemperEngine();
			//初始化时间引擎
			m_FMHandles.pTimerEngine	= new CTimerEngine();
			//初始化动作引擎
			m_FMHandles.pActionEngine	= new CActionEngine();
			//初始化网络引擎
			if(m_GameFrameSetting.bUseSocketEngine){
				m_FMHandles.pClientSocket	= new CClientSocket();
				if(m_GameFrameSetting.bEncrypted==false){
					m_FMHandles.pClientSocket->SetEncrypted(m_GameFrameSetting.bEncrypted);
				}
			}
			////初始化道具管理器
			//if(m_GameFrameSetting.bUsePropertiesManager){
			//	m_FMHandles.pIPropertiesManager = new CPropertiesManager();
			//}

			IUnknownEx * pIQueueService=(IUnknownEx *)m_FMHandles.pAttemperEngine->GetQueueService(IID_IUnknownEx,VER_IUnknownEx);

			m_FMHandles.pTimerEngine->SetTimerEngineSink(pIQueueService);
			m_FMHandles.pActionEngine->SetActionEngineSink(pIQueueService);
			m_FMHandles.pActionEngine->SetFrames(m_GameFrameSetting.wFPS);
			if(m_GameFrameSetting.bUseSocketEngine)
				m_FMHandles.pClientSocket->SetSocketSink(pIQueueService);

			m_FMHandles.pAttemperEngine->SetAttemperEngineSink((IUnknownEx*)m_FMHandles.pGameBody->QueryInterface(IID_IUnknownEx, VER_IUnknownEx));

			m_FMHandles.pTimerEngine->StartService();
			m_FMHandles.pActionEngine->StartService();
			m_FMHandles.pAttemperEngine->StartService();

			//执行初始化动作
			m_FMHandles.pGameBody->OnInitialize();
			//执行资源加载动作
			m_FMHandles.pGameBody->OnLoading();

			//设置鼠标
			if(!m_GameFrameSetting.tagMouseSet.szMouseNormal.IsNull() || !m_GameFrameSetting.tagMouseSet.szMouseDown.IsNull()
				|| !m_GameFrameSetting.tagMouseSet.szMouseWait.IsNull() || !m_GameFrameSetting.tagMouseSet.szMouseIcons.IsNull()){
				m_pMouseIcon = new CMouse(m_FMHandles.pResourceLib, &m_GameFrameSetting.tagMouseSet);
				m_pMouseIcon->ShowMouse(1);
			}

			//开始游戏框架
			m_FMHandles.lpGDI->System_Start();
		}
	}
}

//************************************
// <p>Description: 鼠标事件</p>
//
// <p>Returns:   void</p>
//************************************
void CGameFrameDlg::OnMouseEvent(){

	//鼠标等待时不再处理鼠标事件
	if(m_pMouseIcon && m_pMouseIcon->IsWaitting()) return;

	int nSize = m_pMouseBuffer.GetCount();
	//没有数据,退出
	if(nSize==0) return;
	//返回数据失败,退出
	if(!m_pMouseBuffer.GetBuffer(m_mMouseProcBuffers)) return;
	
	CGameScene*			pScene = NULL;
	CGameLayer*			pLayer = NULL;
	IGameObject*		pObject= NULL;
	bool				bMouseStatus = (m_pMouseIcon!=NULL && m_pMouseIcon->IsShowMouse());
	//处理多个消息
	for(int i=0;i<nSize;i++){

		#ifndef NO_MOUSE_MOVE_EVENT
		//转发给游戏体处理鼠标移动的消息
		m_FMHandles.pGameBody->OnMouseMove(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nComboKey); 
		#endif

		//bMouseMoveNotify为假时系统不处理鼠标移动消息,可重载Body的鼠标移动事件处理
		if(!m_GameFrameSetting.bMouseMoveNotify && m_mMouseProcBuffers[i].nType==INPUT_MOUSE_MOVE && m_mMouseProcBuffers[i].nComboKey==0) continue;

		if(bMouseStatus){
			if(m_mMouseProcBuffers[i].nComboKey>0)
				m_pMouseIcon->SetMouseStatus(MOUSE_CLICKDOWN);
			else
				m_pMouseIcon->SetMouseStatus(MOUSE_NORMAL);
		}

		//查找鼠标下的对象
		bool bFlag = m_FMHandles.pGameBody->GetCurrentSection()->GetGameView()->FindObject(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, &pScene, &pLayer, &pObject);

		//找到对象
		if(bFlag && pObject!=NULL){
			//bMouseMoveNotify为真时系统处理鼠标移动消息
			if(m_GameFrameSetting.bMouseMoveNotify){
		#ifndef NO_MOUSE_OVER_EVENT
				if(pObject == m_pCurrentObject){
					try{
						//游戏主体通知
						m_FMHandles.pGameBody->OnMouseOver(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					}
					catch(...){}

					try{
						//对象通知
						m_pCurrentObject->OnMouseOver(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					}
					catch(...){}
				}
		#endif

		#ifndef NO_MOUSE_IN_EVENT
				if(pObject != m_pCurrentObject && (!pObject->IsDisabled())){
					try{
						//游戏主体通知
						m_FMHandles.pGameBody->OnMouseIn(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
						//对象通知
						pObject->OnMouseIn(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					}
					catch(...){}

					try{
						if(m_pCurrentObject!=NULL && (!m_pCurrentObject->IsDisabled())){
							//游戏主体通知
							m_FMHandles.pGameBody->OnMouseOut(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
							//对象通知
							m_pCurrentObject->OnMouseOut(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
						}
					}
					catch(...){}
				}
		#endif
			}

			//点击事件处理
			if(m_mMouseProcBuffers[i].nType!=INPUT_MOUSE_MOVE && pObject->IsClickabled()){
				// 若道具在选择目标,则拦载鼠标消息并转交由道具处理
				if(m_GameFrameSetting.bUsePropertiesManager && m_FMHandles.pIPropertiesManager && m_FMHandles.pIPropertiesManager->IsChoosing()){
					if(m_FMHandles.pIPropertiesManager->GetChoose())
						m_FMHandles.pIPropertiesManager->GetChoose()->OnChoosedTarget(NULL, pObject);
				}
				else{
					try{
						//游戏主体通知
						if(m_mMouseProcBuffers[i].nType==INPUT_MOUSE_DBCLICK){
							m_FMHandles.pGameBody->OnMouseDBClick(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
						}
						m_FMHandles.pGameBody->OnMouseClick(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					}
					catch(...){}

					try{
						if(m_mMouseProcBuffers[i].nType==INPUT_MOUSE_DBCLICK){
							pObject->OnMouseDBClick(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
						}

						//对象通知
						pObject->OnMouseClick(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					}
					catch(...){}

					//焦点处理
					try{
						if(m_mMouseProcBuffers[i].nType!=INPUT_MOUSE_UP){
							//pObject->OnMouseDown(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nComboKey);

							enGameObjectType GameObjectType = pObject->GetObjectType();
							if(GameObjectType==Type_Unknow || GameObjectType==Type_Sprite || GameObjectType==Type_Animation || GameObjectType==Type_Particle){
								m_pFocusObject = NULL;
							}
							else{
								m_pFocusObject = pObject;
							}
						}
						else{
							//pObject->OnMouseUp(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nComboKey);
						}
					}
					catch(...){}
				}
			}
			else{
				//按下鼠标拖动
				if(m_mMouseProcBuffers[i].nType==INPUT_MOUSE_MOVE && m_mMouseProcBuffers[i].nComboKey!=0){
					pObject->OnMouseMove(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nComboKey);
				}
			}
		}
		else{
			//找不到对象
			if(m_GameFrameSetting.bMouseMoveNotify){
				//对象的MouseOut处理
				if(m_pCurrentObject!=NULL){
					//游戏主体通知
					m_FMHandles.pGameBody->OnMouseOut(pObject, m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
					//对象通知
					m_pCurrentObject->OnMouseOut(m_mMouseProcBuffers[i].x, m_mMouseProcBuffers[i].y, m_mMouseProcBuffers[i].nType, m_mMouseProcBuffers[i].nMessage, m_mMouseProcBuffers[i].nComboKey);
				}
			}
			pObject = NULL;
		}

		m_pCurrentObject = pObject;
	}

	//处理最后一条消息
	//视图处理
	try{
		//检查当前GameView的动作区域
		m_FMHandles.pGameBody->GetCurrentSection()->GetGameView()->IsHitActionArea(m_mMouseProcBuffers[nSize-1].x, m_mMouseProcBuffers[nSize-1].y);
	}
	catch(...){}


	//鼠标位置设置
	try{
		if(bMouseStatus)
			m_pMouseIcon->SetMousePosition(m_mMouseProcBuffers[nSize-1].x, m_mMouseProcBuffers[nSize-1].y);
	}
	catch(...){}
}

//************************************
// <p>Description: 键盘事件</p>
//
// <p>Returns:   void</p>
//************************************
void CGameFrameDlg::OnKeyPassEvent(){
	//返回缓冲区个数
	int nSize = m_pKeyBoardBuffer.GetCount();

⌨️ 快捷键说明

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