深入學習Lua
本人學習lua遊戲開發實踐指南的學習筆記,主要記錄書中的一些知識點。
1、 函數
函數是劃分遊戲腳本功能的主要工具,它是通過標識符(事實上是一個變量)調用的lua代碼塊,可以執行某種處理、返回值,或者二者都有。
簡單的函數定義如下:
Function Wow()
print(“ ”)
print(Wow ,that wasaawesome:)
print(“ ”)
end
函數定義以function關鍵字開始,後面是函數名稱,然後是傳遞給函數的參數列表。在上面的例子中,沒有參數傳遞給函數,單我們仍然用()來表示一個空的參數列表。函數的定義以end關鍵字結尾。
單一參數
下面的一個例子只有一個參數:
FunctionSetName(myString)
print(“ ”)
print(“Your name is :”,myString)
print(“ “)
end
在這個函數中,參數myString傳遞給了函數,並在函數中使用。函數中的參數是局部變量,在調用結束時被回收。
多個參數
下面的一個例子我們可以傳遞多個參數,但之間用逗號隔開,例如:
FunctionMyInfo(myName,myAge)
print(“ ”)
print(“Your name is :”,myName)
print(“Your age is:”,myAge)
print(“ “)
end
lua還有一個強大的功能,就是定義不定長的參數列表。使用(…)代替參數列表,LUa會創建一個局部的名字爲arg的table,保存所有調用時傳遞的參數,以及參數個數(通過arg.n獲取)。
返回值
使用函數進行獨立的處理,可以將處理結構返回到被調用的腳本。函數使用return關鍵字並跟上數值(通常爲變量名)來返回結果。參考下面示例:
functionTimesTwo(myValue)
myValue = myValue*2
return myValue
end
可以使用具有返回的函數作爲表達式的參數例如:
a = 24+TimesTwo(12)
return(a)
函數還可以返回多個結果,只需要逗號分隔開來。參考下面的示例:
FunctionThreeDice()
d1 =math.random(1,6)
d2 = math.random(1,6)
d3 =math.random(1,6)
myTotal = d1 + d2 +d3
returnd1,d2,d3,myTotal
end
2、標準庫
Lua提供大量的標準函數庫,可以幫助你完成許多複雜的處理而不需要編寫而外的代碼。
2.1、Assert(myValue)()
Assert函數可以讓你像處理函數一樣運行編譯後的lua代碼塊。傳入指向編譯後的代碼的變量,然後立刻被執行。你可以使用loadstring或者loadfile函數載入並編譯腳本。
在遊戲開發中,雖然loadfile並不常用(因爲可以用跟簡單的方式載入文件),但是loadstring和assert函數經常配合使用。你可以用loadstring函數編寫好的代碼塊存到string中,然後再用assert函數執行它。
2.2、dofile(filename)
前面我們使用過這個函數,它的功能是載入並立刻執行lua腳本文件。通常我們用它來載入定義函數的文件以備調用,除此之外還可以用來載入數據文件,參考下面的示例:
dofile(“scripts/runtime_functions.lua”);
2.3、math.floor()
floor函數用來向下取整(lua中沒有浮點數或者整數的概念),該函數只是捨去小數部分,如果想四捨五入去整一個數字,那麼可以先給它加上0.5,然後向下取整。參考如下示例:
a = 5.125
b = 5.75
a = a+0.5
b = b+0.5
a = math.floor(a)
b = math.floor(b)
2.4、math.random()
在遊戲中開發過程中,隨即函數隨處可見。math.random()函數隨機生成一個0~1之間的僞隨機數(和其他的編程語言類似)。Lua函數更有用的是可以傳入最大和最小值,這樣就可以隨機生成這個範圍內的數字,參考如下示例:
myDie = math.random(1,6)
當程序開始的時候,最好給隨機數種子設定一耳光唯一的值,這樣就可以得到更好的隨機數。
2.5、math.min()
在遊戲開發過程中,經常需要確定一個集合的最大或者最小值(如英雄角色的最高屬性,或者最多票選)。Math.min函數和math,max函數可以爲你提供這樣的功能。它們可以接受若干數字類型的參數,math.min函數返回最小值,math.max函數返回最大值。
2、 字符串處理
Lua最強大的特性之一就是它的字符處理能力。Lua具有可擴展的模式匹配功能,以及許多實用的字符串處理函數。
2.1、類型轉換
在遊戲開發中,字符和數字之間常常需要轉換。要把字符串轉換爲數字,可以使用tonumber函數,例如:
myString = “1234”
myNumber =tonumber(myString)
print(myNumber +2)
可以使用tostring()函數把數字轉換爲字符串
myNumber = 1234;
myString =tostring(myNumber)
print(typr(myString))
2.2、string.char(n1,n2,..)
string.char函數根據ASCII編碼返回傳入參數對應的字符。這個函數可以在Lua遊戲保存文件中插入一個換行符的時候非常有用。
2.3、string.len(myString)
通常情況下,知道字符串的長度是非常有用的,該函數可以告訴你這個消息,即返回傳入參數的字符串。例如:
myString = “1234”
print(string.len(myString))
2.4、string.sub(myString,start,end)
String。Sub函數返回指定字符串的子串,start參數指定子串的開始位置,end指定子串的結束位置。例如:
myString = “hello word”
newString = string.sub(myString,1,5)
print(newString)
也可以指定start參數爲負數,在這樣的情況下,子串位置從字符串的最後開始計算如果strt爲-5,那麼返回字符串的最後5爲,例如
myString = “hello world”
newString = string.sub(-5,10)
print(newString)
end參數可以省略,這個時候函數會返回從start到字符串末尾的子串。通過這種方式獲取指定字符串的後綴美麗如:
myString = “hello world”
newString = string.sbu(myString,-5)
print(newString)
2.5、string.format()
String.format函數可以讓你格式化指定字符串,在輸出字符串到GUI界面時,這個函數很常用。我們可以使用這個函數連接字符串(lua不能簡單的連接兩個字符串)例如:
string1 = “hello”
string2 = “world”
for index =1,3 do
string = string.format(“%s%s”,string1,string2)
end
print(string1)
在上面的例子中string.format函數的第一個參數用來指定字符串的格式。由於%s表示字符串(%d表示數字),所以%s%s表示連接兩個字符串。
string.format函數的另外一個主要用途是根據參數格式化輸出複雜的字符串。
myName = “fred”
myStr = 16
myString = string.format(“%s%s%d%s”,myName,”s strength is”,myStr,”.”)
print(myString)
5.6、string.find(sourceString,findString)
String.find該函數會在sourceString中查找第一個符合findString字符的位置。如果找到了該目標字符則返回它的開始和結束位置,如果沒有找到則返回nil,例如
myString= “Myname is John Smith”
sStart,sEnd= string.find(myString,”john”)
print(sStart,sEnd)
5.7、字符和格式
Lua強大的字符處理函數支持格式化功能。格式是一種模板,讓lua可以從字符串中過濾出有意義的結果。
myString = “the price is $17.50”
filter = “$%d%d.%d%d”
print(string.sub(myString,string.find(myString,fliter)))
使用大寫字母可以讓特殊符號(例如().%+_*?[^$]也能用在格式中,如%%代表百分比符號)。
5.8、string.gsub(sourceString,pattern,replacementString)
String.gsub函數返回一個字符串,sourceString字符滿足pattern格式的字符都會被替代成replacementString參數的值.
myString= “Myname is john Simth.My phone is 555-3257”
newString= string.gsub(myString,%d,”*”)
print(newString)
5.9、string.gfind(sourceString,pattern)
string.gfind函數遍歷一個字符串,一旦查找到符合 格式的字符串就返回該子串。
myString= “thisis my rather long string”
print(myString)
counter= 1
formyWord in string,gfind(myString,”%a+”)do
print(string.fotmat(“word #%d:%s”,counter,myWord))
counter= counter+1
end
使用for循環控制結構遍歷源字符串,%a+匹配獨立的單詞(在解析數據是非常有用)
6、table數據結構
6.1、table.getn(myTable)
Lua提供很多的內建函數操作table.首先,table.getn()返回table中元素的個數。
print(table.getn(myTable))
通常,我們使用table來保存遊戲數據,單用戶不知道表中有多少元素,通過這個函數用戶可以得到元素個數這個值,並用來獲取table中的每個值,例如:
forindex =1,table.getn(myTable) do
print(myTable[index])
end
table.sort(myTable)
這個簡單的函數遍歷整個table,並從小到大重新排列。
6.2、table.insert(myTable,positon,value)
Table.insert函數在table中國插入一個新的值,位置參數可選,如果沒有設定會添加新的值到tablea末尾,如果指定了該值,則插入到指定的位置。
Table.insert(mtTable,25,”hello”)
6.3、table.remove(myTable,positon)
Table.remove函數從指定table中刪除並返回一個元素,必要時重新索引table。如果沒有指定poition的值,則默認刪除table的最後一個元素。
print(table.remove(myTable,15))
6.4、pairs()
pairs()函數可以遍歷table中的每一個元素。
myName= {“fred”,”ethel”,”lucy”,”ricky”,”rocket”,”betsy”}
forindex ,value in pairs(myName) do
print(index,value)
end