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