表層腳本提供給你用腳本定義圖層以方便重複使用的能力。與此同時,你可以使用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已經預定義了Panel,BorderPanel,TextArea三種類型。
- 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作爲它的標題)。