Overlay 腳本

表層腳本提供給你用腳本定義圖層以方便重複使用的能力。與此同時,你可以使用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作爲它的標題)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章