在很多游戲中,腳本語言是不可或缺的一部分,很多游戲都使用到了Lua,js,python一類的腳本,腳本語言可以在很多方面給開發進程帶來幫助。腳本語言可以作為初始化文件讀入變量和游戲數據的一個快速而方便的方法。它們通常因為具有節省編譯時間提高生產效率、提高創造性和拓展性的有點而受到眾多游戲開發廠商的青睞。在本篇博客中,馬三將和大家一起學習一下Lua這門腳本語言。
一、搭建Lua運行環境
學習任何一門編程語言恐怕都是要先搭建起來它的開發環境,這樣才能多寫代碼多練習。Lua有一個交互的解釋程序(lua.exe),你可以用它來驗證一些小的代碼片段,但是對於比較長和復雜的代碼,最好是使用C/C++的Lua API來運行,下面的代碼就是從C/C++程序中運行一個Lua腳本所需的代碼塊:
extern "C" { #include <Lua.h> #include <lualib.h> #include <lauxlib.h> }
第一步要做的就是包含相關的頭文件,因為Lua是一個純C的庫,所以必須顯式地讓編譯器知道這一點,不然就會遇到問題。通過將#include 和 extern "C"一起使用就可以解決了。
//包含lua庫。如果你的編譯器不支持這個指令的話,那么別忘了在你的項目設置中加入這些庫 #pragma comment(lib,"lua.lib") #pragma comment(lib,"lualib.lib) #include <iostream> int main(){ //創建一個lua state lua_State *pL=lua_open(); }
每一個運行的腳本文件都在一個動態分配的叫做lua_State的數據結構中運行。Lua庫中的每一個函數的調用都需要把lua_State的指針作為一個參數傳遞給那個函數,因此在運行一個Lua腳本文件之前,必須通過lua_open來創建一個Lua State。
//開啟lua中的標准庫
lua_open_base(pL);
luaopen_string(pL);
luaopen_table(pL);
luaopen_math(pL);
luaopen_io(pL);
Lua中有幾個標准庫,它們提供了輸入輸出、算術計算、字符串操作等一系列的功能函數。上面的幾行代碼可以讓你在腳本里調用這些庫命令,就像C++#include響應的庫一樣。
if(int error=lua_dofile(pL,"lua_script.lua") !=0 ){ std::cout<<"error!"<<endl; return -1; }
使用lua_dofile命令可以裝入、編譯、運行Lua腳本。如果運行的時候報錯了,那么它會返回一個錯誤的代碼。
二、Lua的變量、類型、操作符和條件結構
搭建好環境終於可以寫些Lua代碼練練手了。但是在這之前我們還是先來熟悉一下Lua的變量、類型、操作符和條件結構(如果你之前有任何一門編程語言的基礎,那么這些內容學起來將會十分輕松)。
1.Lua變量
Lua是一門動態語言,它和C++/Java不同,變量是可以被賦予任何類型的值(這點和js,python等腳本一樣),比如:
--lua腳本開始啦! name="masanxiaohuoer" print("Name="..name); pi=3.1415926 name=pi pi=false
在Lua中,注釋通常是以“--”開始的,如果要寫多行的注釋,可以這樣的結構:--[[這是一段注釋內容]]。在lua中,每句代碼后面的分號可寫可不寫,但是當你的代碼跨行的時候分號是必不可少的。同時在lua中可以同時給多個變量賦予多個值。
a,b,c,d = 1,2,3,4
如果左側的變量個數比右側的多的話,那么多余出來的變量就會被賦予nil值,nil在lua中表示沒有意義,空值(類似於C++中的NULL)。如果右側的值多的話,那么多余的值就會被丟棄掉了。在Lua中,有3中不同的變量:global(全局)、local(局部)、table fields(表)。如果一個變量沒有用local修飾的話,那么它默認就是global的。在一個變量被賦值之前,它的值是nil。
2.Lua類型
Lua中有以下的8種基本數據類型:
(1)Nil空
nil和其他的類型都不同,她用來表示沒有意義,空值。一旦給一個值賦予了nil,它就消失了,好像從來沒有存在過一樣。
(2)Number數值
number類型用來表示浮點數。在lua內部,這個值被處理為double。因此,當傳遞number類型的變量給C/C++程序的時候,要記得將它們映射成對應的正確類型。
(3)String字符串
string類型是字符串類型,你可以使用“..”來鏈接兩個字符串。如果有一邊的類型不是string的話,那么它會被轉型為string類型,然后連接。
(4)Boolean布爾
用來表示true或者false的值類型,false或者nil都是假,其余的為真。
(5)Function函數
和C/C++不同,在Lua中,函數也是一種類型,也可以賦值給一個變量。因此通過使用那個變量的名字,你就可以調用那個函數。因為Lua是弱類型的語言,參數列表和返回值都不需要指定類型。下面是一個簡單的例子,求兩個數之和。在Lua中,函數塊通過end關鍵字來結束。
add=function(a,b) return a+b end
如果你習慣用的是java或者C++一類的語言的話,可能會對這個語法感覺有點陌生。Lua提供了另外一個定義一個函數的方式,這樣看起來更像C++/java了:
function add(a,b) return a+b end
和C++不同的是,lua的函數可以一次返回多個變量,比如下面這樣寫是完全沒有問題的:
function Increse(a,b) return a+1,b+1 end a=2,b=4; a,b=Increase(a,b) print(a,b)
(5)Table表
table是Lua中一種非常重要也非常強大的數據類型,你可以把表看成一種關聯數組或者哈希表。這意味着你不但可以用整數來索引一個表,也可以使用任何類型的鍵值來索引一個表,而且lua的表是混合類型的,它們可以包含不同的數據類型。
--創建一個table my_table={} --添加一些數據到表中 my_table[1]=2333 my_table[2]=666 my_table[3]="HelloWorld" --或者你也可以一次性的初始化一個表 my_table={2333,666,"HelloWorld"} --關聯索引 my_table["one"]=2333 my_table[6]="Study" --除了使用[]以外,我們還可以使用.來存取一個值 my_table.one =2333 --函數也可以賦值給表 function add(a,b) return a+b end my_table={} my_table["add"]=add print(my_table.add(2,3))
(6)UserData用戶數據
userdata類型允許Lua變量存儲定制的C/C++數據。一個userdata類型的變量不能在Lua中創建和修改,只有通過C/C++接口才可以(下篇我們會介紹這種方法)。
(7)Thread線程
通過這種類型,我們可以產生並運行新的線程
3.邏輯操作符
Lua中有三種邏輯操作符,分別是:and,or,和not。他們和C++中的&&、||和!很像,並且和C++一樣,只有在必要的情況下,他們才會檢查第二個條件。nil和false為假,其他都為真。
4.條件結構
Lua中提供了if\while\repeat\for幾種條件結構。lua的幾個版本的if和while控制結構和C++很類似,只不過lua中條件不需要寫在小括號中。
if a==4 then print("four") else print("other") end --while循環 while a<=100 then a=a+1 end print(a) --while和if語句都已end關鍵字結束 --repeat和until關鍵字一起聯用,就像這樣: repeat a=a+1 print(a) until a==100 --for結構有兩個版本,一個用於數字,一個用於表 --用於數字的for循環的語法: for var=low_value,high_value,step do xxxxxx end --舉例 for a=10,20,2 do print(a) end
和C/C++一樣,你也可以使用break來退出循環。
另外還有一種for循環用來遍歷表
--語法 for key,value in table do xxxxx end
key和value分別代表鍵和值,table就是我們要遍歷的表。
--舉例 my_table={a=1,b=2,c=3} for k,v in my_table do print(k,v) end
到現在,我們已經稍微對Lua有了一些了解,但是我們還不能用它來為我們的游戲程序服務。下篇我們將共同學習Lua和C/C++的接口,以及Lua如何應用在Cocos2d-X和Unity引擎中。
作者:馬三小伙兒
出處:http://www.cnblogs.com/msxh/p/6033679.html
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!