tolua++ 是乙個將 c/c++ 的函式和物件匯出給 lua 指令碼使用的工具。
使用這個工具的基本步驟: ~
每個目標檔案都是從一系列 .pkg 檔案編譯而來,主要完成下列功能: ~
不管是 c 函式還是 c++ 物件的方法,都一律匯出為靜態函式。
c 函式的匯出形式如下:
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
static
inttolua_math2dx_luabinding_dist00
(lua_state
*tolua_s
)else
}return1;
tolua_lerror
:tolua_error
(tolua_s,"
#ferror in function 'dist'.",&
tolua_err
);return0;
}
由於這個匯出模組的名字是 math2dx_luabinding,所以匯出函式的字首就是 tolua_math2dx_luabinding_ 。而匯出函式 dist 的名字也新增了字尾 00 用於區別可能存在的函式過載。
匯出函式 dist00() 的執行步驟:
首先從 stack 提取函式的引數,並一一判斷型別。如果型別不符,則輸出錯誤資訊並中斷執行。
將引數複製到臨時變數中,然後呼叫目標函式 dist(),並將結果(如果 dist() 有返回值)push 到 stack。
dist00() 最後返回 dist() 函式的返回值的個數。 ~
對於 c++ 物件,方法則分為類靜態方法和例項方法兩種情況。
由於 tolua++ 匯出的 c++ 類靜態方法用「:」操作符呼叫:
local request = cchttprequest:create()
因此匯出函式裡要求傳入的第乙個引數是 cchttprequest 模組:
ps: 個人認為將 c++ 物件視為乙個 lua module 時,那麼類靜態方法的呼叫方式應該是 cchttprequest.create() 這樣,以便和例項方法區別開。
例項方法的匯出區別不大,僅僅是需要檢查 stack 中的第乙個值是否是物件例項:
定義完所有要匯出的方法後,tolua++ 目標檔案將定義所有的模組並註冊上述匯出的方法。
~對於 c 函式,會新增到 lua 的全域性名字空間中,而每乙個 c++ 物件,則會註冊乙個與類名相同的 table,並新增到全域性名字空間。
c++ 物件對應的 table 新增後,會將匯出的類靜態方法和例項方法新增到這個 table。
~要想讓目標檔案正常工作,還需要依賴 tolua++ 庫提供的功能。這個庫提供下列功能:
其實這篇文章應該還有不少內容,但我實在是懶得寫了。。。原諒我這個程式猿吧 -_-#
~-eof-
Tolua實現Update功能
第一步 在元件上,掛載 lualooper 指令碼 這是驅動tolua裡面update 第二步 找到tolua 裡面的event 指令碼 把下面 複製進來 function event add func,obj local events updatebeat createlistener func,...
Tolua使用筆記三 Tolua協程用法
案例5 這一章講的是lua中的協程 如果我沒記錯的話,lua中沒有多執行緒,只有協程,lua的協程自帶的用起來有點侷限性,tolua中協程由於重寫了部分的方法,變得更加方便了 核心 如下 function cofunc print coroutine started local i 0 for i ...
Tolua使用筆記三 Tolua協程用法
案例5 這一章講的是lua中的協程 如果我沒記錯的話,lua中沒有多執行緒,只有協程,lua的協程自帶的用起來有點侷限性,tolua中協程由於重寫了部分的方法,變得更加方便了 核心 如下 function cofunc print coroutine started local i 0 for i ...