【游戲開發】小白學Lua(上)


  在很多游戲中,腳本語言是不可或缺的一部分,很多游戲都使用到了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 
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM