使用CEGUI coding

来源:互联网 发布:学java编程要什么电脑 编辑:程序博客网 时间:2024/05/19 09:38

创建一个CEGUI窗口

这个指南的目的是让我们创建一个简单的窗体然后显示到屏幕上。在开始这个前,理解上面两节是很重要的。因为这节是建立在它们的基础上。
   内容:
   介绍窗口和部件的概念
   每个部件就是一个窗体
   许多设置是被继承的
   创建窗口
   GUI的创建通过C++代码
   XML layouts
   总结
   介绍窗口和部件的概念
在读这个指南前,有很多基本思想你需要考虑。
   每一个部件(widget)是一个窗体
这里有一个重要的概念需要掌握。在CEGUI系统内每个部件(widget)都继承于同样的窗口基了;为了这个指南的目的,无论你什么时候提到一个窗体,这个同样的意思可以很容易的应用到一个下压按钮或滚动条部件。

   许多设置是被继承的
在CEGUI中许多窗体可用到的设置和属性都可以继承获得。例如,如果你设置了一个特殊的窗口的透明度为0.5,默认的所有附加到那个窗口的窗口和部件都会因为高层窗口的改变而改变。当前窗体的设置值是由它以上的所有窗口的设置值的组合。还有,默认当一个窗口被析构的时候它下面的所附加的子窗口或部件都会被析构。这样的好处是当你对根窗口进行设置后就会对它下面的窗口产生影响。比如: alpha,visibility,enable/disabled 状态,简单的删除根窗口就可以清除整个GUI layout。
   创建窗口
足够多的闲谈了!让我们创建一个窗口吧。
   有两种方法:
   通过C++代码
   XML layout文件
每种方法都会在下面讨论
   GUI的创建通过C++代码
在CEGUI里所有的窗口创建都是通过WindowManager对象。你可以通过getSingleton函数来获得这个对象,下面是具体代码:
Using namespace CEGUI;
WindowManager& wmgr=WindowManager::getSingleton();
一般,你将使用众所周知的一个DefalutWindow(或者使用它的老名字,DefaultGUISheet)作为你GUI的根(root)窗口。
所以我们创建一个默认窗口DefaultWindow,设置它为GUI的根’GUI Sheet’
Window* myRoot=wmgr.createWindow(“DefaultWindow”,”root”);
System::getSingleton().setGUISheet(myRoot);

WindowManager的创建窗口方法有两个字符作为参数。第一个”DefaultWindow”告诉系统你想创建的窗口类。一般,有效的窗口类型是那些你通过加载你的主题(scheme)文件注册的类型。但某些,像DefaultWindow,是全局类型,它本来就可以用了。第二个参数”root”是唯一分给这个窗口的名字。这个名字可以用来重新找回一个窗口的指针(通过WindowManager)。
注意:命名你的跟窗体为”root”不是必须的。但一般都这样。

调用System对象的setGUISheet方法将指定一个窗体做为GUI的根窗体。这将取代当前任何的根窗体,即使前一个窗体链还没有给销毁。可以通过setGUISheet方法来简单实现翻转GUI页。

现在你已经创建了你的第一个窗口然后附加到GUI系统里,这个系统将用这个窗体作为GUI的根窗体。但是,如果你编译这个简单的程序依然没有任何东西。为什么这样?我们的程序没有任何错误,我们创建的DefaultWindow默认窗口整体上是不可见的!这就是为什么我们用它作为根窗体,它只用来附加其它窗体和部件。
这里我们将创建一个框架(Frame)窗口,它有一个标题栏,可以移动和改变大小。
FrameWindow* fWnd=(FrameWindow*)wmgr.createWindow(“TaharezLook/FrameWindow”,”testWindow”);
这里我们创建了一个”TaharezLook/FrameWindow”类型的窗口。testWindow是这个窗口的名字。
为了系统利用我们新的窗体,我们需要附加这个窗口到根窗体。下面是附加代码:
myRoot->addChildWindow(fWnd);
现在,我们可以设置我们窗口的初始位置和大小:
fWnd->setPosition(Point(0.25f,0.25f));
fWnd->setSize(Size(0.5f,0.5f));
上面是早期版本的方法,下面是新版本的:
Real a=0.0f;
Real b=0.0f;
Real c=0.1f;
CEGUI::UDim xpos(a,b);//按钮X坐标为: 窗口宽度*a+b
CEGUI::UDim ypos(a,b);//按钮Y坐标为: 窗口高度*a+b
CEGUI::UDim width(c,a);//按钮宽度为: 窗口宽度*c+a
CEGUI::UDim height(c,a);//按钮高度为: 窗口高度*c+a
fWnd ->setPosition(CEGUI::UVector2(xpos, ypos));
fWnd ->setSize(CEGUI::UVector2(width, height));
最后,我们设置框架窗口的标题栏的标题。

fWnd->setText(“Hello World!”);

就这么多!当编译这个应用程序,你将看到一个简单的框架窗口在显示中间。
   XML layouts
所有以上的工作都非常号,但有一个主要缺点;任何时候你想调节GUI layout,你需要编辑你的代码,然后重新编译一次。如果我们能在外部指定GUI layout,然后让你的代码通过一个文件加载一个layout.这时我就只需要关注layout文件的编写,改变文件就是改变执行时显示的界面,不需要重新编译代码了。

这个系统支持XML layout文件,它可以通过WindowManager的loadWindowLayout方法加载。这个方法创建你所有的窗口,返回加载层的根指针(也就是最外部的那个Window标签的窗体)。
所以,首先我们需要定义一个layout文件。下面的XML保存为一个文本文件,扩展名为layout。它等价于上面代码的实现:
//CEGUI version<0.04
<?xml version=”1.0” ?>
<GUILayout>
<Window Type=”DefaultWindow” Name=”root”>
   <Window Type=”TaharezLook/FrameWindow” Name=”testWindow”>
    <Property Name=”Position” Value=”x:0.25 y:0.25” />
    <Property Name=”Size” Value=”w:0.5 h:0.5” />
    <Property Name=”Text” Value=”Hello World!” />
   </Window>
</Window>
</GUILayout>
//CEGUI version>=0.04
<?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 Name=”UnifiedSize” Value=”{{0.5,0},{0.5,0}}” />
    <Property Name=”Text” Value=”Hello World!” />
   </Window>
</Window>
</GUILayout>
这个窗体(Window)的成员(Elements):Type和Name就是我们用WindowManager对象的createWindow方法所需要的参数。属性用来设置一个窗口的属性。一个窗口(Window)有很多属性(Property),更多属性查看CEGUI的API,namespace List的CEGUI::WindowProperies
,最后保存该文件为”test.layout”,你可以加载这个layout,然后设置它返回的窗口做为根(root)窗口。代码如下:
Using namespace CEGUI;
Window* myRoot=WindowManager::getSingleton().loadWindowLayout(“test.layout”);
System::getSingleton().setGUISheet(myRoot);
最后的结果和我们用代码一样的结果,唯一不同就是可以通过修改test.layout来修改界面,这样就不会该代码和重新编译。
   总结
你已经明白怎么创建基本的窗口,怎么创建一个简单的窗口层次。怎么修改窗口的设置。你已经明白怎么用代码和XML layout文件来完成GUI。可能在不同应用有不同的使用这两种方法。
加载数据文件和初始化

如果你已经读了“开始CEGUI渲染”,你可能执行了基本的CEGUI初始化工作,然后调用System::renderGUI 函数,这样非常好了。但让它显示出来了,你仍然不能画任何东西。这一节就是讲我们怎样加载数据文件,以使得CEGUI有源材料用来渲染。
   内容:
   概要: 数据文件和资源提供器(ResourceProvider)
   资源提供器——什么是资源提供器
   XML, XSD? 全是XML!
   数据文件
   图像集(Imageset)
   字体(Font)
   主题(Scheme)
   面板(Layout)
   配置(Config)
   加载基本的文件
   简单默认初始化
   总结
   概要: 数据文件和资源提供器(ResourceProvider)
CEGUI使用许多类型的数据文件,以至于我们在初始化时可能有一些混乱,它们之间的关系是什么,它们又怎么被加载?在开始学习所有这些前,我将介绍一下这些数据文件,它们是什么,它们被用来做什么,它们怎么被加载进CEGUI。

   资源提供器——什么是资源提供器
CEGUI利用一个帮助对象——他就是资源提供器(ResourceProvider).这个对象为CEGUI核心库和外部文件加载系统之间提供一个接口。
例如,Ogre和Irrlicht引擎有他们自己的资源管理器/文件加载子系统通过实现和提供以个专门的资源提供器对象,这些引擎的渲染模块和这些系统是无缝的结合。所以CEGUI数据文件加载通过这些系统。

Direct3D和OpenGL渲染者不是,默认的一个指定资源提供器,这些系统默认加载所有资源从当前应用程序的当前目录。

   XML, XSD? 全是XML!
除了图形文件和加载模块(DLLs/等等),所有用在CEGUI的文件是XML。这是人们陷入的第一个障碍。The schema(.xsd)文件
默认的,CEGUI使用Xerces-C++来处理分析XML文件(Xerces又是一个库)计划校验。计划校验意味着它是用来检查,在分析时候,确定是否输入文件包含期望的数据,那个数据被正确的指定。为了实现这个,系统需要一些附加的文件(就是我们提到的schema files计划文件,它是.xsd文件扩展名字)。总之,唯一你需要了解的是这些*.xsd文件,一般你需要copy一个恰当的*.xsd文件在XML文件的同一目录。

   数据文件
正如上面提到的,除了一些例外,在CEGUI所有的数据的文件是XML。但并不是要以’.xml’为扩展名,这些数据文件命名根据文件的实际代表意义。如: *.imageset是一个Imageset,*.font是一个Font。这样就会根据文件扩展就能知道大体里面要描述些什么。
   图像集(Imageset)
Imageset就是图像/纹理文件的一个集合。每一个定义层都只能有唯一的名字,它被系统当作是一个图像。你可以修改定义层的位置和大小,来改变它的显示。
   字体(Font)
一个字体文件,毫无疑问,定义CEGUI里使用的字体。有两种字体类型可以被定义。
FreeType Font:
这是是一种基于true-type font(*.ttf)的文件。在CEGUI的0.5.0版本,通过Type=”FreeType”来指示,以前版本用”Dynamic”动态的。
Pixmap Font
也被认为是一个位图字体(bitmapped font),这种类型字体是基于一个Imageset。在CEGUI 0.50版本中,用Type=”Pixmap”来指示。以前版本用”Static”
   主题(Scheme)
主题就是将其它数据文件组合起来形成一个主题。它是最普遍的方法用来加载注册部件类型。一个主题可以包含一个或多个下面的东西(当主题加载,它们也将被加载初始):
Imageset
Font
Window set
Window Alias
Imageset和Font已经被提到。
一个Window set是定义一个可加载的模块(.dll/.so, 等等)。包含一组我们想注册给系统的部件。
一个Window Alias提供一个解释,有window/widget 两种类型。它也可以用一个部件来隐藏已经注册了部件。
   面板(Layout)
一个layout 文件是用XML来描述一个窗口面板包含的东西,也就是一个Layout就是一个窗口面板,我们来为它加东西。还可以嵌套”Window”,每个Window有“Property”成员来对窗体设置属性。

   配置(Config)
CEGUI支持一个config文件的使用。这个文件允许你定义一些默认的加载比如一个主题Scheme,一个layout。
   加载基本的文件
为了充分理解这些,我们需要加载一些文件,至少需要加载如下文件:
Imageset, Font, Scheme
关于Scheme文件的好处就是可以自动的加载其它两个文件。为了这个指南需要我们将加载一个scheme文件和一个font文件。下面是代码:
// 加载主题(scheme)文件,它将自动的加载TaharezLook imageset(图像集)
CEGUI::SchemeManager::getSingleton().loadScheme(“../datafiles/schemes/TaharezLook.scheme”);
//加载一个字体,
CEGUI::FontManager::getSingleton().createFont(“../datafiles/fonts/Commonwealth-10.font”);
Ogre用户的主要提示:
为了使用没有修改的例子数据文件,你必须确性当前工作地址被指定。一般通过(resources.cfg文件),不然找不到我们的*.font和*.scheme。
   简单默认初始化
最后,你需要指定一些默认的设置。这将保证系统总是有一个字体和鼠标可用。
实际上,我们不需指定默认的字体,字体管理器(FontManager) 将自动的设置加载的第一个字体作为默认的字体。假如这不是你需要的默认字体,你可以设置不同的。下面是设置默认字体方法:
System.getSingleton().setDefaultFont(“Commonwealth-10”);

下一个需要设置的默认对象是鼠标。这将保证我们鼠标的图案显示出来。下面代码是设置默认的鼠标(它使用了TaharezLook 图像集(imageset),它将伴随主题(scheme)一起被加载。)
System::getSingleton().setDefaultMouseCursor(“TaharezLook”,”MouseArrow”);

   总结
这节我们学习了CEGUI里使用的各种数据文件的基本东西
怎么加载,CEGUI应用至少需要的文件。Imageset,Font,Scheme

 

 

内容:
   开始CEGUI渲染——在渲染前怎样初始化CEGUI
   加载数据文件和初始化——怎么加载些数据文件和执行基本的系统初始化
   创建一个CEGUI窗口——怎样创建个简单的窗口和让它显示到屏幕
   注入输入事件——怎么向CEGUI注入输入然后实现交互
   开始CEGUI渲染
无论你使用的Engine是什么,如果你使用CEGUI来渲染,你必须做下面基本的三步骤:
1. 创建一个CEGUI::Renderer基本对象的实例
2. 创建CEGUI::System对象实例
3. 调用方法来渲染这个GUI
显然你也需要加载一些数据然后执行非常基本的初始化,这方面知识在”关于加载数据文件和初始的指导”里详细介绍,然后你需要注入你的输入消息到系统,这方面知识在”关于注入输入的指导”里详细介绍。
   内容提要
   创建一个CEGUI::Renderer基本对象实例
   创建一个CEGUI::System对象
   调用方法来渲染GUI
   总结
   创建CEGUI::Renderer基本对象
基本的渲染创建代码是:
Direct3D 8.1
CEGUI::DirectX81Renderer* myRenderer=new CEGUI::DirectX81Renderer(myD3D8Device);
Direct3D 9
CEGUI::DirectX9Renderer* myRenderer=new CEGUI::DirectX9Renderer(myD3D9Device);
OpenGL
CEGUI::OpenGLRenderer* myRenderer=new CEGUI::OpenGLRenderer(0);
OGRE3D
CEGUI::OgreCEGUIRenderer* myRenderer=new CEGUI::OgreCEGUIRenderer(myRenderWindow);
Irrlicht Engine
CEGUI::IrrlichtRenderer* myRenderer=new CEGUI::IrrlichtRenderer(myIrrlichtDevice,true);
因为OGRE3D引擎它自己定义了一个类OgreCEGUIRenderer,它是CEGUI::Renderer的子类。
   创建CEGUI::System对象
一个比较简单的步骤,只需要new 一个CEGUI::System对象,参数是上面一步创建的myRenderer。
New CEGUI::System(myRenderer);
   调用方法来渲染这个GUI
这是需要你的目标引擎,在不同的Engine可能不同。基本上你需要知道是在渲染循环其它后调用CEGUI::System::renderGUI方法渲染GUI。幸运的是Ogre3D引擎使用者,这步是被自动执行的。其他人就需要用下面代码:
Direct3D 8.1/9
//开始这个场景
myD3DDevice->BeginScene();

//清除显示面
myD3DDevice->Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);

//用户画3D场景的函数
Draw3DScene();

//画GUI
CEGUI::System::getSingleton().renderGUI();

//结束这个场景
myD3DDevice->EndScene();
//最后翻转页面
myD3DDevice->Present(0,0,0,0);

OpenGL
//画3D场景
Draw3DScene();
//画GUI(不应该在glBegin/glEnd之间 )
CEGUI::System::getSingleton().renderGUI();
Irrlicht
//开始场景
myIrrlichtDriver->beginScene(true,true,irr::video::SColor(150,50,50,50));
//画主要的场景
myIrrlichtSceneManager->drawAll();
//画gui
CEGUI::System::getSingleton().renderGUI();
//结束场景
myIrrlichtDriver->endScene();
   总结
这是关于设置CEGUI渲染的最基本的介绍。还有很多没有提到,比如在Ogre中用不同的场景管理器和高级的功能比如用户自定义资源提供器,等等


 

原创粉丝点击