• <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>

            Heath's Blog

            There is no end, it is just the beginning! - A Game Developer's Notes

            Some tips of using toLua

            在使用toLua重構腳本系統時,遇到了一些問題,在此將其解決方案做一下備忘。

            一、How to complie
                在linux下只需簡單地執行make即可。而在windows平臺下,情況會稍微復雜點。由于toLua的產出分為exe和lib,其中exe用于自動產生bind代碼,lib作為腳本系統的連接庫使用。為了產生exe文件,需要創建一個win32 console工程,將src\lib和src\bin的.h、.c添加到這個工程中來,然后編譯(當然別忘了設置鏈接lua庫);而產生lib,則需要創建static lib工程,然后將src\lib下的source添加進來編譯(同樣別忘了設置鏈接lua庫)。
            二、How to use(How to transplant)
                在src\tests下有示例代碼,其中.pkg文件內容與header file幾乎一致,只是多了toLua處理指令(以$開頭),其詳細說明可參考“tolua++ - Reference Manual”。為了避免將眾多的header files內容復制到.pkg,我們使用了$cfile指令,這樣只需在每個需要導出到lua中的頭文件所對應的.pkg文件中添加一條$cfile指令即可,但世上沒有免費的午餐,這樣做有個前提:需要在頭文件中添加導出指示符(以注釋方式給出)。需要注意的是:1).pkg文件必須以一個新行結束文件;2)使用導出指示符時,//tolua_export需位于類名繼承關系之后。對于導出單個或少數方法,需要在方法聲明前加//tolua_begin,結束加//tolua_end。對于如果//tolua_end不在類定義最后(即};之后)的情況,需在類定義最后加//tolua_export;3)如需在腳本中生成對象,則需導出構造和析構函數。下面舉具體例子加以說明:

            //////////Test.h/////////////
            #pragma once

            class Hello 
            {
            public:
                Hello();
                
            virtual ~Hello();
                
            virtual void Say();
            }
            ;

            class HelloWorld : public Hello {//tolua_export
            public:
                
            //tolua_begin
                HelloWorld() {}
                
            ~HelloWorld() {}
                
            //tolua_end
                void Say();
                
            //tolua_begin
                void GG();
                
            //tolua_end
            }
            ;//tolua_export

            /////////////Test.cpp////////////////

            #include 
            "Test.h"
            #include 
            <iostream>

            using namespace std;

            Hello::Hello()
            {

            }


            Hello::
            ~Hello()
            {

            }


            void Hello::Say()
            {
                cout 
            << "Hello" << endl;
            }


            void HelloWorld::Say()
            {
                cout 
            << "Hello, World!" << endl;
            }


            void HelloWorld::GG()
            {
                cout 
            << "Go go!" << endl;
            }

            ////////main.cpp////////

            include 
            "toLua.h"
            #include 
            "_Test.h"  /// generate by toLua

            void main()
            {
                
            int tolua_Test_open(lua_State*);

                lua_State
            * L = lua_open();
                luaL_openlibs(L);
                tolua_Test_open(L);

                luaL_dofile(L , 
            "Test.Lua");

                lua_close(L);
            }

            //////////Test.lua/////////
            print "Start"
            local hw 
            = HelloWorld:new()
            hw:GG()
            print "End"

            //////Test.pkg//////
            $cfile 
            "Test.h"
            <new line>


            _Test.h和_Test.cpp是用ToLua -o _Test.cpp -H _Test.h Test.pkg命令產生的。


            補充:針對在腳本中使用已經創建好的C++對象,需要使用tolua_pushusertype和lua_setglobal。在上面例子中,如果只想在腳本中調用指定對象的GG方法,則只需用tolua_begin和tolua_end來包括GG(),然后修改main.cpp和腳本:

            ///////main.cpp//////

            #include 
            "toLua.h"
            #include 
            "_Test.h"

            void main()
            {
                
            int tolua_Test_open(lua_State*);

                lua_State
            * L = lua_open();
                luaL_openlibs(L);
                tolua_Test_open(L);
                HelloWorld
            * pHelloWorld = new HelloWorld;
                tolua_pushusertype(L,(
            void*)pHelloWorld,"HelloWorld");
                lua_setglobal(L , 
            "HelloWorld");
                luaL_dofile(L , 
            "Test.Lua");

                lua_close(L);
            }

             

            ////////Test.lua////////

            print 
            "Start"
            HelloWorld:GG()
            print 
            "End"


            三、How to automatize

                Visual studio為每個工程提供了配置“Pre-Build Event”、“Pre-Link Event”以及“Post-Build Event”的機會,她位于工程屬性的“Build Events”條目中。為了在每次編譯前,自動產生lua綁定的相關代碼,可在“Command Line”中寫下我們在命令行中輸入的toLua命令。

            posted on 2009-01-18 13:56 Heath 閱讀(2072) 評論(2)  編輯 收藏 引用 所屬分類: Script Programming

            Feedback

            # re: Some tips of using toLua[未登錄] 2009-01-21 19:25 ME

            這媞

            久久水蜜桃亚洲av无码精品麻豆| 国产欧美久久久精品| 久久人人爽人人澡人人高潮AV| 一本色道久久88加勒比—综合| 久久五月精品中文字幕| 久久夜色精品国产噜噜亚洲a| 久久男人Av资源网站无码软件 | 精品99久久aaa一级毛片| 久久综合给合综合久久| www.久久热.com| 久久91精品国产91| 国产精品99久久久久久宅男| 国内精品久久久久影院老司| 日韩精品久久久久久久电影蜜臀| 国产精品久久久99| 99久久人妻无码精品系列蜜桃| 无码任你躁久久久久久| 色综合久久中文综合网| 久久国产亚洲精品无码| 中文字幕久久精品无码| 亚洲精品99久久久久中文字幕| 国内精品九九久久久精品| 2021国产精品午夜久久| 久久se精品一区二区影院| 久久综合综合久久狠狠狠97色88 | 国产精品女同久久久久电影院| 久久国产精品国语对白| 999久久久无码国产精品| 亚洲va久久久噜噜噜久久天堂| 久久只有这精品99| 欧美亚洲国产精品久久| 亚洲国产小视频精品久久久三级 | 久久久久亚洲AV片无码下载蜜桃| 久久精品综合网| 久久精品国产免费观看三人同眠| 国产精品欧美亚洲韩国日本久久| 色综合色天天久久婷婷基地| 曰曰摸天天摸人人看久久久| 久久本道伊人久久| 国内精品伊人久久久久网站| 99精品久久久久久久婷婷|