以撒的结合吧 关注:249,913贴子:2,892,284

【 Mod 前置教程 】 从零开始的Lua语言

只看楼主收藏回复

镇楼图
日常网页排版,手机党

------------------------------------------------------------------------------------------------------------------------
这一篇教程主要是为Mod制作打一个基础
前提要说好,这算不上一个对于Lua语言学习的教程
我主要讲解介绍与Mod开发有关的内容
像元方法、闭包、继承什么的,对于Lua开发是挺重要的
但是以撒Mod制作中用到的很少,我也就可能稍微提到一下了
最后要说的是,我不是程序专业滴,所有可能有的地方说的并不准确
望谅解,也欢迎大家指正错误
------------------------------------------------------------------------------------------------------------------------
将要讲解的内容:
1. Lua的特点和应用场景
2. Lua数据类型 + 变量 + 函数
3. Lua循环控制
4. Lua运算符
5. Lua字符串
6. Lua的table(表)
7. 类Class的概念
------------------------------------------------------------------------------------------------------------------------
进阶——Mod制作教程(缓慢更新中):https://tieba.baidu.com/p/5256211248?
即将推出的新帖子——优秀Mod代码赏析 估计还得等好久|(*′口`)
------------------------------------------------------------------------------------------------------------------------
在写那个制作帖子的时候,感觉在贴吧讨论这个内容,反响并不热烈
所以我建了一个QQ群:551950870
欢迎对以撒Mod制作感兴趣的人来玩
萌新来学习也好、大触来暴虐我这个Noob也好


IP属地:上海本楼含有高级字体1楼2017-09-08 16:45回复
    前排支持


    IP属地:北京来自Android客户端2楼2017-09-08 16:48
    收起回复
      ① Lua的特点和应用场景
      要讲一个东西,最好还是要讲讲它的背景和特点
      Lua使用标准C语言编写的,非常小巧轻便
      目的主要在于嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能(抄来的话)
      说人话咳咳
      换句话说,Lua不是那种适合开发独立应用程序的语言
      往往做的事情是在原有基础上添加一些什么,这个就和Mod这个东西的性质非常吻合
      多说一句话的是,以撒的Mod是用Lua写的,以撒不是用Lua写的!
      在AB+版本,以撒添加了Lua语言执行器,从而可以使用Lua的脚本
      打个比方,在使用中文的中国建了一个翻译站,从而引入了一些英文的内容
      PS:我没记错的话,饥荒这个游戏的Mod也是用Lua语言写的


      IP属地:上海本楼含有高级字体3楼2017-09-08 16:58
      回复
        支持


        4楼2017-09-08 17:09
        回复
          必须的支持啊可惜对于我来说,英文是最大的一个坎....唉....


          IP属地:山东来自Android客户端5楼2017-09-08 17:15
          回复
            相当支持


            IP属地:北京来自Android客户端7楼2017-09-08 18:07
            回复
              滋兹,虽然我看不懂这玩意


              10楼2017-09-08 19:07
              回复
                什么都看不懂,总之支持就好了


                IP属地:陕西来自手机贴吧11楼2017-09-08 19:08
                回复
                  ② Lua数据类型 + 变量 + 函数
                  既然是零基础教学,当时要从比较低层面来开始讲
                  先从程序是什么来讲 (个人理解,完全不官方呢。。。)
                  我个人理解就是两个内容:数据 + 对数据的操作
                  ------------------------------------------------------------------------------------------------------------------------
                  先讲数据
                  一个数字 5 是数据
                  一句话 垃圾E胖 也是数据
                  甚至说 对数据的操作 其实也是数据
                  我们这里可以看到,虽然说都是数据,但它们明显不是一种类型的
                  为了方便操作,我们会对数据类型进行分类
                  ------------------------------------------------------------------------------------------------------------------------
                  Lua的数据类型
                  1.nil Lua特有的数据类型,这个类型下也只有一个值nil,代表无意义。(和0的意义不同)
                  2.boolean 布尔值,这个数据类型下只有true和false,也就是对错,常用于判断
                  3.number 双精度浮点数,你就把它当成是实数就可以了,Lua还是比较简单的语言
                  4.string 字符串,也就是用来放语句的,比如垃圾E胖
                  5.function 函数类型,这个之后再讲
                  6.userdata Lua常作为嵌入,有时收到来自C的数据类型,Lua没有的。就以这个形式存放
                  7.table 表,Lua很重要的一个数据类型,之后细说
                  协同程序用的线程我就不讲了,应该用不到的
                  ------------------------------------------------------------------------------------------------------------------------
                  对数据的操作
                  这个又可以叫做算法,未完成某个目标,执行的一系列操作
                  不是这里要讲的细节
                  什么逻辑运算、算术运算等等内容都是对数据的操作
                  ------------------------------------------------------------------------------------------------------------------------
                  变量
                  我打个比方来说,变量就是一个储存特定类型物品的容器
                  有存放数组用的变量
                  有存放字符串用的变量
                  变量的名字是让你来区分一个个容器的,这是一个方便人编写程序的机制
                  这里要讲Lua的特点,不同于C,Lua的变量没有声明只有定义
                  在你给一个变量赋值的时候,这个变量的类型就确定了(赋值相当于给容器里放东西)
                  Lua中第一次赋值就是定义
                  如下:

                  Lua的变量从作用域上分为:全局变量、局部变量、表中域(最后一个先不讲)
                  对于全局变量,无论写在哪里,包括函数内,它的有效范围是从定义开始到文件结束
                  --在其他文件也可以调用这些内容 上图中的c就是定义的全局变量


                  对于局部变量,也就是local开头的定义的,仅仅只在语句块中有效
                  --语句块,从特定开头到End为止的区域,离开后其中的局部变量将被删除
                  --直接写在文件下的局部变量,和全局变量唯一不同的是,不可以被其他文件调用
                  --如果你在一个语句块下,写了和外面全局变量同名的局部变量,以内部的为优先值

                  可以看到,d这个变量在语句块外是不存在的
                  后面语句块内的局部a为6,要清楚此a非彼全局a,虽然同名,但是不是一个东西
                  内部以内部a为准,在语句块外部不存在等于6的a,只有一个等于5的全局a
                  ------------------------------------------------------------------------------------------------------------------------
                  在建立变量之后,我们还能够对他们进行赋值操作

                  只有第一次对变量赋值是在做定义,之后都是普通的赋值操作
                  很好理解,a变量定义的是数字类型,怎么能放得了字符串呢?
                  等号 = 在语言中是一个运算符,也就是赋值运算符
                  它会将右边的东西计算完后,赋值给左侧的东西

                  结果很好理解,a会变成223
                  首先定义了一个局部变量a
                  等号先算右侧结果223,然后把这个结果赋值给a
                  PS:Lua中没有+=这种操作,老老实实照上面写吧


                  IP属地:上海本楼含有高级字体12楼2017-09-08 19:59
                  回复
                    前排!!!@我是谁压实度 你懂得


                    IP属地:山东来自Android客户端13楼2017-09-08 20:36
                    回复
                      大佬大佬(尽管我目前选择拿gamemaker8.0内置的gml用)


                      IP属地:江苏14楼2017-09-08 20:49
                      回复
                        支持


                        IP属地:北京15楼2017-09-08 20:54
                        回复
                          ③. Lua运算符
                          本来按照上面的目录,应该要讲循环控制的
                          但是突然发现。。关系运算都没讲,讲个屁的循环控制(╯‵□′)╯︵┻━┻
                          ------------------------------------------------------------------------------------------------------------------------
                          运算符主要为四类:算术运算符、关系运算符、逻辑运算符、其他运算符
                          运算符是用于处理数据的,从而获得你想要的结果
                          ------------------------------------------------------------------------------------------------------------------------
                          一. 算术运算符
                          这一项应该是最简单的
                          + 加法,你总会的吧
                          - 减法,你总会的吧。同时它也是负号—— a = -a 就是取相反数
                          * 乘法,你总会的吧
                          / 除法,你总会的吧
                          % 取余,这个要讲讲,27%4的结果是余数,也就是3,常用来判断是不是倍数
                          ^ 乘幂,10^2 = 100,这一项应该也没太大关系
                          ------------------------------------------------------------------------------------------------------------------------
                          二. 关系运算符
                          注意这一项返回的都是布尔值,也就是true或者false。式子成立时为true,否则为false
                          == 检测两端是否相等。 20 == 20 结果为true
                          ~= 检测两端是否不相等。 20 ~= 20 结果为false
                          > 是否大于
                          < 是否小于
                          >= 是否大于等于
                          <= 是否小于等于
                          ------------------------------------------------------------------------------------------------------------------------
                          三. 逻辑运算符
                          这里要讲的是,逻辑运算符不仅仅用在布尔值上,也可以用在其他东西上
                          而且Lua的逻辑运算机理有点不一样
                          Lua中,仅有false和nil两样判定为假,其余均为真 (包括0,这点和C不一样,要注意)
                          and 如果两端均为真,则返回真
                          --实际操作:如果左侧值为假,直接返回左侧值,中断;否则返回右侧值
                          or 如果任意一侧为真,则返回真
                          --实际操作:如果左侧值为真,直接返回左侧值,中断;否则返回右侧值
                          not 返回一个相反的值,true变false,nil和false变true
                          这里要讲到短路机制这个问题,可以看到and和or的设计很巧妙,可以优化算法
                          但也会造成问题比如 a = nil and b = 10
                          结果是b并不会变成10,因为在判定左侧为nil的时候,这句话就结束了,没有执行 b =10
                          所以大家写的时候要注意一些,如果不是特殊需要,最好不要在逻辑运算时用运算式
                          ------------------------------------------------------------------------------------------------------------------------
                          四. 其他运算符
                          不属于以上三类的运算符,但也很重要
                          .. 连续的两点,用于连接两个字符串,如果不是字符串类型,会自动转换成字符串
                          ——特别注意的是,当用来连接数字的时,要在前后都打上空格,防止产生小数的歧义
                          # 一元运算符,用于字符串和表,可以获得字符串中的字符数量表中的元素的数量
                          ——比如#“LJEP” 结果是4
                          ------------------------------------------------------------------------------------------------------------------------
                          等号赋值功能的补充
                          发现有东西讲漏了
                          可以一次性赋值多个变量
                          a,b,c = 1,2,3
                          将会依次给a、b、c赋值1、2、3
                          可以方便的交换两个变量的值
                          a,b = b,a
                          因为会先计算右侧的结果,所以可以直接达到交换的效果
                          当左右两侧个数不同的时候
                          a,b,c = 1,2
                          c会被赋予nil,a和b分别为1、2
                          a,b = 1,2,3
                          3会被舍弃,a和b分别为1、2
                          因为Lua的函数可以返回复数个结果
                          所以也可以 a,b = f


                          IP属地:上海本楼含有高级字体16楼2017-09-08 21:22
                          收起回复
                            对了,又忘记东西了

                            这个是运算符的固有的运算顺序
                            就像乘除法要优先于加减法计算一样
                            同时我们又可以用 ( )来改变运算的顺序,( )中的内容是最高优先级的
                            小练习题:
                            local a,b,c = 10,20,30
                            ( a + 20 ) / ( b-2 ) >= 1 and c*10 - 299 == 1
                            这句话的结果是true


                            IP属地:上海17楼2017-09-08 21:31
                            回复
                              嗯嗯,真不敢相信我在游戏吧看编程语言教程


                              IP属地:广西来自iPhone客户端18楼2017-09-08 21:40
                              回复