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