表层(Overlay)脚本

138 篇文章 0 订阅

表层脚本提供给你用脚本定义图层以方便重复使用的能力。与此同时,你可以使用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> ( <instance_name>) [: <template_name>] { ...
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作为它的标题)。

参看:3.4.1 表层元素(OverlayElement)属性3.4.2 标准表层元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值