转载时请注明原文出处http://blog.csdn.net/u012945598

该篇文章的内容仅仅是为了更好的在Cocos2d-x引擎中使用Lua提前储备一些关于Lua的语法知识,若要深入了解Lua请阅读专门书籍。

1.Lua 基本数据类型

nil 空

boolean 布尔类型

number 数值类型

string 字符串类型

userdata 自定义类型 这个类型专门用来和Lua的宿主打交道的。

function 函数类型 所有的函数,本身就是一个变量。

thread 线程类型

table 表类型


Lua是一种动态弱类型语言,灵活性十分强大,变量没有类型定义也可以使用。例如在Hello.lua的文件中声明一个变量:

myName="Lua" --无需写出myName变量的类型

myName=20

myName=print --此处将function函数赋给了变量,C/C++中无此功能,在某些情况下可以带来便利,比如nil类型

注意 “--”是Lua中的单行注释法,相当于C/C++中的 “//”,多行注释则使用"--[[ --]]",相当于/* */

在Lua中提供了一个函数type,专门用来测试给定变量或者值的类型。使用方法如下:

print(type(nil)) --空类型

print(type(true)) --布尔类型

print(type("Hello world")) --字符串类型

print(type(print)) --函数类型

上述数据类型中有一个表类型(table),这是一种强大的数据结构,也是Lua中唯一的一种数据结构。我们可以将它看做类似数组或容器的存在,只不过相对于C/C++中的数组,table更为灵活。例如,C语言中的数组只能用正整数作为索引,而table可以用任何东西做索引(nil除外),不限于数字;在C语言中,数组中的元素必须是相同类型的,而在Lua中,table可以存放任意类型的值(nil除外)。下面我们来定义一个table:

helloTable={ } --定义一个空表

helloTable[1]=25 --类似于C语言中使用数组的方法


helloTable={name="reventon",IQ=127}

此行代码可看成:

helloTable={ } --必须先定义成一个表,因为未定义的变量属于nil类型

helloTable["name"]="reventon"

helloTable["IQ"]=127

当索引字符串的时候,我们可以简写成:

helloTable.IQ=127

helloTable.name="reventon"

定义表的时候我们可以把全部的数据写在"{ }"之间,例如:

hellotable={

10,--此时索引值默认为[1],相当于[1]=10,元素之间需要用“ ,”隔开

[100]=20,--索引[100]的值是20,所有的索引值都需要用“'[ ]”括起来,字符串除外

You={ --字符串索引可以去掉引号及中括号

Age = 30,--字符串索引也可以写成 ["Age"]=30

IQ=12

},

20 --相当于[2]=20,索引被默认成了数字,从1向后排

}

2. Lua 关键字保留
 Lua脚本语言是大小写敏感的,保留字如下:

and break do else elseif end false for function if in local nil not or repeat return then true until while

3. 表达式

Lua中有四种运算符

(1) 算术运算符(只能用于数字类型当中)

加 + 减(负值) - 乘 * 除 /

幂运算 ^ 例如: 2^3的结果为8 3^3的结果为9

(2)关系运算符

返回结果均为true / false,若比较时两个值的类型不同,返回的结果一定为false,nil类型只能与自己相等。

> < <= >= == ~=(相当于C中的!=)

(3)逻辑运算符

and or not

and 和 or 与C语言区别特别大。
    在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0也是true!
    and 和 or的运算结果不是true和false,而是和它的两个操作数相关。
    a and b:如果a为false,则返回a;否则返回b
    a or b:如果 a 为true,则返回a;否则返回b

print(4and5)--输出5
   print(nil13)输出nilprint(false输出falseor输出4输出5

(4)链接运算符

.. --两个点

连接两个字符串,可以用".."运处符。如:
   "This a " .. "string." -- 等于 "this a string"


运算符优先级 高——低

^

not - (一元运算)

* /

+ -

..

< > <= >= ~= ==

and

or

4.语句

(1)赋值语句
    赋值语句在Lua被强化了。它可以同时给多个变量赋值。
    例如:
    a,b,c,d=1,2,3,4
    甚至是:
a[i],a[j] = a[j],a[i]

需要注意的是:当变量个数大于值的个数,将会按变量个数补足nil

当变量个数小于值的个数,多余的值会被忽略

(2)全局变量与局部变量

在默认情况下,变量总是认为是全局的。假如需要定义局部变量,则在第一次赋值的时候,需要用local说明。比如:
   local a,c = 1,3 -- a,c都是局部变量

与全局变量相比,局部变量还存在以下优势:访问速度更快

不会出现名字的访问冲突

(3)控制语句

--if语句,共有三种形式

if 条件 then...end

if 条件 then...else...end

if 条件 then... elseif 条件 then... (可以多个elseif)end

例如:if1+1==2thenprint("true")
elseif1+1~=2thenprint("false")
elseprint("true")end

--repeat -until 语句

repeat

...

until 条件;

repeat语句类似于do-while语句

例如:repeatprint("hello")until1+~=2

--for 循环语句

Lua的for循环分为两种形式,一种为数值循环,另外一种为泛型循环

--数值循环

for var = exp1,exp2,exp3 do

.......

end

例如:fori=1,102doprint(i)end

for语句执行时,i的初值为1,每次循环i值+2,直到i值加到10,若exp3部分省略,则默认每次加1,如果要退出循环,可使用break语句。

--泛型循环

for 变量1,变量2,... 变量n in 表或枚举函数 do ... end

例如:--输出表中所有的key

fork in pairs(t)doprint(k)end

--While

while 条件 do ... end

例如:while1+1~=2doprint("true")end

5.函数

在Lua中,使用function来定义一个函数,在编码过程中,函数可以被当做变量使用。

function 函数名 (参数列表)

函数体

end;

Lua函数的特征

(1)可变参数

开发者可以使用“ ... ”表示可变的参数,Lua会将函数的参数放在一个叫arg的表中,此表除了包含参数,还有一个域n的数值表示参数的个数

例如:function f(a,...) end

f(1,2,3,4) --a=1,b=2,arg={3,4;n=2}

(2)多返回值

functions()
     
 return1,234

end

    a,d=s()此时,a=1,c=3,d=4,函数被当做了赋值表达式

函数作为调用语句时,例如:print(s()) --此时会输出1,4

print(s(),1) --1,1

print(s() .. "x") -- ax

函数用于表构造初始化,例如:a={s()} --a{'1','2','3','4'}

由此可以看出

当函数调用作为赋值表达式最后一个函数,或者仅有一个参数时,Lua会根据函数返回值个数去返回,其他的情况函数调用仅返回第一个参数。

在函数仅仅被用作调用语句时,或者用于表构造函数中的初始化时,也于多赋值值是相同的。多余的部分丢弃,多余的部分则用nil补充。

可以使用圆括号强制函数只返回一个值,例如 print((s())) --a

函数调用的方式有两种,一种是 fun:s()

另一种是 fun.s()

Cocos2d-x Lua脚本基本语法的更多相关文章

  1. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

  2. iOS &gt;&gt;块&gt;&gt;更改块外部的变量值

    我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用附加字符串本地化Info.plist变量

    我正在尝试本地化应用程序的名称,同时仍然能够根据构建配置追加字符串.所以目前它被设置为:该设置定义为:通过这种方式,我们可以为应用程序添加后缀以用于不同的beta版本.问题是,当我们尝试本地化本地化的InfoPlist.strings中的应用程序显示名称时,就像这样我们覆盖存储在Info.plist中的值,并丢失后缀字符.这有什么好办法吗?

  5. iOS – 开始iOS教程 – 变量之前的下划线?

    这是正确的还是我做错了什么?

  6. ios – 静态计算变量被多次实例化

    我有一个日期格式化程序,我试图在UITableViewCell子类中创建一个单例,所以我创建了一个这样的计算属性:问题是我不止一次看到print语句,这意味着它不止一次被创建.我已经找到了其他方法,但我很想知道这里发生了什么.有任何想法吗?解决方法您的代码段相当于只获取属性,基本上它与以下内容相同:如果你只想运行一次,你应该像定义一个惰性属性一样定义它:

  7. ios – UIApplication.delegate必须仅在主线程中使用[复制]

    我应该在主调度中的viewControllers中声明这些)变量位置声明定义了它的范围.您需要确定这些变量的范围.您可以将它们声明为项目或应用程序级别(全局),类级别或特定此功能级别.如果要在其他ViewControllers中使用这些变量,则使用公共/开放/内部访问控制将其声明为全局或类级别.

  8. ios – 无法理解Objective-C块文档

    为什么localVariable“按价值使用?”>如果我在第二个例子中将__block存储类型添加到localVariable,我错误地假设该块关闭了变量,所以它将它保留在堆中直到块被释放?解决方法Howexactlyisoneexample“accessedbyreference”whiletheotheroneisaccessedbyvariable?self是当前正在执行找到块的方法的对象.强引用只是意味着对象的保留计数增加.IfIaddthe__blockstoragetypetolocalVar

  9. ios – 为BOOL变量编写getter和setter

    显然,使用obj-c,通常没有理由编写getter和setter(感谢有用的mr@synthesize).所以现在,需要做到这一点,我遇到了一个我不知道如何编写它们的问题.:p我敢肯定我可能不会以正确的方式解决我的问题–只是将我的对象子类化得更容易–但我正在尝试编写类别代码以添加属性,因为(在开头)它更快,因为我想学习如何在我的应用程序中使用类别代码.我有这个:我在setter中没有if查询就试过

  10. ios – 为什么不保留__block变量(在非ARC环境中)?

    我正在阅读__blockvariables上的文档,并考虑我使用__block的情况.对我来说,似乎我需要两种情况:>在块中使用时将变量标记为读写>在块内引用self时避免保留周期从表面上看,这两件事似乎并不相关.我认为__block变量没有被保留为更多的技巧我需要记住避免保留周期的特定用例.我想知道,为什么不能保留它们是否有更重要的建筑理由?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部