Ogre Overlay表层脚本

来源:百度文库 编辑:神马文学网 时间:2024/04/29 04:29:40

3.4 表层(Overlay)脚本

来自:http://wiki.ogrecn.com/wiki/ 

表层脚本提供给你用脚本定义图层以方便重复使用的能力。与此同时,你可以使用SceneManager,Overlay以及 OverlayElement类的方法在代码中为一个场景建立所有图层,虽然在使用中,有点儿不太好用。相反你可以以文本文件的方式储存层定义,而在需要 的时候调用。

装载脚本

表层脚本在初始化时由系统装入:默认,它搜索所有普通资源位置(参看Root::addResourceLocation)查找有 '.overlay'扩展名的文件,并分析它。如果你想要分析别的扩展名的文件,则对你的那个扩展名使用 OverlayManager::getSingleton().parseAllSources方法,或者如果你想要分析一个单独文件,则使用 OverlayManager::getSingleton().parseScript。

格式

多个层可以被定义在单独一个脚本中。脚本格式是伪C++的,用打括号({})分割各个部分,以'//'开始的一行表示注释(注意,不允许嵌套注释),且通过使用模板继承。典型例子的一般格式如下所示:

// The name of the overlay comes first
MyOverlays/ANewOverlay
{
zorder 200

container Panel(MyOverlayElements/TestPanel)
{
// Center it horzontally, put it at the top
left 0.25
top 0
width 0.5
height 0.1
material MyMaterials/APanelMaterial

// Another panel nested in this one
container Panel(MyOverlayElements/AnotherPanel)
{
left 0
top 0
width 0.1
height 0.1
material MyMaterials/NestedPanel
}
}

}

上例定义了一个叫'MyOverlays/ANewOverlay'的层,其中有2个面板,且其中一个嵌套在另一个上。它使用关联矩阵(如果未发现metrics_mode选项)。

脚本中每一层都必须被起一个名字,即在第一个大括号'{'前。此名字必须是全局独一无二的。可以包含路径字符(如上例所示)从逻辑上区分你 的层,还要避免复制层名,引擎不会认为这里有什么结构关系,而只是把它当作一条字符串。层的属性和嵌套元素都在括号内部。层本身仅有一个属性 'zorder',在同时显示不止一个层时,决定这一层放在这一堆的层里面多‘高’的位置上。层的'zorder'值越高,显示得就越靠近表面。

向层中添加元素

在层中,你可以包含任意个2D或3D元素。要做到这一点,依靠定义一个如下开始的嵌套的代码块:

element
如果你想定义一个无孩子的2D元素
container
如果你想定义一个2D容器对象(即可以有嵌套在自己内部的容器或元素)

除了储存嵌套块的能力有所不同,元素和容器块是极其相似的。


容器/元素块

这两种都是按大括号分割的。第一个大括号前的头部格式是:

[container | element]  ( ) [: ]
{ ...
type_name
必须给出已在OverlayManager注册过的OverlayElement类型名。插件在OverlayManager注册,以声明其创建元素的能力,同时声明类型名。OGRE已经预定义了PanelBorderPanelTextArea三种类型。
instance_name
必须是一个在所有其他elements/containers中独一无二的名字以便能够识别出这个元素。注意,你可以通过调用 OverlayManager::getSingleton().getOverlayElement(name)而取得一个指向任意已命名的元素的指 针。
template_name
基于此项的可选模板。详见下面介绍的模板

可包含在括号中的属性依赖于用户定义的类型。但是下面的这几个属性总是可用的:

  • metrics_mode
  • horz_align
  • vert_align
  • left
  • top
  • width
  • height
  • material
  • caption
模板

你可以使用模板创建各种有相同属性的元素。一个模板就是一个抽象元素,而且它并不增加到某一层中。它扮演的就是一个基类,元素可以继承并取得默认属性。要创建一个模板,关键字template必须是元素定义的第一个词(在container或element之前)。模板元素被创建在最外层——它并不在某一层里指定。建议你在一个单独的层中定义模板,尽管这么做并不是必要的。在单独文件中定义模板,允许有不同的外观,方便替代。

元素可以通过类似于C++继承的方式继承一个模板——通过在元素定义上使用:操作符。:操作符被放置在名字的右括号之后(以空格分隔)。要继承的模板名放在:操作符之后(也以空格分隔)。

一个模板中可以包含子模板,子模板在模板被实例化时被创建。虽然使用template关键字对于子模板来说是可选的,但是为了清楚起见还是建议使用,因为子模板本身也是要做模板的。

template container BorderPanel(MyTemplates/BasicBorderPanel)
{
left 0
top 0
width 1
height 1

// setup the texture UVs for a borderpanel

// do this in a template so it doesn't need to be redone everywhere
material Core/StatsBlockCenter
border_size 0.05 0.05 0.06665 0.06665
border_material Core/StatsBlockBorder
border_topleft_uv 0.0000 1.0000 0.1914 0.7969
border_top_uv 0.1914 1.0000 0.8086 0.7969
border_topright_uv 0.8086 1.0000 1.0000 0.7969
border_left_uv 0.0000 0.7969 0.1914 0.2148
border_right_uv 0.8086 0.7969 1.0000 0.2148
border_bottomleft_uv 0.0000 0.2148 0.1914 0.0000
border_bottom_uv 0.1914 0.2148 0.8086 0.0000
border_bottomright_uv 0.8086 0.2148 1.0000 0.0000
}
template container Button(MyTemplates/BasicButton) : MyTemplates/BasicBorderPanel
{
left 0.82
top 0.45
width 0.16
height 0.13
material Core/StatsBlockCenter
border_up_material Core/StatsBlockBorder/Up
border_down_material Core/StatsBlockBorder/Down
}
template element TextArea(MyTemplates/BasicText)
{
font_name Ogre
char_height 0.08
colour_top 1 1 0
colour_bottom 1 0.2 0.2
left 0.03
top 0.02
width 0.12
height 0.09
}

MyOverlays/AnotherOverlay
{
zorder 490
container BorderPanel(MyElements/BackPanel) : MyTemplates/BasicBorderPanel
{
left 0
top 0
width 1
height 1

container Button(MyElements/HostButton) : MyTemplates/BasicButton
{
left 0.82
top 0.45
caption MyTemplates/BasicText HOST
}

container Button(MyElements/JoinButton) : MyTemplates/BasicButton
{
left 0.82
top 0.60
caption MyTemplates/BasicText JOIN
}
}
}

上面的例子使用了模板定义一个按钮。注意,按钮模板继承自borderPanel模板。这样减少了初始化一个按钮所需要的属性数量。

还要注意的是,实例化一个按钮需要一个模板名作为标题属性。所以模板也可以被需要动态创建子元素的元素使用(在此例中,按钮创建了一个TextAreaElement作为它的标题)。