你的第一个CEGUI程序
强烈建议仔细研究CEGUISample程序!因为那里介绍了它的一些基本用法,其实最后在游戏当中出现的,也就是这些例子的变化而已。
这里我会引导你写一个第一个自己的简单的CEGUI程序,它使用CEGUISampleHelper提供的框架,使用OpenGL渲染。
这是在CEGUI自己给的Sample程序基础上简化、简化、再简化得出的,目的是让大家对CEGUI程序有一个简单明了的认识,其实就是这么简单。里面只定义了一个背景,一个静态文本,写着“Hello!CEGUI”。
具体的,有几块重要的东西。有一些包含在框架里了,如下:
DefaultResourceProvider,这个是CEGUI的一个全局的东西,可以在任何地方操作它的指针,但是一般只需要在一开始操作它。
在CEGuiOpenGLBaseApplication当中,你可以看见下面这样的代码,这就是在使用DefaultResourceProvider的指针在设置资源的路径,你可以毫不客气地复制粘贴到你的工程里
CEGUI::DefaultResourceProvider
*
rp
=
static_cast
<
CEGUI::DefaultResourceProvider
*>
(CEGUI::System::getSingleton().getResourceProvider());

rp
->
setResourceGroupDirectory(
"
schemes
"
,
"
../datafiles/schemes/
"
);
rp
->
setResourceGroupDirectory(
"
imagesets
"
,
"
../datafiles/imagesets/
"
);
rp
->
setResourceGroupDirectory(
"
fonts
"
,
"
../datafiles/fonts/
"
);
rp
->
setResourceGroupDirectory(
"
layouts
"
,
"
../datafiles/layouts/
"
);
rp
->
setResourceGroupDirectory(
"
looknfeels
"
,
"
../datafiles/looknfeel/
"
);
rp
->
setResourceGroupDirectory(
"
lua_scripts
"
,
"
../datafiles/lua_scripts/
"
);
下面是整个的代码:
#ifndef _TDemo0_h_
#define
_TDemo0_h_

#include
"
CEGuiSample.h
"
#include
"
CEGUI.h
"

//
例子类
class
TDemo0Sample :
public
CEGuiSample

...
{
public:
// 用于实现初始化的方法
bool initialiseSample();

// 关闭
void cleanupSample(void);
}
;
#endif
//
_TDemo0_h_
#include
"
TDemo0.h
"
#include
"
CEGUI.h
"
#include
"
CEGuiBaseApplication.h
"
#include
<
cstdlib
>


/**/
/*************************************************************************
程序入口
*************************************************************************/
int
main(
int
argc,
char
*
argv[])

...
{
TDemo0Sample app;
return app.run();
}


/**/
/*************************************************************************
实现初始化方法
*************************************************************************/
bool
TDemo0Sample::initialiseSample()

...
{
using namespace CEGUI;

// 得到窗口管理器
WindowManager& winMgr = WindowManager::getSingleton();
// 装载资源,只说一下scheme就行,其它的system自己去调
SchemeManager::getSingleton().loadScheme("TaharezLook.scheme");
// 鼠标指针很特殊,但是其实是一样的用法
System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow");
// 字体
FontManager::getSingleton().createFont("Commonwealth-10.font");

// 这里创建了一个window。第一个参数指定了这个window的类型,第二个参数是名字。
Window* background = winMgr.createWindow("TaharezLook/StaticImage", "background_wnd");
// 设置位置和大小
background->setPosition(UVector2(cegui_reldim(0), cegui_reldim( 0)));
background->setSize(UVector2(cegui_reldim(1), cegui_reldim( 1)));

// 这就要把刚才那个background用作最底层的窗口了
System::getSingleton().setGUISheet(background);

// 其实这个在这里没啥用,我认为,只是多了一层窗口。在任何UI系统当中所有的窗口都是一样的。
Window* sheet = winMgr.createWindow("DefaultWindow", "root_wnd");

// 叠加上
background->addChildWindow(sheet);

// 又创建了一个窗口,这回是一个静态的文本
Window* st = winMgr.createWindow("TaharezLook/StaticText", "TextWindow/Static");
sheet->addChildWindow(st);
st->setPosition(UVector2(cegui_reldim(0.45f), cegui_reldim( 0.23f)));
st->setSize(UVector2(cegui_reldim(0.15f), cegui_reldim( 0.05f)));
st->setText("Hello!CEGUI");
return true;
}


/**/
/*************************************************************************

*************************************************************************/
void
TDemo0Sample::cleanupSample()

...
{
// 啥事也不做
}
好了,现在可以新建一个工程,模仿其它例子的工程结构,然后用这个代码,编译,就OK了。
这就是(或者几乎是一个)最简单的CEGUI程序,其实就是这么简单。