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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值