遮挡关系 由xml中出现的顺序决定 控件有属性 alwaysOnTop true
相对坐标 绝对坐标 x=scale*Width+offset
shcema
looknfeel
layout
imageset 换时 <Imageset Name="TaharezLook" Filename="schema/taharezlook.imageset" /> 在scheme里加入
大小写敏感
纹理透明this->_staticImages[tex]->setBackgroundEnabled(false);
checkbosxcheckmode 前面打勾的XXXX 才不是打钩呢 是实现互斥的 多个checkbox要实现radiobox的效果 就用 setmode “1”
cegui sdk里的sample整理
建立一个窗体
字体
扫雷
tabcontrol
scrollablePanel
text
tree
dragdrop
falagard 这是一个皮肤系统
一些乱七八糟的控件
官网 入门教程
一。渲染
Ogre3D
CEGUI::OgreCEGUIRenderer* myRenderer = new CEGUI::OgreCEGUIRenderer( myRenderWindow );
2. 创建 CEGUI::System 对象来对系统进行初始化
这一步更简单。只需new一个CEGUI::System对象,并把刚创建的CEGUI::Renderer对象的指针传送给它即可。这时整个系统将自动初始化。
new CEGUI::System( myRenderer );
3. 调用渲染函数
这一步有点特殊,所使用的引擎不同,此步的代码也会不同。不过,说白了,你所要做的只是在每帧渲染后调用CEGUI::System::renderGUI而已。使用Ogre3D的同学该高兴了,因为它将由Ogre3D自动完成。
二。资源 resource provider
我将用一个完整的例子向你展示CEGUI的例子框架是怎样初始化资源组、初始化它们的目标路径以及怎样为所有的资源类型设置默认资源组的。
当像往常一样初始化CEGUI::System对象之后,我们就设置一组资源组和它们的路径:
// 为DefaultResourceProvider设置所需的路径 CEGUI::DefaultResourceProvider* rp = static_cast (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/"); // 这步仅当你使用Xerces作为XML解析器的时候才需要 rp->setResourceGroupDirectory("schemas", "http://www.cnblogs.com/XMLRefSchema/");
完成这步以后,我们就把资源组和它们的路径都设置好了。最后,为了让系统使用新设置的路径,我们来设置默认资源组:
// 设置默认资源组
CEGUI::Imageset::setDefaultResourceGroup("imagesets");
CEGUI::Font::setDefaultResourceGroup("fonts");
CEGUI::Scheme::setDefaultResourceGroup("schemes");
CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
CEGUI::WindowManager::setDefaultResourceGroup("layouts");
CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
// 仅当你用xerces做XML解析器,并为它定义了一个资源组的时候使用
,xerces是个例外,它是“基于Xerces-C的XML解释器(Xerces-C based XML parser)”。对此,有一个特殊的资源组设置文件,它指明schema文件在哪里(它们是用来检查xml的.xsd文件)。对于这个特殊情况,它的静态成员如下:
const String& XercesParser::getSchemaDefaultResourceGroup();
void XercesParser::setSchemaDefaultResourceGroup(const String&
groupname);CEGUI::XercesParser::setSchemaDefaultResourceGroup("schemas");
三。数据文件 xml
Imageset 这么说吧,通常,为了提到效率,我们需要把材质等图片组合成一个大的材质图片。在使用的时候就需要在它上面截取得到各个小材质。而这个Imageset就是保存各个小材质在整张源图片上的区域信息(源图片同样在Imageset中指定了)。每个区域信息都有一个独一无二的名字,当提到它们的名字的时候,系统就把它们当作图片处理。所以,也可以说Imageset中定义了一系列的图片。通过修改Imageset中的源图片名、各个小区域的位置和大小,就可以很轻松的改变所画GUI的外观。
Font 显而易见,Font文件定义了CEGUI使用的字体。所能定义的字体类型有两种:
FreeType Font 这是一种基于true-type(.ttf)的字体文件。从CEGUI 0.5.0开始,在.font文件中用Type="FreeType"指定这种字体类型。在更早的版本中,用"Dynamic"指定。
Pixmap Font 这种字体就是众所周知的位图字体,这种字体基于一个定义了文字图片的Imageset。从CEGUI 0.5.0开始,在.font文件中用Type="Pixmap"指定此字体。在更早的版本中,用"Static"指定。
Scheme Scheme文件是把其他数据文件联系到一起的主要手段,同时它也是装载和定义各种控件最方便的方法。一个Scheme文件可以包含下面的一种或多种文件(当Scheme被载入的时候,它所包含的文件也将被载入并初始化):
WindowSet 主要用来指明一个可载入模块(.dll,.so等)的名字,并列出它所使用的控件中你想注册的控件的名字。如果没有列出任何控件名,那么模块中所有的控件都将被注册。
WindowRendererSet 指明一个可载入模块(.dll等)的名字,并列出它所使用的窗口渲染器(window renderer)中你想注册的窗口渲染器的名字。如果没有列出任何窗口渲染器名,那么模块中所有的窗口渲染器都将被注册。“窗口渲染器”是一个可以控制基本窗口类型渲染的东西。所有的窗口渲染器都是利用'Falagard'蒙皮系统进行渲染的(尽管这不是非常必须的)。
WindowAlias 提供通过别名指定一个窗口/控件类型的方法。用此方法,也可以用另一个控件类型来“替代”一个已经注册的控件类型,这样就达到隐藏已注册控件的效果。
FalagardMapping 用来创建一个可用的WindowType类型。包含三个部分:TargetType --- 指定基类(具有相关功能);Renderer --- 指定窗口渲染器(可以控制渲染指定的TargetType);LookNFeel --- 指定要使用的皮肤(一般这个它们是通过XML格式的looknfeel文件指定)。
Layout Layout文件用XML格式描述一个窗口的布局。每个镶嵌的“Window”元素定义一个要创建的窗口或控件,“Property”元素为每个定义的窗口设置相关属性。
(前三个 没用过 不懂)
// 载入scheme文件,它将自动载入TaharezLook imageset CEGUI::SchemeManager::getSingleton().loadScheme(
"TaharezLook.scheme" );
// 载入font文件。第一个被载入的字体文件将自动成为默认字体。 if(! CEGUI::FontManager::getSingleton().isFontPresent(
"Commonwealth-10" ) )
CEGUI::FontManager::getSingleton().createFont(
"Commonwealth-10.font" );
我们不再需要指定一个默认字体,因为FontManager会自动的设置第一个被载入的字体为默认字体。如果它不是你想要的默认字体,你可以设置为其他的。设置的代码如下: System::getSingleton().setDefaultFont( "Commonwealth-10" );
另一个你需要设置默认值的是鼠标指针。这么做是为了确保当鼠标位于那些没有设置指针的控件上时不至于消失。设置默认鼠标指针的代码如下(本示例使用由上面的scheme载入的TaharezLook imageset):
System::getSingleton().setDefaultMouseCursor( "TaharezLook", "MouseArrow" );
四 。创建窗口
继承机制:很多的设置都会被继承下去 CEGUI中,窗口的很多的设置和属性都会按窗口父子等级向下传递。比如:如果你将一个窗口的alpha透明度设置为0.5,那么,默认情况下,所有附属于那个窗口的子窗口/组件都将受到影响。同时要注意:子窗口的实际设置并没有改变 ---- 最终的属性值通常是由最顶层到当前窗口所有属性值组合而成的。好多东西都有这个规律,比如窗口的销毁:默认情况下,一个窗口在销毁的时候将销毁它的所有子窗口。这一机制最大的优点是:通过改变根窗口的alpha透明度、显示/隐藏、激活/禁用状态等可以很轻易的控制整个GUI;通过简单的销毁根窗口就可以轻松的清空整个GUI。当个别窗口需要更精确的控制或有更好的管理技术用的时候,可以更改这一默认继承机制。
System::setGUISheet函数用来指定一个窗口作为GUI的根窗口。这将替换掉当前的根窗口,但是要注意:之前的一系列窗口/控件并没有被销毁,只是从当前的显示链中摘除 ---- 通过使用setGUISheet函数,你可以轻松的在多个GUI中切换。
using namespace CEGUI; WindowManager& wmgr = WindowManager::getSingleton();
Window* myRoot = wmgr.createWindow( "DefaultWindow", "root" ); System::getSingleton().setGUISheet( myRoot );
FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow("TaharezLook/FrameWindow", "testWindow" );
myRoot->addChildWindow( fWnd );
// 定位在其父窗口左上角开始的1/4位置 fWnd->setPosition(UVector2( UDim( 0.25f, 0 ), UDim( 0.25f, 0 ) ) );
// 设置其大小为其父窗口的一半 fWnd->setSize( UVector2( UDim( 0.5f, 0 ), UDim( 0.5f, 0 ) ) );
最后,我们为这个框架窗口的标题栏设置一个标题: fWnd->setText( "Hello World!" );
等价layout文件
using namespace CEGUI; Window* myRoot = WindowManager::getSingleton().loadWindowLayout("test.layout" );
System::getSingleton().setGUISheet( myRoot );
<?xml version="1.0" ?> <GUILAYOUT> <WINDOW Type="DefaultWindow" Name="root">
<WINDOW Type="TaharezLook/FrameWindow" Name="testWindow"> <Property Name="UnifiedPosition" Value="{{0.25,0},{0.25,0}}"></Property> <Property Name="UnifiedSize" Value="{{0.5,0},{0.5,0}}"></Property> <Property Name="Text" Value="Hello World!"></Property> </WINDOW>
</WINDOW> </GUILAYOUT>
五 。输入
bool injectMouseMove( float delta_x, float delta_y ); bool injectMousePosition( float x_pos, float y_pos ); bool injectMouseLeaves( void ); bool injectMouseButtonDown( MouseButton button ); bool injectMouseButtonUp( MouseButton button ); bool injectKeyDown( uint key_code ); bool injectKeyUp( uint key_code ); bool injectChar( utf32 code_point ); bool injectMouseWheelChange( float delta ); bool injectTimePulse( float timeElapsed );
六 统一坐标系
* UDim : 简单的一维 * UVector2 : 由两个UDim组成的二维向量 (x(udim),y(udim)) * URect : 用四个UDim表示一个矩形,依次为:左,上,右,下
七。tags 就是一个[] 这种东西 在 text里 可以嵌入 很多东西
1颜色属性 2 字体属性 3图片 4 图片size 5 文字的位置 像次幂那种 6 pad 好像还是 嵌入位置的意思 7 窗体
本来贴了很多相关代码的 但是 这个破博客 保存好慢 急着走 就都没了 这里是原文链接http://www.cegui.org.uk/wiki/index.php/Formatting_Tags_in_CEGUI 我实在懒得再贴 我都贴两遍了
===========================
以下几章都是 关于 ui在脚本里实现的方法的
八。初始化 脚本
九。处理事件