对HGE游戏引擎的一次封装

HGE游戏引擎是一个开源2D游戏引擎,基于directX。

它的渲染及逻辑是基于帧回调的框架模式,

其提供一些主要的图像操作和输入控制功能。

我在之前写一个2D游戏的时候对它整个框架进行了一次封装,非常多地方写得比較恶心,请原谅我在变量上命名的不规范。

在此分享出来,主要能够參考一下大体框架吧。

HGE游戏引擎基于帧的回调让我非常不爽,由于咱的游戏逻辑通常是连续的,跟详细帧无关,所以我把整个HGE跑在自己的一个线程之中。我的游戏逻辑部分通过发消息,通知界面更新 以及获取用户输入。

在HGE的主框架下分四个部分

1. 资源管理 2.消息管理 3.声音管理 4.UI管理

以下是GDE_UI_HGEFramework.h

/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏UI系统 - HGE 引擎框架类
* ===================================
* 整个UI系统调用HGE游戏引擎的主框架
*
* 2010/01/08 cg create
*/

#ifndef GDE_UI_HGE_FRAMEWORK_H_
#define GDE_UI_HGE_FRAMEWORK_H_

#include "GDE_UI_ResourceManager.h"
#include "GDE_UI_UIManager.h"
#include "GDE_UI_MessageManager.h"
#include "GDE_UI_SoundManager.h"

#pragma comment(lib,"GDE_UI/HGE/lib/hge.lib")
#pragma comment(lib,"GDE_UI/HGE/lib/hgehelp.lib")
#pragma comment(linker, "/NODEFAULTLIB:libc.lib")

#include "GDE_UI_thread_core.h"

namespace GDE
{
namespace GDE_UI
{

//HGE引擎框架
class HGE_Framework
{
public:
//唯一实例
static HGE_Framework* Instance()
{
static HGE_Framework* instance_ = 0;
if( !instance_ )
{
instance_ = new HGE_Framework();
}
return instance_;
}

~HGE_Framework()
{
delete m_ResManager;
delete m_MessageManager;
delete m_SoundManager;
delete m_UIManager;
}

//開始执行
void Run()
{
//获取资源指针
pHGE = m_ResManager->GetHGEPtr();
pGUI = m_ResManager->GetGuiPtr();

//初始化子类中的HGE核心指针
m_MessageManager->Ready();
m_UIManager->Ready();

//開始主循环
if(pHGE->System_Initiate() && pHGE)
{
pHGE->System_Start();
}
else
MessageBox(NULL, pHGE->System_GetErrorMessage(),
"Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
}

//HGE框架逻辑函数
static bool FrameFunc()
{
SMART_LOCK( 0 )//线程锁

HGE_Framework::Instance()->m_MessageManager->ProcessMessage();//处理消息
HGE_Framework::Instance()->m_UIManager->Handler();//处理用户操作

return FALSE;
}

//HGE框架渲染函数
static bool RenderFunc()
{
SMART_LOCK( 0 )//线程锁

HGE_Framework::Instance()->pHGE->Gfx_Clear(0); //清屏
HGE_Framework::Instance()->pHGE->Gfx_BeginScene(); //開始渲染

HGE_Framework::Instance()->m_UIManager->Render();//绘制

HGE_Framework::Instance()->pHGE->Gfx_EndScene(); //结束渲染

return FALSE;
}

//成员子管理器指针
ResourceManager* m_ResManager;
MessageManager* m_MessageManager;
SoundManager* m_SoundManager;
UIManager* m_UIManager;

//HGE系统相关资源指针
HGE* pHGE;
hgeGUI* pGUI;

private:
//私有构造,不同意实例化
HGE_Framework()
:pHGE(0)
,pGUI(0)
{
m_ResManager = new ResourceManager();
m_MessageManager = new MessageManager();
m_SoundManager = new SoundManager();
m_UIManager = new UIManager();
}
};

}
}
#endif;

比較核心的是资源管理类,以下给出

GDE_UI_ResourceManager.h

/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏UI系统 - HGE 引擎框架类 - 资源管理器
* ===================================
* HGE引擎资源管理类
*
* 本类的资源主要实现对HGE资源的维护 和对HGE API封装提供工具集
* 并维护HGE的配置环境
*
* 2010/01/08 cg create
*/

#ifndef GDE_UI_FRAMEWORK_RESOURCEMANAGER_H_
#define GDE_UI_FRAMEWORK_RESOURCEMANAGER_H_

#include "./HGE/cn/GfxFont.h"
#include "./HGE/cn/GfxEdit.h"
#include "./HGE/include/hge.h"
#include "./HGE/include/hgegui.h"
#include "./HGE/include/hgeguictrls.h"
#include "./HGE/include/hgeresource.h"

#include <string>

namespace GDE
{
namespace GDE_UI
{

//资源管理类
class ResourceManager
{
public:
//构造函数,载入HGE全局资源
ResourceManager();

//析构函数,释放HGE全局资源
~ResourceManager();

//获取HGE指针
HGE* GetHGEPtr() { return pHGE; }

//获取GUI指针
hgeGUI* GetGuiPtr() { return pGUI; }

//读取图片
void LoadImage( std::string const& filename, hgeSprite*& p_sprite, HTEXTURE& tex );

private:
HGE* pHGE;
hgeGUI* pGUI;
hgeResourceManager m_HgeResManager;

};

}
}

#endif

GDE_UI_ResourceManager.cpp

#include "GDE_UI_HGEFramework.h"
#include "GDE_UI_ResourceManager.h"

namespace
{
std::string const RES_MANAGER_FILENAME = "res/res_s";
int const WIN_SCREENWIDTH = 800;
int const WIN_SCREENHEIGHT = 600;
std::string const WIN_TITILE = "HGE TEST WINDOW";
int const WIN_COLORMODE = 32;
int const WIN_MAXFPS = 100;
int const WIN_WINDOWED = true;

}

namespace GDE
{
namespace GDE_UI
{

//构造函数
ResourceManager::ResourceManager()
: m_HgeResManager( RES_MANAGER_FILENAME.c_str() )
{
//建立HGE全局实例
pHGE = hgeCreate(HGE_VERSION);

//初始化配置
pHGE->System_SetState(HGE_INIFILE, "hgedemo.ini");
pHGE->System_SetState(HGE_LOGFILE, "hgedemo.log");
pHGE->System_SetState(HGE_FRAMEFUNC, &HGE_Framework::FrameFunc);
pHGE->System_SetState(HGE_RENDERFUNC, &HGE_Framework::RenderFunc);
pHGE->System_SetState(HGE_TITLE, WIN_TITILE.c_str());
pHGE->System_SetState(HGE_SCREENWIDTH, WIN_SCREENWIDTH);
pHGE->System_SetState(HGE_SCREENHEIGHT, WIN_SCREENHEIGHT);
pHGE->System_SetState(HGE_SCREENBPP, WIN_COLORMODE);
pHGE->System_SetState(HGE_FPS,WIN_MAXFPS);
pHGE->System_SetState(HGE_WINDOWED, WIN_WINDOWED);
pHGE->System_SetState(HGE_HIDEMOUSE, false);
pHGE->System_SetState(HGE_USESOUND, false);
pHGE->System_SetState(HGE_DONTSUSPEND, true);//失去焦点不挂起
pHGE->System_SetState((hgeIntState)14, (int)0xFACE0FF); //禁用HGE LOGO

//初始化GUI
pGUI = new hgeGUI();
pGUI->SetNavMode(HGEGUI_UPDOWN | HGEGUI_CYCLED);
pGUI->Enter();
}

ResourceManager::~ResourceManager()
{
// 销毁gui
delete pGUI;

// 销毁资源管理器
m_HgeResManager.Purge();

// HGE结束
pHGE->System_Shutdown();
pHGE->Release();
}

void ResourceManager::LoadImage( std::string const& filename, hgeSprite*& p_sprite, HTEXTURE& tex )
{
if( p_sprite )
delete p_sprite; //销毁之前的图片

tex = pHGE->Texture_Load( filename.c_str() ); //装载纹理
int w = pHGE->Texture_GetWidth( tex );
int h = pHGE->Texture_GetHeight( tex );
p_sprite = new hgeSprite( tex, 0, 0, w, h ); //剪裁精灵
}

}
}

比較重要的是消息传递机制,我仿照了MFC的消息宏定义机制,以下给出消息模块的核心代码

//消息映射宏定义
#define BEGIN_MESSAGE_MAP()/
typedef void (MessageManager::*MessageFunction)();/
std::map<UIMessage, MessageFunction> message_functions_;/
void InitMessageMap()/
{
#define ON_MESSAGE( ID, memberFuc )/
message_functions_[ID] = &MessageManager::memberFuc;
#define END_MESSAGE_MAP/
}

....

//这里是我游戏中详细的一些消息

//消息类型
typedef int UIMessage;

UIMessage const UIMessage_UpdateBackImg = 0; //更新背景图片

UIMessage const UIMessage_AddRole = 10; //添加角色
UIMessage const UIMessage_RemoveRole = 11; //删除角色
UIMessage const UIMessage_UpdateRole = 12; //更新角色列表
UIMessage const UIMessage_AttackInfo = 13; //角色掉血显示

UIMessage const UIMessage_UpdateDialog = 20; //更新对话框
UIMessage const UIMessage_HideDialog = 21; //隐藏对话框

UIMessage const UIMessage_UpdateSmallMap = 30; //更新小地图

UIMessage const UIMessage_UpdateGameInfo = 40; //更新游戏提示信息

UIMessage const UIMessage_UpdateButton = 50; //添加button
UIMessage const UIMessage_RemoveButton = 51; //删除button
UIMessage const UIMessage_RemoveAllButtons = 52; //移除全部button

UIMessage const UIMessage_UpdatePopMenu = 60; //弹出菜单
UIMessage const UIMessage_HidePopMenu = 61; //隐藏弹出菜单

UIMessage const UIMessage_UpdateZoneBlock= 70; //更新地图块
UIMessage const UIMessage_HideZoneBlock = 71; //清除地图块

//消息映射实现

BEGIN_MESSAGE_MAP()
ON_MESSAGE( UIMessage_UpdateBackImg, UpdateBackImage )
ON_MESSAGE( UIMessage_AddRole, AddRole )
ON_MESSAGE( UIMessage_RemoveRole, RemoveRole )
ON_MESSAGE( UIMessage_UpdateRole, UpdateRole )
ON_MESSAGE( UIMessage_AttackInfo, RoleAttackInfo )
ON_MESSAGE( UIMessage_UpdateDialog, UpdateDialog )
ON_MESSAGE( UIMessage_HideDialog, HideDialog )
ON_MESSAGE( UIMessage_UpdateSmallMap, UpdateSmallMap )
ON_MESSAGE( UIMessage_UpdateGameInfo, UpdateGameInfo )
ON_MESSAGE( UIMessage_UpdateButton, UpdateButton )
ON_MESSAGE( UIMessage_RemoveButton, RemoveButton )
ON_MESSAGE( UIMessage_RemoveAllButtons, RemoveAllButtons )
ON_MESSAGE( UIMessage_UpdatePopMenu, UpdatePopMenu )
ON_MESSAGE( UIMessage_HidePopMenu, HidePopMenu )
ON_MESSAGE( UIMessage_UpdateZoneBlock, UpdateZoneBlock )
ON_MESSAGE( UIMessage_HideZoneBlock, HideZoneBlock )
END_MESSAGE_MAP()

//处理消息
void ProcessMessage()
{
for( int i = 0; i < m_MessageList.size(); ++i )
{
( this->*message_functions_[m_MessageList[i]] )();
}
m_MessageList.clear();
}

最后是整个HGE引擎启动的方式

GDE_UI_HGE.h

#ifndef GDE_UI_HGE_H_
#define GDE_UI_HGE_H_

#include <windows.h>
#include <string>

#include "GDE_UI_HGEFramework.h"

/*
GDE HGE游戏引擎模块 2009-11-21

var | author | brief
================================================
1.0 cg create
*/

namespace GDE
{
namespace GDE_UI
{

//HGE线程入口
static DWORD WINAPI HGEThreadProc(LPVOID lpParameter)
{
HGE_Framework::Instance()->Run();
return 0;
}

}
}
#endif

游戏初始化的时候

//创建hge线程
  hge_thread = CreateThread( NULL, 0,
   HGEThreadProc, NULL, 0, NULL );

就能够了

时间: 2024-11-16 10:59:08

对HGE游戏引擎的一次封装的相关文章

【原创】使用JS封装的一个小型游戏引擎及源码分享

1 /** 2 * @description: 引擎的设计与实现 3 * @user: xiugang 4 * @time: 2018/10/01 5 */ 6 7 /* 8 * V1.0: 引擎实现的基本模块思路 9 * 1.创建一个游戏引擎对象及精灵对象 10 * 2.将精灵对象添加到引擎中去,并实现播放动画效果以及需要用到的回调方法 11 * 3.启动引擎 12 * */ 13 14 /* 15 * V2.0: 实现游戏循环模块 16 * 1.如果游戏暂停了,就跳过以下各步骤,并在100毫

Python游戏引擎开发(四):TextField文本类

上一章我们主要介绍了显示对象和如何显示图片.本章来讲述显示文本. 以下是本系列教程前几章地址,在阅读本篇正文之前,请务必阅读前几章内容. Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗口以及重绘界面 Python游戏引擎开发(三):显示图片 文本类TextField 使用过flash的朋友都知道,这个类其实不光是显示文本用的,还可以用于显示输入框.我这里就只实现一些基础实用的功能,以后有时间了慢慢拓展.和上一章一样,TextField是一个显示对象,继承自Displa

Python游戏引擎开发(一):序

邂逅Python 写了这么久的html5,感觉html5学得差不多了,是时候去接触更多的语言来扩充自己的能力了.我先后看了Swift,Java等语言.首先开发Swift需要一台mac,对于我这个寒士而言,过于奢华了一些:Java吧,又感觉太胖了,不够苗条,身材不好,也看不上.最后遇到了Miss Python,先前也和她打过交道,不过感觉语法怪怪的,总是出现>>>这类符号(当时没有深入接触,不晓得是命令输入提示),实在是太高冷了.幸好遇见了廖雪峰大侠,在他的引荐下,我开始初步了解Pytho

Android 8款开源游戏引擎

1.Angle  (2D    Java) Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发.该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程. 最低运行环境要求不详. 项目地址:http://code.google.com/p/angle/ 2.Rokon  (2D    Java) rokon是一款Android 2D游戏引擎,基于OpenGL ES技术开

Python游戏引擎开发(三):显示图片

在上一章中我们讲了如何创建窗口以及对界面进行重绘.可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大致讲一下原因: 由于我们的游戏是动态的,所以我们每次更改数据后(例如播放动画时切换图片),要让界面显示更改后的结果,一般的想法是:首先进行擦除原先要改的地方,然后再把变更的内容画出来.不过这个看似简单,如果遇到了重叠放置的对象就麻烦了,比如说A在B的下面,我们要更改A,那么把A擦掉后,B也会被擦掉,原因在于我们的画布是2D的,无法控制Z方向的擦除.这样一来,我们除了重画A还要再把B画上去.

Python游戏引擎开发(二):创建窗口以及重绘界面

开发本地应用之前,我们得先有个窗口,用于显示界面.其次我们还得实现重绘机制,使游戏不停地刷新,达到动态化的目的.所以我们的引擎开发的第一个阶段就是创建窗口和重绘界面. 以下是之前的文章: Python游戏引擎开发(一):序 Qt的渲染机制 在上一章<序>中我们讲到本次开发用到了PyQt,也就是Qt的Python版.在开始实现引擎功能之前我们要先了解一下Qt,这里先了解渲染机制. 在Qt中,绘画用到的类叫做QPainter,顾名思义,就是个画家类吧.在这个类中,提供了非常多的方法用于操控这个&q

Top 10:HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

Lua游戏引擎Love试用

今天使用Love引擎,测试了一下其基本的一些特性. 由于是底层封装了opengl的库进行图形显示,效率当然还是非常高的,而且lua本身的运行效率也很高,这个架构就特别时候游戏原型的开发,如何哪里运算速度跟不上时,再写成C的库供lua调用,就显得十分方便. 不过不爽的问题也很明显,这个游戏引擎的文档真的很烂,0.9版的文档不知为何删去了大半,好多都要看以前的博客才能知道大概的用法. lua和C的交互 先提一些基本的问题,例如Lua如何和C++交互.这里有篇不错的博客写了这个问题.[Lua脚本在C+

famo.us 一个JavaScript游戏引擎初探

好久之前就看到了famo.us的优良特性,尤其是它避开浏览器弊病的跳跃思维,再加上自己使用JQM来开发Web App时的页面切换的白屏bug,又比对了sencha touch,最后还是决定将famo.us作为开发框架,它是基于浏览器的,目标就是使页面呈现性能最大化,而我不会拿它来做游戏,只是做简单的WebApp,要的就是这个界面显示性能. 但悲剧的是国内没有关于famo.us的教程,近些日子Google被天朝打压的挺惨,幸运的是famo.us官网还是可以访问的,所以以下的学习结果都来自官网htt