深入学习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