• <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 閱讀(1527) 評論(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| www亚洲欲色成人久久精品| 国产精品成人99久久久久| 欧美日韩精品久久久久| 久久久亚洲欧洲日产国码aⅴ| 国产99久久九九精品无码| 亚洲精品成人网久久久久久| 看久久久久久a级毛片| 热久久国产精品| 亚洲女久久久噜噜噜熟女| 精品久久久久久久久久中文字幕| 精产国品久久一二三产区区别 | 2020最新久久久视精品爱| 人妻少妇精品久久| 7国产欧美日韩综合天堂中文久久久久| 午夜精品久久久久| 久久精品国产亚洲7777| 久久66热人妻偷产精品9| 久久亚洲国产精品成人AV秋霞| 亚洲国产精品久久久久久| 精品久久亚洲中文无码| 亚洲欧美另类日本久久国产真实乱对白| 久久精品中文字幕无码绿巨人 | 国产精品一区二区久久不卡| 思思久久精品在热线热| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 精品久久久一二三区| 国产精品美女久久久免费| 国产精品久久久久天天影视| 99久久精品国产一区二区 | 国产精品免费久久久久久久久| 久久精品中文闷骚内射| 午夜天堂av天堂久久久| 无码AV波多野结衣久久| 亚洲国产欧洲综合997久久| 丁香色欲久久久久久综合网| 久久精品国产亚洲av麻豆图片| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久精品国产免费观看三人同眠| 久久午夜夜伦鲁鲁片免费无码影视|