C程式語言嵌入Lua的用法

2021-07-17 04:14:05 字數 3510 閱讀 1185

c程式語言嵌入lua的用法

當你希望在你的遊戲開始的時候讀取一些資訊,以配置你的遊戲,這些資訊通常都是放到乙個文字檔案中,在你的遊戲啟動的時候,你需要開啟這個檔案,然後解析字串,找到所需要的資訊。

是的,或許你認為這樣就足夠了,為什麼還要使用lua呢?

應用於「配置」這個目的,lua提供給你更為強大,也更為靈活的表達方式,在上一種方式中,你無法根據某些條件來配置你的遊戲,lua提供給你靈活的表達方式,你可以類似於這樣來配置你的遊戲:

[cpp]view plain

copy

print?

if player:is_dead() then  

do_something()  

else

do_else()  

end  

更為重要的是,在你做了一些修改之後,完全不需要重新編譯你的遊戲**。

通常,在遊戲中你並不需要乙個單獨的直譯器,你需要在遊戲來執行直譯器,下面,讓我們來看看,如何在你的**中執行直譯器:

[cpp]view plain

copy

print?

//這是lua所需的三個標頭檔案

//當然,你需要鏈結到正確的lib

extern

"c"  

int main(int argc, char *argv)    

程式輸出:hello, world!

有時你需要執行一段字串,有時你可能需要執行乙個檔案,當你需要執行乙個檔案時,你可以這麼做:

lua_dofile(l, "test.lua");

看,非常簡單吧。

取得資訊

下面讓我們來看看如何從指令碼中取得我們所需要的資訊。

首先,讓我來簡單的解釋一下lua直譯器的工作機制,lua直譯器自身維護乙個執行時棧,通過這個執行時棧,lua直譯器向主機程式傳遞引數,所以我們可以這樣來得到乙個指令碼變數的值:

[cpp]view plain

copy

print?

"font-family:'microsoft yahei';font-size:16px;">lua_pushstring(l, "var"); //將變數的名字放入棧

lua_gettatbl(l, lua_globalsindex);變數的值現在棧頂

假設你在指令碼中有乙個變數 var = 100

你可以這樣來得到這個變數值:

[cpp]view plain

copy

print?

int var = lua_tonumber(l, -1);  

怎麼樣,是不是很簡單?

lua定義了乙個巨集讓你簡單的取得乙個變數的值:

[cpp]view plain

copy

print?

lua_getglobal(l, name)  

我們可以這樣來取得乙個變數的值:

[cpp]view plain

copy

print?

lua_getglobal(l, "var"); //變數的值現在棧頂

int var = lua_tonumber(l, -1);  

[cpp]view plain

copy

print?

完整的測試**如下:

[cpp]view plain

copy

print?

#include "lua.h"

#inculde "lauxlib.h"

#include "lualib.h"

int main(int argc, char *argv)  

呼叫函式

假設你在指令碼中定義了乙個函式:

[cpp]view plain

copy

print?

function main(number)  

number = number + 1  

return number  

end  

在你的遊戲**中,你希望在某個時刻呼叫這個函式取得它的返回值。

在lua中,函式等同於變數,所以你可以這樣來取得這個函式:

[cpp]view plain

copy

print?

lua_getglobal(l, "main");//函式現在棧頂

現在,我們可以呼叫這個函式,並傳遞給它正確的引數:

[cpp]view plain

copy

print?

"font-family:'microsoft yahei';">lua_pushnumber(l, 100); //將引數壓棧

lua_pcall(l, 1, 1, 0); //呼叫函式,有乙個引數,乙個返回值

//返回值現在棧頂

int result = lua_tonumber(l, -1);

result 就是函式的返回值

完整的測試**如下:

[cpp]view plain

copy

print?

#include "lua.h"

#include "lauxlib.h"

#include "lualib.h"

int main(int argc, char *argv)    

指令碼呼叫程式

lua本身定位在一種輕量級的,靈活的,可擴充的指令碼語言,這意味著你可以自由的擴充lua,為你自己的遊戲量身定做乙個指令碼語言。

你可以在主機程式中向指令碼提供你自定的api,供指令碼呼叫。

lua定義了一種型別:lua_cfunction,這是乙個函式指標,它的原型是:

typedef int (*lua_cfunction) (lua_state *l);

這意味著只有這種型別的函式才能向lua註冊。

首先,我們定義乙個函式

[cpp]view plain

copy

print?

int foo(lua_state *l)  

我們可以在指令碼中這樣呼叫這個函式  

r1, r2 = foo("hello")  

print(r1..r2)  

完整的測試**如下:

[cpp]view plain

copy

print?

extern

"c"  

int foo(lua_state *l)  

int main(int argc, char *argv)    

程式輸出:

hello

100200

Lua教程 C 嵌入Lua指令碼

讀後感悟 先講了環境了配置,然後著重講了c 中如何呼叫lua,適合入門。如果想學習語法,可以看 lua程式設計 雖然講的是lua5.1,但是很多語法還是可以學的。當你學會了最基本的c 與lua呼叫之後,就可以馬上學一些互動 了,而不是只是看書,那麼看了之後,你會很容易忘記的,之前我就是學習lua的時...

C 嵌入lua指令碼

現時遊戲開發裡比較多使用一門伺服器開發語言 指令碼作為開發,在此僅記錄c 嵌入 lua指令碼的過程 環境 mac,10.11.6 2.新建xcode 專案 4.解壓完畢之後,切入lua 5.x.x裡,執行make macosx,生成liblua.a檔案 5.配置路徑 選中project build ...

Lua指令碼程式設計 Lua語言入門

lua系統由lua鏈結庫 luac編譯器 lua直譯器三部分構成。lua鏈結庫主要由lua.lib和lua.h這兩個檔案組成。lua鏈結庫主要負責對自身進行初始化及關閉操作 裝載指令碼與執行指令碼 提 供可呼叫互動介面。luac編譯器是乙個由命令列驅動的編譯器,其名稱為luac。當我們需要使用lua...