`
rcfalcon
  • 浏览: 228678 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对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; //增加按钮
UIMessage const UIMessage_RemoveButton	 = 51; //删除按钮
UIMessage const UIMessage_RemoveAllButtons	= 52; //移除所有按钮

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 );


就可以了

 

分享到:
评论

相关推荐

    hge游戏引擎源码

    本文将对HGE游戏引擎的源码进行深入解析,帮助读者理解其核心概念和工作原理。 首先,HGE的核心组件主要包括以下几个部分: 1. **图形渲染**:HGE使用Direct3D作为图形后端,提供2D渲染功能。源码中的`hgeGraphics...

    一个对hge的封装游戏源码

    描述中提到,“本游戏采用hge游戏引擎,在net2003上开发的一款小游戏”。这揭示了两个关键信息:一是游戏的编程语言环境——.NET Framework 2.0,这是微软在2003年发布的一个版本,支持C#、VB.NET等编程语言。二是...

    2D游戏引擎HGE之连连看源码

    HGE(HGE -Harnessing the Grey Matter)就是这样一款强大的2D游戏引擎,以其轻量级、高效能和易于上手的特点受到众多游戏开发爱好者的青睐。本文将通过分析基于HGE的“连连看”游戏源码,深入解析HGE引擎的工作原理...

    免费游戏引擎HGE

    HGE 是一个硬件加速(Hardware accelerated)的 2D 游戏引擎(Game Engine),HGE 是一个富有特性的中间件,可以用于开发任何类型的 2D 游戏。HGE 封装性良好,以至于你仅仅需要关系游戏逻辑(Game Logic),而不...

    hge181-2D 游戏引擎

    HGE 是一个硬件加速(Hardware accelerated)的 2D 游戏引擎(Game Engine), HGE 是一个富有特性的中间件,可以用于开发任何类型的 2D 游戏。HGE 封装性良好, 以至于你仅仅需要关系游戏逻辑(GameLogic),而...

    hge16 游戏引擎

    hge16是一款基于DirectX的游戏引擎,它专为2D游戏制作设计,通过封装3D技术来实现高效的2D渲染效果。这个引擎的核心在于将复杂的3D图形处理转化为对2D场景的简便操作,为开发者提供了强大的工具集,简化了游戏开发...

    hge游戏引擎使用文档,中文的

    ### HGE游戏引擎使用知识点详解 #### 一、HGE引擎简介 HGE(HGE Game Engine)是一款专为2D游戏设计的硬件加速引擎,它具有良好的封装性,允许开发者更加关注游戏逻辑而非底层技术细节。HGE构建在DirectX 8.0之上...

    易语言HGE引擎模块

    易语言HGE引擎模块是一款专为易语言设计的游戏开发组件,它基于开源的HGE(Happy Game Engine)引擎进行了封装,使得易语言用户能够更方便地进行2D游戏的开发和商业化运作。HGE是一个高效、简洁且功能丰富的C++游戏...

    HGE引擎教程.rar

    HGE 是一个硬件加速(Hardware accelerated)的 2D 游戏引擎(Game Engine),HGE 是一个富有特性的中间件,可以用于开发任何类型的 2D 游戏。HGE 封装性良好,以至于你仅仅需要关系游戏逻辑(Game Logic),而不...

    HGE 游戏 cpp BattleShips2.0

    《HGE游戏cpp BattleShips2.0:利用HGE引擎构建的小型游戏解析》 在游戏开发领域,选择合适的引擎至关重要。HGE(Happy Game Engine)是一个基于C++的开源游戏开发框架,专为小型游戏设计,提供了一系列的游戏开发...

    打砖块游戏(使用hge引擎开发)

    【打砖块游戏(使用hge引擎开发)】 在游戏开发领域,打砖块是一款经典的休闲游戏,以其简单易...如果你对游戏开发感兴趣,学习这个项目不仅可以深入了解HGE引擎的用法,也能提高你在C++编程和2D游戏设计上的技能。

    Direct9游戏开发封闭引擎HGE

    Direct9游戏开发封闭引擎HGE,全称是Half-Life Game Engine,是一款基于Microsoft DirectX 9技术的游戏开发框架。它为开发者提供了一套便捷的接口,用于简化游戏编程过程,使得开发者能够更加专注于游戏内容的创作,...

    hge引擎 分装了 lua 工程源代码

    本文将详细介绍一个特别的项目——"HGE引擎 分装了 lua 工程源代码",这是一个在Windows 7环境下,使用Visual Studio 2010开发的项目,它成功地将HGE引擎与Lua脚本语言进行了集成,为开发者提供了更强大的游戏开发...

    HGE 2D游戏制作引擎 函数列表

    在游戏开发领域,HGE(Hardcore Game Engine)是一个针对2D游戏设计的开源引擎,它为开发者提供了丰富的功能和工具,以简化游戏的创建过程。HGE的主要优点在于其简洁的API,使得程序员能够快速地实现游戏逻辑。本文...

    HEG开源游戏引擎+配套教学文档

    HGE 是一个硬件加速(Hardware accelerated)的2D 游戏引擎(Game Engine), HGE 是一个富有特性的中间件,可以用于开发任何类型的2D 游戏。HGE 封装性良好, 以至于你仅仅需要关系游戏逻辑(Game Logic),而不...

    HGE整合到MFC中

    标题 "HGE整合到MFC中" 涉及到的是将HGE(Hybrid Game Engine)游戏引擎集成到Microsoft Foundation Class(MFC)框架下的技术。MFC是微软提供的一种C++类库,用于简化Windows应用程序开发,而HGE则是一个开源的游戏...

    HGE粒子编辑器

    HGE粒子编辑器,全称为HappyGameEngine(HGE)粒子编辑器,是一款专为HGE游戏引擎设计的强大工具,用于制作粒子封装(psi)文件。它以可视化界面为核心,为开发者提供了便捷的方式来创建和编辑各种复杂的粒子效果,...

    HGE_系列教材(1-9).pdf

    HGE(Hardware-accelerated Game Engine)是一款专为2D游戏设计的硬件加速游戏引擎,它封装了底层DirectX API,使得开发者可以更加关注游戏逻辑而非底层实现细节。HGE的特点包括: - **专注2D领域**:HGE特别针对2D...

    HGE DX9 版本

    标题中的“HGE DX9”指的是“High Gear Engine DirectX 9”,这是一个专为游戏开发设计的跨平台开源库。HGE是基于DirectX 9.0 API构建的,提供了简化的游戏编程接口,使得开发者能够更方便地创建2D游戏和其他交互式...

    MFC窗口中内嵌HGE窗口

    将HGE内嵌到MFC程序中,可以充分利用两者的优势,创建出既有MFC强大框架支持,又具有HGE高效游戏引擎特性的应用。 首先,我们要理解MFC的消息循环。在MFC中,消息循环是程序运行的核心,它负责接收并处理来自操作...

Global site tag (gtag.js) - Google Analytics