• <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學習筆記(7): 腳本系統

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

            可能是還在開發當中的緣故, 我感覺Nebula3中的lua腳本系統不是很完善. 所有的調用都是封裝成Command來執行的, 并不像LuaBind那樣直接綁定到C++類對象; 而且, 對于C++調用腳本的接口也不是很方便, 只有一個Eval()來執行一個字符串. 如果要實際進行應用的話, 我想最好是自己擴展一下, 這里有一篇不錯的文章: Integrating Lua into C++. 當然, 對于需求更高的用戶來說, 可以選擇使用LuaBind等第三方庫來整合腳本系統.

            Command(命令)
            可以這么說, 腳本中調用的, 都是一個個的Command. 一個新的Command定義了一個腳本語言獨立的新的腳本命令, 你可以通過派生一個Command的子類并注冊到腳本服務器來實現. 也就是說, 新的命令不依賴于你具體使用的腳本系統, 可以是lua, 也可以是python等等.

            view plaincopy to clipboardprint?

            1. class Print : public Scripting::Command   
            2. {   
            3.     DeclareClass(Print);   
            4. public:   
            5. virtual void OnRegister();   
            6. virtual bool OnExecute();   
            7. virtual Util::String GetHelp() const;   
            8. private:   
            9. void Callback(const Util::String& str);   
            10. };<PRE></PRE> 
            class Print : public Scripting::Command
            {
                DeclareClass(Print);
            public:
                virtual void OnRegister();
                virtual bool OnExecute();
                virtual Util::String GetHelp() const;
            private:
                void Callback(const Util::String& str);
            };

            ScriptServer(腳本服務器)
            ScriptServer是語言無雙的, 也就是說你可以自己派生一個相應語言的子來來支持一種腳本言. Nebula3里已經實現了一個LuaServer, 不過個感覺沒有LuaBind方便. 所有的腳本執行都是通過LuaServer::Eval(const String& str)來完成的. 腳本要調用C++代碼的話, 需要封裝一個Command, 然后用LuaServer::RegisterCommand()來注冊就可以用了. 具體可以參考Command命名空間里的相關代碼.

            view plaincopy to clipboardprint?

            1. scriptServer->RegisterCommand("print", Print::Create());<PRE></PRE> 
                scriptServer->RegisterCommand("print", Print::Create());

            應用實例
            其實App::ConsoleApplication里就有LuaServer, 并且已經注冊了一些IO命名. 我們派生一個從命令行讀取腳本命令執行的來做測試:

            view plaincopy to clipboardprint?

            1. class ScripTestApp : public App::ConsoleApplication   
            2. {   
            3. public:   
            4. ScripTestApp(void);   
            5. /// open the application
            6. virtual bool Open();   
            7. /// run the application, return when user wants to exit
            8. virtual void Run();   
            9. };   
            10. ScripTestApp::ScripTestApp(void)   
            11. {   
            12. }   
            13. bool ScripTestApp::Open()   
            14. {   
            15. if (ConsoleApplication::Open())   
            16. {   
            17. return true;   
            18. }   
            19. return false;   
            20. }   
            21. void ScripTestApp::Run()   
            22. {   
            23. Util::String input;   
            24. while (true)   
            25. {   
            26.   input = IO::Console::Instance()->GetInput();   
            27. if (!input.IsEmpty())   
            28.   {   
            29. this->scriptServer->Eval(input);   
            30.   }   
            31. }   
            32. }<PRE></PRE> 
            class ScripTestApp : public App::ConsoleApplication
            {
            public:
             ScripTestApp(void);
            
             /// open the application
             virtual bool Open();
             /// run the application, return when user wants to exit
             virtual void Run();
            };
            
             ScripTestApp::ScripTestApp(void)
            {
            }
            
            bool ScripTestApp::Open()
            {
             if (ConsoleApplication::Open())
             {
              return true;
             }
             return false;
            }
            
            void ScripTestApp::Run()
            {
             Util::String input;
             while (true)
             {
              input = IO::Console::Instance()->GetInput();
              if (!input.IsEmpty())
              {
               this->scriptServer->Eval(input);
              }
             }
            }

            運行結果:

            精品乱码久久久久久夜夜嗨| 久久精品亚洲日本波多野结衣| 久久免费精品一区二区| 大香伊人久久精品一区二区| 国产69精品久久久久观看软件| 97久久国产综合精品女不卡| 精品国产婷婷久久久| 婷婷久久五月天| 97久久综合精品久久久综合| 国产—久久香蕉国产线看观看| 免费无码国产欧美久久18| 国产91久久精品一区二区| 亚洲日韩欧美一区久久久久我| 久久亚洲中文字幕精品一区| 天天久久狠狠色综合| 久久久久久国产精品无码下载| 久久99国产综合精品免费| 亚洲国产精品成人久久蜜臀| 久久99国产精品久久99| 亚洲精品乱码久久久久久蜜桃图片 | 国产成人精品久久一区二区三区 | 香蕉久久av一区二区三区| 91久久福利国产成人精品| 亚洲中文字幕无码一久久区| 国产亚州精品女人久久久久久| 亚洲精品乱码久久久久久蜜桃图片 | 久久超碰97人人做人人爱| 久久亚洲中文字幕精品一区| 潮喷大喷水系列无码久久精品| 亚洲国产成人久久综合一区77| 国产成人精品久久亚洲高清不卡 | 亚洲AV无码久久寂寞少妇| 伊人情人综合成人久久网小说| 国产精品99久久久久久www| 97久久精品国产精品青草| 久久狠狠高潮亚洲精品| 亚洲国产欧美国产综合久久| 久久久久亚洲av成人网人人软件| 热久久国产欧美一区二区精品| 久久精品国产亚洲av瑜伽| 亚洲一本综合久久|