关于Lua
游戏开发应用中Lua和C#的区别
Lua可以在几乎所有的操作系统和平台进行编译运行,可以很方便的更新代码,更新了代码后,可以直接在手机上运行,不需要重新安装(热更新方案)。
C#只能在特定的操作系统中进行编译成dll文件,然后打包进安装包在其他平台(Android、iOS)运行,在移动平台上不能更新替换已有的dll文件,除非重新下载安装包。
语言基础
语言入门
Lua类型
Lua是动态类型定义的语言(类型可以随意改变)。
Lua中的类型有(八种):
nil boolean userdata number string table function thread
nil类型
Lua中变量不需要声明,也不需要初始化,可以直接使用。
对于没有声明和初始化的变量默认值都为nil(空类型),如:
b = nil
把一个变量置空,相当于从没有使用过这个变量,Lua会销毁b所占的内存。
boolean类型
- false和nil都代表false,其他任何值都代表true(0和空字符串lua都认为是true)。
- and 和 or都是短路运算符,如果第一个操作数可以得到结果,就不会运算第二个操作数。
userdata类型
userdata是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
局部变量与代码块
代码块可是是一个控制结构的主题、函数的主体、一个代码段(变量被声明时所咋IDE文件或字符串,交互模式中不用do-end的每一行代码都是代码段)。
尽可能使用局部变量进行编程。
首先,可以避免由于不必要的命名导致与全局变量的混乱。
其次,局部变量可以避免不同代码段的变量命名冲突。
再次,访问局部变量比访问全局变量快。
最后,局部变量会随着作用范围的结束而被垃圾收集器进行释放。
实例1:
local x = 10
if i > 20 then
local x -->对于then来说是局部的
x = 20
print(x) -->20
else
print(x) -->10(全局的)
实例2:
local x1, x2 = 1, 10
do
local x1 = 2
local x2 = 20
end
print(x1, x2) -->1, 10
实例3:
local a, b = 1, 10
if a < b = then
print(a) --> 1
local a --> a = nil,局部变量a将屏蔽全局变量a
print(a) --> 10
local b = b -->局部变量b保留全局变量a此时的初值
print(b) -->10
end
print(a, b) -->1, 10
控制结构
Lua的控制结构包括用于条件执行的if,用于循环执行的for、while、repeat。( 条件判断均不用(),结构体均不用{} )
if、for、while的显式终结符为end,repeat的显式终结符为until。
控制表达式的结果可以是任何值。除了false和nil,所有其他值都被当作真值,包括0和空字符串。
另外,Lua不支持switch语句。
- 对于repeat-until,重复执行循环体直到条件为真时结束。
对于数值型for:
for var = exp1, exp2, exp3 do -->第三个表达式exp3可选,若不存在,默认为1
something
end -->循环结束,控制变量var作用范围仅仅在循环体内
- 对于return,有一种特殊使用情况,使用do-end。
function foo()
do return end
something -->此时return不会结束函数的执行
end
- 对于goto的使用
goto语句后面紧跟标签名。标签的设定是名字的名字前后紧跟两个冒号,这个设定是为了更好的突出标签。
使用goto,Lua进行了一些限制:
首先,标签遵循基本的可见性规则,即不能直接跳转到一个代码块中的标签(代码块中的标签对外不可见)。
其次,goto不能直接跳转到函数外。
最后,goto不能跳转到局部变量的作用域。
Lua语言规范有一个细节,局部变量的作用域终止于声明变量的代码块中的最后一个有效(non-void)语句处,便签被认为是无效的语句。如下:
while some_condition do
if some_other_condition then
goto continue
end
some code
::continue:: ->此处的标签为无效的语句,因此if中的跳转并未包含在局部变量的范围内
end
语法补充点
- 多重赋值:a = 1, 2,多余的值被丢弃,即a = 1,a, b = 1,多余的变量赋值为nil,即b = nil。
- 变量交换:a, b = b, a,返回结果为ab值互换。
- type(type(x):不管x是什么值,返回的永远是String,因为type函数的返回值是String。
因此Type()与nil作比较时nil应该加上双引号
type(X) --nil
type(X)==nil --false,原因是type(x)返回的是string,注意,nil是一种类型,不是值,区别C++中的null。
type(X) == "nil" --true
数值
整数和小数都是number类型的,整数和小数的大小,则被认为是相等的。
相关数字常量与数字函数
- 常量
math.pi,math.huge,math.maxinteger,math.mininteger - 求值函数
math.max( , values…),math.min( , values…),math.mod(value, modulus),math.pow(value, modulus),math.abs(value),math.sqrt(value)
math.log(value) – 返回此值的自然对数(以e为底数)
math.log10(value) – 返回以10为底数的值
math.exp(value) --计算以e为底x次方值
math.frexp(num) – 返回当前数字小数点后的数值以及小数点后的位数
math.ldexp(v