📄 gameframedlg.cpp
字号:
// ***************************************************************
// 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 + -