• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 94, comments - 250, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Nebula3腳本系統

            Posted on 2008-12-14 21:55 Condor 閱讀(603) 評論(0)  編輯 收藏 引用

            Nebula2的腳本系統實現了一個面向C++的腳本接口, 它把腳本命令直接映射到了C++方法. 從技術角度來說, 這是一個簡捷的思路, 但是對于需要把游戲邏輯和行為腳本化的關卡設計師來說, Nebula2的腳本系統太底層和透明了.

            關卡邏輯腳本一般來說構架于比C++接口更高級的層次上, 直接把腳本命令映射到C++方法會把腳本層次弄得錯綜復雜. Bug甚至會比同樣的C++代碼更多, 因為腳本語言一般缺少強類型檢查和”編譯時”的錯誤檢測, 所以在本應在C++編譯時發現的Bug會在腳本運行時才發現(這對于不同的腳本語言有所不同). 這是我們從Project Nomads中得出的經驗, 它就是用Nebula2的腳本系統驅動的.

            所以教訓就是: 把你的腳本架構在一個正確的抽象層上, 并且: 把你的C++接口映射到一種腳本語言是沒有意義的, 因為那樣你不如從一開始直接用C++來做這些東西.

            相應的, 新的Nebula3腳本哲學為關卡設計師提供一些在”正確的抽象層”的(大多是限于特定應用)積木. 當然, “正解的抽象層” 很難來定義, 因為這要在靈活性跟易用性之間找到一個平衡( 例如, 一個”Pickup” 命令是不是應該把角色移動到拾取范圍內呢? )

            除了太底層以外, Nebula2的腳本系統也有一些其它的缺點:

            • C++方法必須遵循可以轉化為腳本的原則( 只有簡單數據類型才可以做為參數 )
            • 給程序員帶來麻煩. 每個C++方法都需要額外的腳本接口代碼( 每個方法幾行 )
            • 只有派生自nRoot的類可以腳本化
            • 對象關聯到腳本系統( 思路簡單, 但是增加的依賴性會使重構非常困難 )

            下面是Nebual3的底層腳本的大概:

            • 腳本系統的基礎是Script::Command類
            • Script::Command是一個完全腳本語言無關的, 它包含了一個命令名稱, 一些輸入參數的集合還有一些輸出參數的集合.
            • 一個新的腳本命令通過派生Script::Comand類來創建, 腳本的C++功能代碼可以寫入子類的OnExecute()方法
            • ScriptServer類是腳本系統中僅有一個腳本語言相關的類, 它會把Command對象注冊成新的腳本命令, 并且把命令參數在腳本語言和C-API之間做翻譯.

            這個觀念比Nebula2更為簡單, 最重要的是, 它不會跟Nebula3的其它部分交織在一起. 甚至可以通過改變一個#define來編譯一個沒有腳本支持的Nebula3.

            當然, 書寫腳本命令的C++代碼跟Nebula2一樣煩人, 這是NIDL的由來. NIDL的是全稱是”Nebula Interface Definition Language”. 基本思想是通過為腳本命令定義一個簡單的XML schema并把XML描述編譯成派生了Script::Command的C++代碼, 來盡量減少書寫腳本命令的重復性工作.

            對于一個腳本命令必不可少的信息有:

            • 命令的名稱
            • 輸入參數的類型和名稱
            • 輸出參數的類型和名稱
            • 對應的C++代碼( 通常只有一行 )

            還有一些非必須, 但是可以帶來便利性的信息:

            • 關于命令的作用和每個參數的意義的描述, 這可以作為運行時的幫助系統
            • 一個唯一的FourCC(四字符碼), 可以更快的通過二進制通道傳輸

            大部分的腳本命令翻譯成了大約7行的XML-NIDL代碼. 這些XML文件再用”nidlc”NIDL編譯器工具編譯為C++代碼. 這個預處理是VisualStudio完全集成的, 所以使用NIDL文件不會為程序員代來任何困難.

            為了減少亂七八糟的文件(編譯生成的), 相關的腳本命令被組織到一個叫作庫的集合中. 一個庫由一個單獨的NIDL-XML文件表示, 并且它只會被翻譯一個C++頭文件和一個C++源代碼文件. 腳本庫可以在程序啟動時注冊到ScriptServer, 所以如果你的應用程序不需要腳本訪問文件的話, 僅僅不注冊IO腳本庫就可以了. 這會減小可執行文件的體積, 因為連接器會把沒有用到的腳本庫丟棄掉.

            最后, Nebula3放棄了TCL作為標準的腳本語言, 而采用了運行時代碼更加小巧的LUA. LUA已經成為游戲腳本的準規范, 這也使得尋找熟練的LUA關卡設計師更加容易.

            亚洲午夜精品久久久久久人妖| 久久亚洲国产成人精品无码区| 天天爽天天狠久久久综合麻豆| 亚洲午夜久久久久妓女影院| 久久国产成人精品麻豆| 久久福利片| 久久精品国产亚洲AV影院| 成人国内精品久久久久一区| 久久伊人五月天论坛| 少妇高潮惨叫久久久久久| 99久久精品免费观看国产| 精品久久久无码21p发布| 久久99国产一区二区三区| 亚洲va久久久噜噜噜久久| 久久久久99精品成人片三人毛片| 精品多毛少妇人妻AV免费久久| 日本三级久久网| 久久综合九色综合网站| 欧美大战日韩91综合一区婷婷久久青草| 久久婷婷五月综合色奶水99啪| 日本精品一区二区久久久| 99久久精品免费看国产一区二区三区| 久久九九兔免费精品6| 亚洲国产成人久久综合区| 国产精品免费看久久久香蕉| 色综合久久中文字幕无码| 污污内射久久一区二区欧美日韩 | 久久精品国产亚洲av高清漫画 | 久久精品国产亚洲AV忘忧草18| 国产高潮国产高潮久久久91 | 久久九九有精品国产23百花影院| 久久99精品久久久大学生| 久久久久久久久久久久中文字幕 | 久久亚洲精品中文字幕| 久久精品视频一| 2020国产成人久久精品| 污污内射久久一区二区欧美日韩| 久久久久亚洲AV成人网人人网站| 99久久免费国产精品| 99久久精品国产毛片| 污污内射久久一区二区欧美日韩 |