• <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);
              }
             }
            }

            運行結果:

            国内精品久久久久伊人av| 久久午夜伦鲁片免费无码| 国产三级久久久精品麻豆三级 | 综合久久精品色| 一本色道久久99一综合| 成人国内精品久久久久一区| 狠狠色婷婷久久一区二区三区 | 久久亚洲国产中v天仙www| 久久国产免费| 午夜人妻久久久久久久久| 久久国产成人| 青青青国产成人久久111网站| 久久国产视屏| 亚洲精品乱码久久久久66| 国产午夜精品久久久久九九| 久久久久久久久无码精品亚洲日韩 | 久久午夜电影网| 久久天天躁夜夜躁狠狠躁2022| 99热热久久这里只有精品68| 国产精品中文久久久久久久| 久久久黄片| 996久久国产精品线观看| 久久精品aⅴ无码中文字字幕重口| 青草影院天堂男人久久| 久久婷婷国产综合精品| 综合久久给合久久狠狠狠97色 | 国产亚洲综合久久系列| 少妇熟女久久综合网色欲| 久久久久综合国产欧美一区二区 | 久久国产精品成人免费| 久久99精品久久久久久久久久| 久久久受www免费人成| 国产精品综合久久第一页| 久久精品www| 丰满少妇高潮惨叫久久久| 久久99国产综合精品免费| 亚洲精品tv久久久久久久久| 亚洲狠狠婷婷综合久久蜜芽| 久久无码中文字幕东京热| 97香蕉久久夜色精品国产| 久久精品国产精品亚洲精品|