lua遊戲開發實踐指南學習筆記2

深入學習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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章