将CEGUI整合进Irrlicht

将CEGUI整合进Irrlicht

       早就听说CEGUI是一款优秀的游戏GUI库,并且除了能够支持OpenGL、Direct3D9、Direct3D11以外,还可以支持高层的游戏引擎,例如Ogre和Irrlicht。我非常想尝试一下,网上有关CEGUI的例子又不是很多,所以自己花了大概几天的时间,研究了自带的文档,顺利地进行了整合。

原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/22824077

       演示程序和源代码下载地址:这里

       下面是演示程序的截图:

将CEGUI整合进Irrlicht_第1张图片

       使用CEGUI,比我想象地要简单。首先,CEGUI的很多对象是单例,和Irrlicht的面向接口编程一样,因此大家不必担心变量的生存期和作用域的问题,如果需要调用的话,基本就类似于

SchemeManager::getSingleton( ).createFromFile( "TaharezLook.scheme" );

这样的调用。其次,CEGUI对于不同渲染器提供了两种初始化的方法,既有简单化的引导系统(bootstrap system),也有自己单独创建的方法。使用引导系统的话,CEGUI::System类会随着渲染器的创建而创建,CEGUI其它的子系统例如ImageManager和SchemeManager它们的单例随着它们各自的单例引用而被创建,最后再CEGUI::System类析构的时候,会调用destroySingletons()函数将所有单例的指针全部删除,这样保证了内存不被泄漏。

       CEGUI对于资源的管理有着叫做“资源供应者”(Resource Provider)的管理方式,在我看来,其实呢,就是将资源路径进行了映射,目前只了解了这么多。CEGUI可能会支持从压缩包里载入资源、从网络中载入资源等资源载入的方式。

       下面一段代码展示了演示程序初始化CEGUI环境、渲染CEGUI环境以及回收CEGUI环境。

#include <iostream>
#include <CEGUI/DefaultResourceProvider.h>
#include "MasterInclude.h"
/*---------------------------------------------------------------------------*/
bool InitCEGUI( IrrlichtDevice& device )
{
	using namespace std;
	using namespace CEGUI;
	try
	{
		// 1、采用CEGUI适配Irrlicht的引导系统(bootstrap system)来初始化CEGUI的环境
		IrrlichtRenderer& ciRenderer = IrrlichtRenderer::bootstrapSystem( device );

		// 2、设定默认的资源供应者
		DefaultResourceProvider* rp = static_cast<DefaultResourceProvider*>(
			System::getSingleton( ).getResourceProvider( ) );
		rp->setResourceGroupDirectory( "imagesets", "." );
		rp->setResourceGroupDirectory( "scheme", "." );

		// 3、设置图片集
		ImageManager::setImagesetDefaultResourceGroup( "imagesets" );
		ImageManager::getSingleton( ).loadImageset( "TaharezLook.imageset" );

		// 4、设置窗体方案
		SchemeManager::getSingleton( ).createFromFile( "TaharezLook.scheme" );

		// 5、创建窗口
		WindowManager& wm = WindowManager::getSingleton( );
		Window* pRootWindow = wm.createWindow(
			"DefaultWindow",		// 类型
			"root" );				// 名称
		System::getSingleton( ).getDefaultGUIContext( ).setRootWindow( pRootWindow );
		FrameWindow* pFrameWindow = static_cast<FrameWindow*>(
			wm.createWindow( "TaharezLook/FrameWindow",
							 "testWindow" ) );
		pRootWindow->addChild( pFrameWindow );

		// 6、设置带边框的窗口的位置大小等信息
		// 这里UDim是一个结构,其包含了缩放和偏移信息
		pFrameWindow->setPosition(
			UVector2( UDim( 0.25f, 0.0f ), UDim( 0.25f, 0.0f ) ) );
		pFrameWindow->setSize(
			USize( UDim( 0.5f, 0.0f ), UDim( 0.5f, 0.0f ) ) );
		pFrameWindow->setText( "Hello Irrlicht and CEGUI!" );
		pFrameWindow->setAlpha( 0.8f );
	}
	catch ( CEGUI::Exception& e )
	{
		cout << "创建CEGUI失败!原因是:" << e.getMessage( ) << "程序将退出。\n";
		getchar( );
		return false;
	}

	return true;
}
/*---------------------------------------------------------------------------*/
void RenderCEGUI( void )
{
	CEGUI::System::getSingleton( ).renderAllGUIContexts( );
}
/*---------------------------------------------------------------------------*/
void ReleaseCEGUI( void )
{
	CEGUI::IrrlichtRenderer::destroySystem( );
}

 

你可能感兴趣的:(Irrlicht,CEGUI)