Lua学习笔记(一)
一.先来说说什么是lua
- 游戏方面的热更新框架,由于lua属于脚本语言,说起脚本语言你可能会想到JavaScript,没错,最大的特点就是不用发布时一起拿去编译,而是在用户使用时直接渲染,对于lua来说就是直接调用,那么我们再来想想,一般我们的手机游戏是不是经常更新?更新的时候为什么只是下载几m的数据而不是要求玩家把整个游戏安装包下载下了再覆盖(当然有的时候也存在要求玩家去下载整个包,那种情况是有重大变化的更新,属于架构层面的问题,我们这里不深入谈,大部分情况都是在游戏内进行热更新)。那我们换个思路想,是不是除了lua其他语言就不行呢?当然,条条大路通罗马,只是效率不一样而已,比如我一样可以把程序拆分成很多个dll,每次检查更新dll只是这样导致整个架构混乱,而且效率低下。当然现在做热更新用的肯定不是原生的lua,不过我们学习当然要从基本学起,以后的事情以后再说。
- 除了热更新,其他比如演算动画,剧本,角色数据等这些经常改动的东西也可以用lua来写,你想,我们做了个3d的rpg游戏,然后里面有句台词我们不满意要改,难道还要把整个客户端都重新编译一下嘛?有点夸张,不过意思大家都懂。
- 游戏之外,lua可以和大部分编程语言混合使用,结合lua轻便,随性,方便扩展的特点,可以轻松做到写插件,web脚本,应用扩展等等优点。
二.开始lua之旅
三.Lua基础语法难点,疑点
- lua中nil表示无,类似于null,但某变量a不用时直接a=nil即可,gc会自动回收
- lua中默认变量为全局变量,局部变量请加上local
- lua中的表类似数组和字典的结合体,既可以用数字索引a[1],也可以用字符串索引a[key],当索引不存在时,返回nil,不会报编译错误,因为根本没编译
- lua的表的索引是从1开始,这里与c有较大区别。
- 其实感觉lua中不管是变量还是函数和表,其本质都疑似指针,直接打印表print({0})出来是一串内存地址,再比如有个表a={1,2},b=a,a=nil,但是b依旧={1,2},想想堆结构和gc机制,恩,就是指针了。
- 对任意变量前加#,表示获取该变量的长度。相当于c语言里面的length
- 对于可变参数函数function(...)三点水即可,函数里面用local args={...}来接受参数,索引1~n依次接收
- lua不支持线程,但提供协程,协程感觉就像副线程一样,虽然可以开很多歌协程,但同一时刻只能有一个协程运行,协程可以随意挂起再启动直到协程死亡。
- lua里面for循环十分诡异,大部分情况直接用for v,k in pairs/ipairs do 代码end 结构,pairs和ipairs是官方给的用来迭代的函数,这样用起来有点像foreach,但你也可以自己写迭代函数,每次迭代返回的第一个参数 即这里的control,即会返回给i,也会反馈给control,当然你也可以不用这么做,等着死循环吧,state状态变量只在第一次赋值时有效(函数调用)比如我这里刻意把state写为1,按理只会执行一次循环,但结果还是正常输出。嘛不管那些歪门邪道,一般我们都用pairs和ipairs就行了,符合大众习惯。pairs和ipairs的区别在于,pairs适用于table等引用类型,ipairs适合值类型,记住i->int->ipairs就行了,当然lua没有int和float之分,lua所以实数类型是number
function square(state,control)if(control>=state) thenreturn nilelsedocontrol=control+1state=1endreturn control,control*controlend
endfor i,j in square,9,0 doprint(i,j)
end
执行结果:1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
table常用函数 | 说明 |
table.concat(tablename) | 将整个table里面的数据以字符串的形式链接,返回一个字符串 |
table.insert(tablename,index,value) | 将一个数据插入到表的指定位置,如果不指定位置则默认插入到末尾 |
table.sort(tablename) | 对table里面的值根据索引来排序,对应的key不变,相当于把key-value整个进行排序 |
table.remove(tablename,index) | 同insert,移除指定键值对,默认为最后一位 |
三.表与元表
__index
mytable = setmetatable({key1 = "value1"}, {__index = function(mytable, key)if key == "key2" thenreturn "metatablevalue"elsereturn nilendend
})print(mytable.key1,mytable.key2)
输出结果 value1 metatablevalue
第一次访问,key1存在,索引不访问__index,而第二次访问不存在key2,索引触发__index
__newindex
如果index表示访问不存在的所以,那么newindex表示对不存在的索引赋值时触发。继续看列子
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })print(mytable.key1)mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)
输出结果
value1
nil 新值2
新值1 nil
你看,如果我们不加元表,“新值2”肯定是给table了,__newindex设置后“新值”给了metatable,而不是table。
__call
__tostring
操作符重载
__add 对应的运算符 '+'.
__sub 对应的运算符 '-'.
__mul 对应的运算符 '*'.
__div 对应的运算符 '/'.
__mod 对应的运算符 '%'.
__unm 对应的运算符 '-'.
__concat 对应的运算符 '..'.
__eq 对应的运算符 '=='.
__lt 对应的运算符 '<'.
__le 对应的运算符 '<='.
同理,不讲了,所有这些元表函数必须定义在元表里面再绑定元表即可生效,即可以接函数,也可以接表。
Lua面向对象
- 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
- 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
- 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
- 4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
我们知道,面线对象有属性和方法组成,而lua中table可以用来模拟属性,function可以模拟函数,而至于继承则可以通过metatable来模拟。
Person ={ name="icecubepill",age=99 }
function Person:eat() --以后函数声明尽量用:不要用. :表示自带参数self,print(self.name.."吃饭?)endfunction Person:new(o)local t = o or {} --如果o不为nil,则吧o赋值给返回的t,就像用对象赋值一样setmetatable( t, { __index=self }) --当访问索引不存在时,触发index访问self,注意这里的self指的是person,也就是说后面student访问不存在索引时再去查找person,也就是他的基类return t
end
Student = Person:new() --是不是想起了继承,student不仅有person的属性还有自己的grade
Student.grade=1stu1 = Student:new() --同样,stu1的既可以看成是student的实例,也可以看成是继承类,毕竟本来就不是面向对象语言,我们做到这样神似面向对象就可以了,仔细想一下上面的new函数你就会恍然大悟为什么会这样。stu1:eat()print(stu1.grade)
是不是没看懂?别急,我们一起分析,刚开始看我也晕了好久
Lua学习笔记(一)相关推荐
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- 微信小程序连接物联网(二):NodeMCU Lua学习笔记
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- lua 学习笔记---游戏开发第一步
lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...
- Lua学习笔记(2)
前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...
- Lua 学习笔记(一)环境搭建
Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 2.Lu ...
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...
- cocos2d-x lua 学习笔记(1) -- 环境搭建
Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...
- 【Lua学习笔记】lua安装及Sublime编辑器配置
--因为工作需要,上周末趁着空闲时间简单学习Lua. [01.跟着视频敲的简单代码,学习还是要多动手才行哦] ok,学习lua的第一步就是安装好环境及选择一款好用的编辑器. lua安装包:https: ...
最新文章
- 神经网络中的激活函数的作用和选择
- Kafka如何通过精妙的架构设计优化JVM GC问题
- mysql查询09软件技术1班_MySQL查询语句的45道练习(2019.09最新版)
- DVWA文件上传high级文件上传漏洞
- msp430入门编程21
- Spring Boot学习总结(21)——SpringBoot集成Redis等缓存以注解的方式优雅实现幂等,防千万次重复提交实例代码
- js小技巧,收藏.作者:空军上将
- 航海家辛巴达的故事(一)
- Java进阶:Mybatis学习
- 朴素模式匹配算法和KMP匹配算法 详细
- 关注手机病毒:重点手机安全事件盘点
- python,执行pip报错:Fatal error in launcher: Unable to create process using ‘“D:\tools\python.exe“ (已解决)
- 国际象棋“马”的走法
- AAC 音频数据结构实例分析:
- 微信小程序入门(一):小程序账号注册 + 微信开发者工具安装
- 怎样制作传奇私服服务器,新手传奇gm必须学会如何制作传奇私服小地图
- php无法访问_php突然不能访问的原因
- Sublime Text 3--->中文乱码的解决方法
- 关键链法vs关键路径法
- python自动化交易_用Python寫自動交易程式的入門平台: Quantopian