遊戲中使用LUA指令碼語言的簡介

2021-08-26 21:12:51 字數 3014 閱讀 9093

我們知道指令碼語言是解除硬編碼,防止重編譯的利器,可以這樣說,任何大型遊戲都有自己的指令碼系統。

想要做出一款精品遊戲,指令碼語言也是我們需要掌握和運用的。

較流行的指令碼語言有python,lua,ruby等。

lua有著輕量,高效,介面乾淨等特點,學起來很快,

風靡全球的《魔獸爭霸3:冰封王座》就是採用的lua指令碼語言。

我將內容進行了排版,**進行了高亮顯示,更方便大家**了。

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

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

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

if player:is_dead() then

do_something()

else

do_else()

end

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

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

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

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

extern "c"

int main(int argc, char *argv)

程式輸出:hello, world!

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

lua_dofile(l, "test.lua");

看,非常簡單吧。

取得資訊

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

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

lua_pushstring(l, "var"); //將變數的名字放入棧

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

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

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

int var = lua_tonumber(l, -1);

怎麼樣,是不是很簡單?

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

lua_getglobal(l, name)

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

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

int var = lua_tonumber(l, -1);

完整的測試**如下:

#include "lua.h"

#inculde "lauxlib.h"

#include "lualib.h"

int main(int argc, char *argv)

呼叫函式

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

function main(number)

number = number + 1

return number

end

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

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

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

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

lua_pushnumber(l, 100); //將引數壓棧

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

//返回值現在棧頂

int result = lua_tonumber(l, -1);

result 就是函式的返回值

完整的測試**如下:

#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註冊。

首先,我們定義乙個函式

int foo(lua_state *l)

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

r1, r2 = foo("hello")

print(r1..r2)

完整的測試**如下:

extern "c"

int foo(lua_state *l)

int main(int argc, char *argv)

程式輸出:

hello

100200

遊戲中使用LUA指令碼語言的簡介

我們知道指令碼語言是解除硬編碼,防止重編譯的利器,可以這樣說,任何大型遊戲都有自己的指令碼系統。想要做出一款精品遊戲,指令碼語言也是我們需要掌握和運用的。較流行的指令碼語言有python,lua,ruby等。lua有著輕量,高效,介面乾淨等特點,學起來很快,風靡全球的 魔獸爭霸3 冰封王座 就是採用...

在遊戲中如何使用LUA指令碼語言

當你希望在你的遊戲開始的時候讀取一些資訊,以配置你的遊戲,這些資訊通常都是放到乙個文字檔案中,在你的遊戲啟動的時候,你需要開啟這個檔案,然後解析字串,找到所需要的資訊。是的,或許你認為這樣就足夠了,為什麼還要使用lua呢?if player is dead then do something els...

Lua遊戲指令碼語言入門(一)

lua 的語法比較簡單,學習起來也比較省力,但功能卻並不弱。在lua中,一切都是變數,除了關鍵字。請記住這句話。前言.開發環境搭建 lua執行器 i.首先是注釋 寫乙個程式,總是少不了注釋的。在lua中,你可以使用單行注釋和多行注釋。單行注釋中,連續兩個減號 表示注釋的開始,一直延續到行末為止。相當...