将CEGUI整合进Irrlicht
早就听说CEGUI是一款优秀的游戏GUI库,并且除了能够支持OpenGL、Direct3D9、Direct3D11以外,还可以支持高层的游戏引擎,例如Ogre和Irrlicht。我非常想尝试一下,网上有关CEGUI的例子又不是很多,所以自己花了大概几天的时间,研究了自带的文档,顺利地进行了整合。
原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/22824077
演示程序和源代码下载地址:这里
下面是演示程序的截图:
使用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( ); }