學習lua將近半個月了,以前也了解過,只是沒有實際運用的環境。
現在將自己這半個月來的心得寫下來。
首先,要想在c++程式中作用lua指令碼,必須包含相應的lua標頭檔案,
extern "c"
因為lua是基於c的,所以要使變數和
函式按照c語言方式編譯和連線
在你的編譯環境中要包含lua的標頭檔案,我的是lua5.1版本&vs2008 sp1,所以在包含目錄中包含了相應include和lib目錄,應該如下:
開發環境搭建完成以後,第一步就是要宣告乙個lua的狀態機:
lua_state *g_pstate = lua_open();// 新建乙個lua狀態
luaopen_base(g_pstate);// 啟動lua
luaopen_string(g_pstate);// 初始化lua string庫,可以作用string
lual_openlibs(g_pstate);//
luaopen_math(g_pstate);// 初始化
之後要定義乙個lua檔案如下:
script.lua:
name = "3d text lua";
tableworld = ;
function move()
tableworld["posx"] = tableworld["posx"] + 0.0;
tableworld["posy"] = tableworld["posy"] + 0.1;--在y軸正方向上每次重新整理移動0.1個單位
tableworld["posz"] = tableworld["posz"] + 0.0;
if(tableworld["posy"] > 2.0) then--設定y軸移動範圍在(-2.0,2.0)之間
tableworld["posy"] = -2.0;
endend
這是乙個要列印乙個3d文字「3d text lua"的指令碼,列印內容作為乙個全域性變數name放在lua中,在lua中,如果沒有寫明local字首,那麼這個變數是全域性的。
有個move()函式, 是設定字型的運動軌跡的.
lua檔案定義完畢,那麼就要在c++程式中呼叫lua檔案中的內容了:
首先要載入script.lua到記憶體中並編譯lua檔案成目標**:
if (int error = lual_dofile(g_pstate, "script.lua") != 0)//載入lua檔案並編譯
lua_settop(g_pstate, 0);// 清除lua狀態機堆疊
lua_getglobal(g_pstate, "name");//取出script.lua中全域性變數name
if (!lua_isstring(g_pstate, 1))//判定棧頂的變數是不是字串
1. 取出指令碼文字內容:g_strtext = lua_tostring(g_pstate, -1);//該函式將棧頂的記憶體轉換成字串型別,其實是const char*,這樣就拿到了這個文字
lua_pop(g_pstate, 1);// 彈出棧元素
2.呼叫lua內的move()函式
// get func move
lua_getglobal(g_pstate, "move");//拿到名稱為move的lua變數並放入棧頂
if (!lua_isfunction(g_pstate, -1))//判斷是不是函式型別
lua_call(g_pstate,0,0);//通過lua_api lua_call呼叫棧頂的函式,其中第二個引數表示函式引數個數,第三個引數表示返回值個數;對,lua是可以返回多值的。這樣只要在每次重新整理的時候呼叫一次上面的語句就可以了。
具體可執行檔案在下面附件中,其中源**改編自directx圖形與動畫程式設計中的fon_3d程式。
(原)lua使用ffi呼叫c程式的函式
參考 1.新建calcmath.cpp,輸入 1 include 2 include 3 include 4 using namespace std 56 7extern c 1213float isquare float val 1417 18double isqrt double val 192...
lua中的table使用陷阱
最近在使用lua開發的過程中,遇到了乙個由於語言機制導致的bug,具體表現就是,我的配置檔案中存了個兩個表項,在用lua載入配置檔案內容之後,返回的表長度竟然是1,然後導致後面的判斷都出錯了,在初次除錯這個bug的時候完全是百思不得其解,把配置檔案看了又看,確實有兩個表項沒錯,但是通過 運算子得到的...
Lua 實現C 中的類
直接上 local mt function class clsname,base local cls base base or mt setmetatable cls,cls.clsname clsname or default cls.base base cls.new function loca...