• <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 閱讀(1503) 評論(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);
              }
             }
            }

            運行結果:

            久久精品中文闷骚内射| 亚洲欧美国产精品专区久久| 高清免费久久午夜精品| 国产精品一久久香蕉产线看| 久久不见久久见免费影院www日本| 久久亚洲中文字幕精品一区| 色综合久久久久久久久五月| 国产一区二区精品久久凹凸| 97精品伊人久久久大香线蕉| 国产成人久久777777| 狠狠色婷婷久久一区二区| 嫩草影院久久国产精品| 2020国产成人久久精品| 色综合久久久久网| 久久综合九色综合网站| 少妇被又大又粗又爽毛片久久黑人| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 模特私拍国产精品久久| 久久精品国产免费| 综合网日日天干夜夜久久| 成人亚洲欧美久久久久| 国产精品美女久久久| 狠狠色丁香久久婷婷综合_中 | 久久久久亚洲AV无码专区桃色| 久久99国产精品尤物| 狠狠色丁香久久婷婷综合| 国产精品gz久久久| 久久精品www| 久久精品成人免费看| av国内精品久久久久影院| 久久人妻无码中文字幕| 国产成人综合久久精品红| 久久国产V一级毛多内射| 亚洲国产成人久久综合碰碰动漫3d| 嫩草伊人久久精品少妇AV| 2019久久久高清456| 亚洲国产欧洲综合997久久| 亚洲精品乱码久久久久久蜜桃不卡| 久久婷婷国产剧情内射白浆| 久久中文字幕人妻熟av女| 欧洲精品久久久av无码电影|