Lua的使用入門之在C 程式中呼叫lua函式1

2021-06-19 02:58:23 字數 2007 閱讀 2745

學習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...