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

            運行結果:

            精品人妻久久久久久888| 99久久综合国产精品二区| 亚洲精品午夜国产va久久| 精品视频久久久久| 久久久久国产精品三级网| 成人国内精品久久久久影院VR| 一本久久久久久久| 欧美色综合久久久久久| 久久久久人妻一区二区三区| 日韩精品久久无码中文字幕| 一本色道久久HEZYO无码| 99久久香蕉国产线看观香| 综合网日日天干夜夜久久| 国产精品国色综合久久| 蜜臀久久99精品久久久久久小说| 麻豆成人久久精品二区三区免费| 老色鬼久久亚洲AV综合| 91亚洲国产成人久久精品| 午夜精品久久久久久| 国产亚洲精品久久久久秋霞| 999久久久国产精品| 超级碰碰碰碰97久久久久| 亚洲一区中文字幕久久| 久久伊人五月丁香狠狠色| 国内精品综合久久久40p| 7国产欧美日韩综合天堂中文久久久久 | 久久精品国产亚洲AV无码麻豆 | 久久午夜福利电影| 久久久久久亚洲精品影院| 国产精品久久久久影视不卡| 久久亚洲精品国产精品婷婷| 色综合久久最新中文字幕| 97久久婷婷五月综合色d啪蜜芽 | 亚洲午夜无码AV毛片久久| 国产免费久久精品99re丫y| 久久综合亚洲色HEZYO社区| 青青青青久久精品国产 | 99久久香蕉国产线看观香 | 免费观看久久精彩视频| 中文字幕亚洲综合久久菠萝蜜 | 精品久久久久久国产|