cocos2d-Lua01Lua基础语法

来源:互联网 发布:js 数组变量 编辑:程序博客网 时间:2024/06/05 17:45

一、第一个Lua程序

  1. -- 通过 print 打印, 可以使用 print 是因为 C 库中有该方法,当看见 paint
  2. -- 就去C里调用 print 方法
  3. -- 注     Lua 语句后面不加 ; 号, 加了也不报错
  4. --     Lua 中没有{ } 花括号, 因为C代码中没有对{ }进行编译,不认识
  5. print"Hello lua"
  6. localfunction myfunc3(var )
  7.     returnvar
  8. end
  9. print( myfunc3(3456))

二、Lua中的流程控制语句

2.1 问题

本案例依次演示lua中的流程,包括ifelse判断语句、for循环语句以及while循环语句等。

2.2 方案

Lua中的条件判断语句没有{ }花括号,使用关键字then和end代替,then和end就相当与花括号。

Lua中的for循环表达式的规定如下:

Lua中的while循环没有花括号,取而代之的是关键字do和end。repeat和until相当于别的语言中do-while,repeat 后面不需要do。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:条件判断语句

使用开发工具SublimeText2新建一个lua文件,完成一个if判断语句和ifelse判断语句,Lua中的特殊符号组合:==、>、<、>=、<=、~=(不等于),代码如下所示:

  1. if x== 15 then
  2.     print("x's value is 15")
  3. end
  4. --完整的if else 语句块
  5. x = 13
  6. if x== 15 then
  7.     print("x's value is 15")
  8. elseif x== 12 then
  9.     print("x's value is 12")
  10. else
  11.     print("x's value is "..x)
  12. end

步骤二:循环语句

使用开发工具SublimeText2新建一个lua文件,使用while循环遍历一个table数据,代码如下所示:

  1. m_table = {10, 2, 3}
  2. locali = 1
  3. whilem_table[i] do
  4.     print (m_table[i])
  5.     i = i + 1
  6. end

然后使用repeat和until语句依次输出x的值,代码如下所示:

  1. -- repeat (相当于 do while 循环但是有点不一样是满足条件退出)
  2. local x = 1
  3. repeat
  4.     print ("x value is " ..x)
  5.     x = x + 1
  6. until x == 8

编辑器中的效果和控制台输出结果如图-9、图-10所示:

图-9

图-10

使用for循环遍历表中的数据,代码如下所示:

  1. --如果第三个值是递增,第二个值就是最大值,如果i>最大值跳出循环; 第三个值 2 是每次递增的值,
  2. --如果不写的话默认是每次递增 1
  3. fori = 1, 4, 3 do
  4.     print ("i value is "..i)
  5. end
  6. --如果第三个值是递减,第二个值就是最小值,如果i<最小值跳出循环; 第三个值 -2 是每次递减的值,
  7. fori = 15, 1, -1 do
  8.     print ("i value is "..i)
  9. end
  10. -- 遍历表中所有元素(#m_table求出表中元素个数,相当与count)
  11. fori=1, #m_table, 1 do
  12.     print(m_table[i])
  13. end

编辑器中的效果如图-11所示:

图-11

2.4 完整代码

本案例中,完整代码如下所示:

  1. if x == 15 then
  2.     print ("x's value is 15")
  3. end
  4. --完整的 if else 语句块
  5. x = 13
  6. if x == 15 then
  7.     print ("x's value is 15")
  8. elseif x == 12 then
  9.     print ("x's value is 12")
  10. else
  11.     print ("x's value is "..x)
  12. end
  13. -- while 练习
  14. m_table = {10, 2, 3}
  15. locali = 1
  16. whilem_table[i] do
  17.     print (m_table[i])
  18.     i = i + 1
  19. end
  20. -- repeat (相当于 do while 循环 但是有点不一样 是满足条件退出)
  21. local x = 1
  22. repeat
  23.     print ("x value is " ..x)
  24.     x = x + 1
  25. until x == 8
  26. --for
  27. --如果第三个值是递增,第二个值就是最大值,如果i>最大值跳出循环; 第三个值 2 是每次递增的值,
  28. --如果不写的话默认是 每次递增 1
  29. fori = 1, 4, 3 do
  30.     print ("i value is "..i)
  31. end
  32. --如果第三个值是递减,第二个值就是最小值,如果i<最小值跳出循环; 第三个值 -2 是每次递减的值,
  33. fori = 15, 1, -1 do
  34.     print ("i value is "..i)
  35. end
  36. -- 遍历表中所有元素 (#m_table 求出表中元素个数,相当与count)
  37. fori=1, #m_table, 1 do
  38.     print(m_table[i])
  39. end
隐藏

3 Lua中的函数

3.1 问题

本案例依次演示lua中的不同类型的函数,包括无参数、有参数、有参数有返回值、多个返回值以及可变长参数函数等。

3.2 方案

Lua中函数的定义:

3)参数不需要参数类型;

4)如果函数需要别Lua文件调用,不需要加 local 关键字,如果不想别的Lua文件调用,最好号加上local关键字;

5)函数用关键字end结尾。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:无参数函数

使用开发工具SublimeText2新建一个lua文件,定义一个无参数的函数,代码如下所示:

  1. local function myfunc1()
  2.     print ("myfunc1")
  3. end
  4. myfunc1()

运行程序控制台输出“myfunc1”,编辑器中的效果如图-12所示:

图-12

步骤二:有参数函数

使用开发工具SublimeText2新建一个lua文件,定义一个有参数的函数,代码如下所示:

  1. local function myfunc2( var )
  2.     print ("myfunc2 --> "..var)
  3. end
  4. myfunc2("Hello")

运行程序控制台输出“myfunc2 --> Hello”,编辑器中的效果如图-13所示:

图-13

步骤三:有参数有返回值函数

使用开发工具SublimeText2新建一个lua文件,定义一个有参数有返回值的函数,代码如下所示:

  1. --有参数有返回值
  2. local function myfunc3( var )
  3.     returnvar
  4. end
  5. print ( myfunc3(3456) )

运行程序控制台输出“3546”,编辑器中的效果如图-14所示:

图-14

步骤四:多个返回值函数

使用开发工具SublimeText2新建一个lua文件,定义一个多个返回值的函数,代码如下所示:

  1. --有两个返回值Lua中的函数支持多返回值
  2. local function myfunc4()
  3.     return 5, 10
  4. end
  5. local x, y = myfunc4()
  6. print ("x = " ..x .." y = " .. y)

运行程序控制台输出“x = 5 y = 10”,编辑器中的效果如图-15所示:

图-15

步骤五:可变长参数函数

使用开发工具SublimeText2新建一个lua文件,定义一个可变长参数的函数,参数的下标从1开始,代码如下所示:

  1. --可变长参数Lua中下标从 1 开始,而不是大多数语言的从 0 开始
  2. local function myfunc5(...)
  3.     --遍历参数用 Table 接受
  4.     localmyTable = {...}
  5.     fork,v in pairs(myTable) do
  6.         print(k,v)
  7.     end
  8.     print("get value is " ..myTable[1])
  9. end
  10. myfunc5("zzzz", "sdfa", 11223)

运行程序控制台输出“1 zzzz2 sdfa3 11223”,编辑器中的效果如图-16所示:

图-16

3.4 完整代码

本案例中,完整代码如下所示:

  1. --Lua中的函数
  2. --无参数
  3. local function myfunc1()
  4.     print ("myfunc1")
  5. end
  6. myfunc1()
  7. --有参数
  8. local function myfunc2( var )
  9.     print ("myfunc2 --> "..var)
  10. end
  11. myfunc2("Hello")
  12. --有参数 有返回值
  13. local function myfunc3( var )
  14.     returnvar
  15. end
  16. print ( myfunc3(3456) )
  17. --有两个返回值 Lua中的函数支持多返回值
  18. local function myfunc4()
  19.     return 5, 10
  20. end
  21. local x, y = myfunc4()
  22. print ("x = " ..x .." y = " .. y)
  23. --可变长参数 Lua中下标从 1 开始,而不是大多数语言的 从 0 开始
  24. local function myfunc5(...)
  25.     --遍历参数 用 Table 接受
  26.     localmyTable = {...}
  27.     fork,v in pairs(myTable) do
  28.         print(k,v)
  29.     end
  30.     print("get value is " ..myTable[1])
  31. end
  32. myfunc5("zzzz", "sdfa", 11223)

4 Table的使用

4.1 问题

在别的编程语言中会有容器、数组、集合、链表等,Lua中的table就是一个数据的集合,本案例演示table的使用,包括table的创建、table的遍历以及table的使用。

4.2 方案

首先创建一个table,然后使用for循环遍历table,通过#获取table的长度。

然后安装免费的编程工具SublimeText2,如果要开发lua选择 Tools –> Build System -> New Build System重新开启一个文件,新建一个lua编辑器。

最后重新打开 Sublime Text 2 工具,创建文件并保存为a.lua,输入print ("Hello Lua")并保存,使用快捷键command + B运行程序,下方控制台会输出“Hello Lua”。注意:a.lua所在路径不能出现中文,只能是英文的路径,否则无法显示输出结果。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:遍历table

首先创建一个table类型的数据TrTable,然后使用for循环遍历TrTable,通过#TrTable获取table的长度,Lua中table 的索引是从1开始的而不是0。table 的访问和其他语言中的数组访问方式很类似,代码如下所示:

  1. --建立一个空的table
  2. TrTable = {}
  3. --建立一个有数据的table
  4. TrTable = {
  5.     1,
  6.     2,
  7.     3,
  8.     4
  9. }
  10. --遍历 table (#mytable2 是获取 table 的长度)
  11. fori=1, #TrTable do
  12.     print(TrTable[i])
  13. end

编辑器中的效果如图-1所示:

图-1

控制台中输出的结果如图-2所示:

图-2

table 中的变量类型可以是数值类型也可以是字符串类型,代码如下所示:

  1. TrTable = {
  2.     1,
  3.     2,
  4.     3,
  5.     4,
  6.     "Hello Tarena !",
  7.     5
  8. }

编辑器中的效果如图-3所示:

图-3

控制台中输出的结果如图-4所示:

图-4

步骤二:在table 中添加另外一个 table

在table中添加另外一个table,代码如下所示:

  1. --在 table 中添加另外一个 table
  2. TrTable = {
  3.     1,
  4.     2,
  5.     3,
  6.     "Tarena",
  7.     TrTable1 = {4, 5, 6, 7},
  8.     "Hello Lua",
  9. }

遍历TrTable,TrTable1 = {4, 5, 6, 7}不能输出,因为table的一个特性遍历时按一个顺序来的,如果是一个对象的话不会输出,但是 "Hello Lua" 能输出,因为这时的 "Hello Lua" 的索引是5,代码如下所示:

  1. --在 table 中添加另外一个 table
  2. TrTable = {
  3.     1,
  4.     2,
  5.     3,
  6.     "Tarena",
  7.     TrTable1 = {4, 5, 6, 7},
  8.     "Hello Lua",
  9. }
  10. --遍历table (#mytable2 是获取 table 的长度)
  11. fori=1, #TrTable do
  12.     print(TrTable[i])
  13. end

编辑器中的效果如图-5所示:

图-5

控制台中的输出结果如图-6所示:

图-6

步骤三:table的三种遍历方式

第一种方式只能遍历索引连续的元素,如元素不是数值类型或字符串,那么不会添加索引,代码如下所示:

  1. TrTable = {
  2.     k = 200,
  3.     2,
  4.     3,
  5.     4,
  6.     TrTable1 = {1, 2},
  7.     x = 500,
  8.     5,
  9. }
  10. fori = 1, #TrTable do
  11.     print ("value is " ..TrTable[i])
  12. end

编辑器中的效果如图-7所示:

图-7

控制台中的输出结果如图-8所示:

图-8

第二种方式ipairs只获取自然索引的元素,和普通for的结果是一样的,都是按照当前的自然索引来取值的,如果table中存放的是数值类型或字符串,table会自动生成自然索引,代码如下所示:

  1. fori,v in ipairs(TrTable) do
  2.     print(i,v)
  3. end

编辑器中的效果如图-9所示:

图-9

控制台中的输出结果如图-10所示:

图-10

第三种方式pairs通过key获取的元素,table是一个指针,代码如下所示:

  1. fork,v in pairs(TrTable) do
  2.     print(k,v)
  3. end

编辑器中的效果如图-11所示:

图-11

控制台中的输出结果如图-12所示:

图-12

4.4 完整代码

本案例中,完整代码如下所示:

  1. --建立一个空的table
  2. TrTable = {}
  3. --建立一个有数据的table
  4. TrTable = {
  5.     1,
  6.     2,
  7.     3,
  8.     4
  9. }
  10. --遍历 table (#mytable2 是获取 table 的长度)
  11. fori=1, #TrTable do
  12.     print(TrTable[i])
  13. end
  14. --table中的变量类型可以是数值类型也可以是字符串类型
  15. TrTable = {
  16.     1,
  17.     2,
  18.     3,
  19.     4,
  20.     "Hello Tarena !",
  21.     5
  22. }
  23. --遍历 table (#mytable2 是获取 table 的长度)
  24. fori=1, #TrTable do
  25.     print(TrTable[i])
  26. end
  27. --在 table 中 添加另外一个 table
  28. TrTable = {
  29.     1,
  30.     2,
  31.     3,
  32.     "Tarena",
  33.     TrTable1 = {4, 5, 6, 7},
  34.     "Hello Lua",
  35. }
  36. --遍历table (#mytable2 是获取 table 的长度)
  37. fori=1, #TrTable do
  38.     print(TrTable[i])
  39. end
  40. --[[TrTable1 = {4, 5, 6, 7}不能输出,因为table的一个特性,
  41. 遍历时按一个顺序来的,如果是一个对象的话不会输出.
  42. 但是 "Hello Lua" 能输出,因为这时的 "Hello Lua" 的索引是 5]]
  43. --table 中可以直接给变量赋值
  44. TrTable = {
  45.     k = 12
  46. }
  47. print (TrTable[k])
  48. --[[这里输出为 nil 是因为在 TrTable 中找不到 索引 k 位置。
  49. 而 TrTable 中的 k 实际上是 key。
  50. ]]
  51. print (TrTable["k"])
  52. --正常打印是因为 会通过 "k"(key) 找到所在的索引 然后输出
  53. print (TrTable.k)
  54. -- 这里的 TrTable.k 等价于 TrTable["k"]
  55. --[[ TrTable[tr] 以变量 tr 的值做为 table 的索引 ]]
  56. tr = 100
  57. TrTable[tr] = 500;
  58. print (TrTable[tr])
  59.     --table三种遍历方式
  60. -- 第一种遍历方式
  61. --[[该方式只能遍历索引连续的元素, 如元素不是 数值类型 或 字符串,那么不会添加索引]]
  62. TrTable = {
  63.     k = 200,
  64.     2,
  65.     3,
  66.     4,
  67.     TrTable1 = {1, 2},
  68.     x = 500,
  69.     5,
  70. }
  71. fori = 1, #TrTable do
  72.     print ("value is " ..TrTable[i])
  73. end
  74. -- 第二种遍历方式
  75. --[[ foripairsi:indexv:value
  76. ipairs:只获取 自然索引的元素 ,和普通 for 的结果是一样的,
  77. 都是按照当前的自然索引来取值的]]
  78. fori,v in ipairs(TrTable) do
  79.     print(i,v)
  80. end
  81. --[[ 自然索引:如果 table 中存放的是 数值类型 或 字符串, table会自动生成自然索引]]
  82. print ("=====================================")
  83. print "====================================="
  84. -- 第三种遍历方式
  85. --[[ for pairs k:keyv:value
  86. pairs:通过key获取的元素 ]]
  87. fork,v in pairs(TrTable) do
  88.     print(k,v)
  89. end
  90. --[[ TrTable1    table: 0x7f9d684084c0 是一个地址,也就是说 table 是一个指针]]


--------------------------------------------------------------------源自某内笔记--------------------------------------------------

0 0
原创粉丝点击