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

HGE引擎GUI对象的扩展

阅读更多

 HGE引擎提供一个基本的GUI控件类,其不实现任何功能,但是提供一套虚函数和属性供派生类使用。

开发者可以在此基础之上开发属于自己的控件,总的来说还是比较方便的。

 

我在开发自己的游戏框架过程中,吸取了许多经验教训。

建议HGE引擎的使用者们不要直接在渲染过程中使用HGE提供的图形函数,而应该将他们全部都封装在GUI控件派生类中,

这样有几大好处。

 

1. 更贴近面向对象,使得程序框架清晰;

2. 更好管理资源,使用和释放都在同一个小模块中,即使规模扩大,也方便维护;

3. 易复用,我们可以整理一套统一的基类,然后逐步派生、组合实现我们需要的功能。

 

下面给出我在开发过程中自己使用的几个方便的基类

 

/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏UI系统 - HGE游戏引擎控件基类
* ===================================
* 为了提高代码的复用性,提供一些常用的功能作为基类,在构建基于HGE的GUI控件时可以派生复用。
*
* 2010/01/07   cg	create
*/
#ifndef GDE_UI_BasicClasses_H_
#define GDE_UI_BasicClasses_H_

#include "../HGE/include/hge.h"
#include "../HGE/include/hgesprite.h"
#include "../HGE/include/hgefont.h"
#include "../HGE/include/hgerect.h"
#include "../HGE/include/hgegui.h"
#include "../HGE/include/hgeguictrls.h"

#include "../HGE/cn/GfxFont.h"
#include "../HGE/cn/GfxEdit.h"

#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


/******	默认带中文字体的基类 ******/
class GDE_BASIC_GUIChineseFont : public hgeGUIObject
{
public:
	GDE_BASIC_GUIChineseFont()
	{
		font = new GfxFont("宋体",20,TRUE,FALSE,FALSE);// 宋体,粗体,非斜体,非平滑
		font->SetColor(0xFFFFFFFF);		// 设置像素字体颜色,默认白色
	}

	//fonttype 字体,size 文字大小
	GDE_BASIC_GUIChineseFont( std::string fonttype , int size )
	{
		font = new GfxFont(fonttype.c_str(),size,TRUE,FALSE,FALSE);
		font->SetColor(0xFFFFFFFF);		
	}

	~GDE_BASIC_GUIChineseFont()
	{
		if( font ) 
			delete font;
	}

	//以某种颜色显示一次,然后还原颜色
	void FontPrintOnce( int x,int y, DWORD Color, std::string txt )
	{
		DWORD oldcolor = font->GetColor();
		font->SetColor( Color );
		font->Print( x,y, txt.c_str() );
		font->SetColor( oldcolor );
	}

protected:
	GfxFont* font;//中文字体指针
};

/****** 只用于显示,不用于控制的基类 ******/
class GDE_BASIC_GUIViewOnly : public hgeGUIObject
{
public:
	GDE_BASIC_GUIViewOnly()
	{
		this->rect.Set( 0,0,0,0 );//这样不会覆盖其他GUI控件的控制区
	}
};

/****** 感应鼠标移动的基类 ******/
class GDE_BASIC_GUIMouseSensitive : public hgeGUIObject
{
public:
	GDE_BASIC_GUIMouseSensitive()
		: mx_ ( 0 )
		, my_ ( 0 )
		, is_mouse_over_ ( FALSE )
	{
	}

	virtual ~GDE_BASIC_GUIMouseSensitive(){}

	virtual void MouseOver( bool bOver )
	{
		is_mouse_over_ = bOver;
	}

	virtual bool MouseMove(float x, float y)
	{
		mx_ = x;
		my_ = y;
		return false;
	}

protected:
	float mx_,my_; //当前鼠标位置
	bool is_mouse_over_; //鼠标是否悬停
};


#endif

 

 

具体的一个实例,比如我的界面角色管理类

 

/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏UI系统 - HGE GUI控件 - 角色管理器
* ===================================
* 提供角色的资源管理、角色图片信息管理等功能
*
* 2010/01/07   cg	create
*/

#ifndef GDE_UI_ROLE_MANAGER_H_
#define GDE_UI_ROLE_MANAGER_H_

#include "GDE_UI_BasicClasses.h"

using namespace GDE;

//角色渲染资料单元
struct RoleGuiUnit
{
	RoleGuiUnit( int id , std::string filename , int px, int py ,HGE* pgHGE )
	{
		role_id = id;
		img_filename = filename;
		x = px;
		y = py;
		pHGE = pgHGE;

		////读取图片
		tex = pHGE->Texture_Load( filename.c_str() ); //装载纹理
		w = pHGE->Texture_GetWidth( tex );
		h = pHGE->Texture_GetHeight( tex );
		spr = new hgeSprite( tex, 0, 0, w, h );
	}

	~RoleGuiUnit()
	{
		if( tex )
			pHGE->Texture_Free( tex );
		if( spr )
			delete spr;
	}

	void SetAttackInfo( std::string txt )
	{
		attackinfo = txt;
		attackinfo_show_count = 200; //此处和FPS相关
	}

	int role_id; //角色ID
	std::string img_filename;//角色图片文件名
	int x,y; //角色坐标(绝对坐标)
	Direction direct; //角色朝向	

	HTEXTURE tex;
	hgeSprite* spr;
	int w,h; //角色图片宽高
	HGE* pHGE;

	std::string attackinfo;//攻击掉血数
	int attackinfo_show_count;
};

struct RoleGuiUnitAutoPtr
{
	RoleGuiUnitAutoPtr( RoleGuiUnit* r )
	{
		ptr = r;
	}

	~RoleGuiUnitAutoPtr()
	{
		delete ptr;
	}

	RoleGuiUnit* GetPtr()
	{
		return ptr;
	}

private:
	RoleGuiUnit* ptr;
};


//人物角色管理器GUI
class GDE_GUIRoleManager : public GDE_BASIC_GUIChineseFont
{
public:
	GDE_GUIRoleManager( int id , HGE* pgHGE )
		: pHGE( pgHGE )
	{
		this->id = id;
		this->rect.Set( 0,0,0,0 ); //该GUI控件只用于显示不用于输入
	}

	virtual	~GDE_GUIRoleManager()
	{
		for( int i = 0; i < roles_.size(); i++ )
		{
			delete roles_[i];
		}
		roles_.clear();
	}

	//增加角色
	void AddRole( int x, int y, int role_id, std::string filename )
	{
		RoleGuiUnit* tmp = new RoleGuiUnit( role_id, filename, x, y, pHGE );
		//RoleGuiUnitAutoPtr ptr( tmp );
		roles_.push_back(tmp);
	}

	//移除角色
	void RemoveRole( int role_id )
	{
		std::vector<RoleGuiUnit*>::iterator iter;
		for(iter = roles_.begin(); iter != roles_.end(); ++iter )
		{
			if( (*iter)->role_id == role_id )
			{
				RoleGuiUnit* ptr = *iter;
				roles_.erase( iter );
				delete ptr;
				return;
			}
		}
	}

	//设置人物位置
	void SetPos( int role_id , int x, int y )
	{
		std::vector<RoleGuiUnit*>::iterator iter;
		for(iter = roles_.begin(); iter != roles_.end(); ++iter )
		{
			if( (*iter)->role_id == role_id )
			{
				(*iter)->x = x;
				(*iter)->y = y;
				return;
			}
		}
	}

	//设置人物方向
	void SetDirection( int role_id , Direction d )
	{
		std::vector<RoleGuiUnit*>::iterator iter;
		for(iter = roles_.begin(); iter != roles_.end(); ++iter )
		{
			if( (*iter)->role_id == role_id )
			{
				(*iter)->direct = d;
				return;
			}
		}
	}

	//是否提示角色信息
	void RoleInfo( bool is_enable )
	{
		info_enable = is_enable;
	}

	//处理角色掉血信息
	void AttackInfo( int role_id, std::string txt )
	{
		int x,y;
		std::vector<RoleGuiUnit*>::iterator iter;
		for(iter = roles_.begin(); iter != roles_.end(); ++iter )
		{
			if( (*iter)->role_id == role_id )
			{
				(*iter)->SetAttackInfo( txt );
				break;
			}
		}
	}

	//渲染所有角色
	virtual void Render()
	{
		std::vector<RoleGuiUnit*>::iterator iter;
		for(iter = roles_.begin(); iter != roles_.end(); ++iter )
		{
			if( (*iter)->spr )
			{
				(*iter)->spr->RenderStretch( (*iter)->x, (*iter)->y, 
													(*iter)->x + (*iter)->w, 
													(*iter)->y + (*iter)->h );
			}

			if( (*iter)->attackinfo_show_count > 0 )
			{
				// TO DO 增加掉血值的alpha变化和位置变化,可以做的更绚
				int x = (*iter)->x + 10;
				int y = (*iter)->y - 20;
				font->Print( x,y,(*iter)->attackinfo.c_str() );
				(*iter)->attackinfo_show_count--;
			}
		}
	}
	//virtual bool	MouseLButton(bool bDown);
	//virtual void	MouseOver( bool bOver );
	//virtual bool	MouseMove(float x, float y);

private:
	HGE* pHGE;

	/*
	 by CG    2010-1-7		这个问题调了我半个小时~总结教训中。。
	 此处容器模板成员使用指针的原因:
	 vector模板成员RoleGuiUnit内涉及到无法复制的内容,如果不使用指针的话,在vector的push_back操作中会
	 出现run-time error,所以使用指针容器。
	 使用指针容器的时候需要注意,在erase或者clear其成员的时候,需要手动delete成员指针。(因为vector默认
	 在erase或者delete的时候调用该类的析构函数,若是指针,则无法释放其指向的内容。
	*/
	std::vector<RoleGuiUnit*> roles_;
	bool info_enable;//是否提示角色信息

};

#endif

 

 

分享到:
评论

相关推荐

    HGE-GUI_hgegui_hge_GUI_

    在HGE中,GUI(图形用户界面)是游戏与玩家交互的重要组成部分,而"HGE-GUI_hgegui_hge_GUI_"项目则是对HGE原生GUI功能的一个扩展,旨在增加更多的控件类型,以满足开发者对更丰富用户界面的需求。 这个项目主要...

    hge.zip_2D游戏_HGE 引擎1.81_hge_hge 引擎_游戏引擎

    《HGE引擎1.81:打造精彩2D游戏世界的基石》 在游戏开发的世界里,选择合适的引擎是至关重要的一步。HGE(Harnessing the Game Engine)引擎,作为一个专门针对2D游戏设计的工具,以其高效、易用的特点,为开发者...

    HGE_GUI.rar_hge

    【HGE GUI 知识详解】 HGE,全称Happy Game Engine,是一个...总之,HGE GUI 是HGE引擎的重要组成部分,为游戏开发者提供了便利的界面创建工具。通过深入学习和实践,即使是初学者也能快速构建出功能丰富的游戏界面。

    HGE游戏引擎超详细教程

    《HGE游戏引擎超详细教程》是一份专为游戏开发者准备的宝贵资源,它深入浅出地介绍了如何利用HGE引擎进行游戏开发。HGE全称为"Hidden Gem Engine",是一款基于DirectX8技术的游戏开发框架,特别适用于使用Delphi编程...

    GLOGUI 一个可与HGE游戏引擎结合的GUI

    然而,HGE本身并未内置完善的GUI系统,因此开发者通常需要寻找合适的第三方库来扩展其GUI功能。GLOGUI就是这样一款针对HGE设计的GUI解决方案,它能够与HGE完美融合,提供丰富的界面元素和灵活的交互功能。 GLOGUI的...

    visual c++游戏开发 hge游戏引擎+GUI文本输入框.zip

    《Visual C++游戏开发:基于HGE游戏引擎与GUI文本输入框》 在游戏开发领域,Visual C++凭借其强大的编程能力和高效的性能,一直是开发者们的首选工具之一。本压缩包中的资源,着重介绍了如何利用HGE(Harnessing ...

    HGE游戏引擎+GUICHAN,GUI界面支持中文.zip

    《HGE游戏引擎与GUICHAN GUI界面支持中文详解》 在游戏开发领域,选择一个高效且功能丰富的游戏引擎是至关重要的。HGE(Hardly Growing Engine)是一款轻量级的游戏开发框架,它以其小巧、易用和强大的性能受到许多...

    HGE引擎M2说明书.chm

    HGE引擎M2说明书.chm

    hge游戏引擎资料

    1. **hge教程.doc**:这份文档可能是hge引擎的基础教程,涵盖了引擎的基本结构、安装过程、初始化设置以及基本的游戏对象创建。它会引导你了解hge的核心API,如渲染、声音管理、文件系统操作等。 2. **HGE基础教程....

    【HGE引擎】【第二课】配置单机登陆器

    【HGE引擎】【第二课】配置单机登陆器

    HGE引擎+风魂+详细教程

    HGE引擎+风魂+详细教程+源代码 HGE-CN.chm Hge图+声+Z-Buffer.doc 2D游戏引擎_HGE的一个简单教程.pdf 1 HGE基础介绍.doc 2 HGE架构图介绍.doc 3 HGE 核心 层介绍.doc 4 HGE输入介绍.doc 5 HGE渲染介绍.doc 6 HGE...

    HGE引擎开发的例子

    《HGE引擎开发实例解析》 HGE,全称Happy Game Engine,是一款高效、轻量级的游戏开发引擎,尤其适合初学者入门。本篇将深入探讨HGE引擎在游戏开发中的应用,通过一个简单的实例来阐述其核心概念和技术要点。 一、...

    HGE游戏引擎源码,可供研究学习

    3. **引擎扩展**:开发者可以根据需求对HGE进行定制,添加新的功能或优化现有模块。 五、注意事项 在使用HGE进行开发时,需要注意遵循相关的开源协议,尊重作者的知识产权。同时,对于HGE提供的资源管理、音频和...

    HGE引擎修复工具

    【HGE引擎修复工具】 HGE(HGE - Hardware accelerated Game Engine)是一个高效的游戏开发引擎,专注于2D游戏制作。这个引擎提供了丰富的功能,包括图形渲染、音频处理、物理模拟、资源管理等,旨在简化游戏开发...

    改进HGE的GUI结构

    对二维游戏引擎HGE的GUI的改进,很有价值的!

    HGE引擎源代码 提供学习

    4. **扩展与定制**:学习如何基于HGE进行二次开发,以适应特定的游戏需求。 5. **实践应用**:尝试用HGE开发一个简单的游戏,将理论知识转化为实际技能。 提供的`hge.zip`和`hge(1).zip`可能是HGE引擎的不同版本或...

    基于HGE引擎的飞机游戏

    《基于HGE引擎的飞机游戏》是一款非常适合初学者学习的游戏项目,它利用了HGE(HappyGameEngine)这一强大的游戏开发引擎。HGE是用C++编写的,它提供了丰富的功能,包括图形渲染、音频处理、物理模拟以及资源管理等...

    HGE中文文档 SDK 引擎 例程

    《HGE中文文档 SDK 引擎 例程》是一份专为开发者准备的资源集合,旨在帮助用户理解和应用HGE引擎进行游戏开发。HGE,全称“Hard Gay Engine”,是一个开源的游戏开发库,它提供了丰富的功能,包括图形渲染、音频处理...

    游戏引擎HGE结合Lua脚本 教程.zip

    游戏开发中的一个重要环节是使用游戏引擎来创建交互式体验,而HGE(Hyper Game Engine)是一个面向初学者和专业人士的开源游戏开发框架。这个“游戏引擎HGE结合Lua脚本 教程.zip”压缩包提供了关于如何利用HGE与Lua...

    hge游戏引擎+angelscript游戏脚本(.as)的用法.zip

    源代码的阅读有助于我们理解hge的事件处理、对象管理以及游戏逻辑的构建。 在hge中,游戏界面GUI的实现是一项重要任务。通过《HGE中的游戏GUI代码阅读.doc》,我们可以学习到如何利用hge内置的GUI组件如按钮、标签...

Global site tag (gtag.js) - Google Analytics