【 Mod 前置教程 】 从零开始的Lua语言
以撒的结合吧
全部回复
仅看楼主
level 12
⛄Xzcy 楼主
镇楼

日常网页排版,手机党[滑稽]
------------------------------------------------------------------------------------------------------------------------
这一篇教程主要是为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制作感兴趣的人来玩[haha]
萌新来学习也好、大触来暴虐我这个Noob也好[委屈]
2017年09月08日 08点09分 1
吧务
level 14
前排
支持
2017年09月08日 08点09分 2
居然真的做了啊,好评如潮
2017年09月08日 08点09分
level 12
⛄Xzcy 楼主

① Lua的特点和应用场景
要讲一个东西,最好还是要讲讲它的背景和特点
Lua使用标准C语言编写的,非常小巧轻便
目的主要在于
嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能(抄来的话)
说人话[鄙视]咳咳
换句话说,Lua不是那种适合开发独立应用程序的语言
往往做的事情是在原有基础上添加一些什么,这个就和Mod这个东西的性质非常吻合
多说一句话的是,以撒的Mod是用Lua写的,
以撒不是用Lua写的!
在AB+版本,以撒添加了Lua语言执行器,从而可以使用Lua的脚本
打个比方,在使用中文的中国建了一个翻译站,从而引入了一些英文的内容
PS:我没记错的话,饥荒这个游戏的Mod也是用Lua语言写的
2017年09月08日 08点09分 3
level 9
支持[真棒]
2017年09月08日 09点09分 4
level 14
必须的支持啊[真棒]可惜对于我来说,英文是最大的一个坎....[小乖]唉....
2017年09月08日 09点09分 5
level 14
相当支持
2017年09月08日 10点09分 7
level 11
滋兹,虽然我看不懂这玩意[滑稽]
2017年09月08日 11点09分 10
level 11
什么都看不懂,总之支持就好了
2017年09月08日 11点09分 11
level 12
⛄Xzcy 楼主

② 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中没有+=这种操作,老老实实照上面写吧
2017年09月08日 11点09分 12
level 12
前排!!!@我是谁压实度 你懂得
2017年09月08日 12点09分 13
level 9
大佬大佬[滑稽](尽管我目前选择拿gamemaker8.0内置的gml用)
2017年09月08日 12点09分 14
level 7
支持
2017年09月08日 12点09分 15
level 12
⛄Xzcy 楼主

③. 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
2017年09月08日 13点09分 16
5.3 // 向下整除
2017年12月29日 15点12分
看到~=之后!=哭了
2019年02月27日 10点02分
level 12
⛄Xzcy 楼主
对了,又忘记东西了[汗]
这个是运算符的固有的运算顺序
就像乘除法要优先于加减法计算一样
同时我们又可以用 ( )来改变运算的顺序,( )中的内容是最高优先级的
小练习题:
local a,b,c = 10,20,30
( a + 20 ) / ( b-2 ) >= 1 and c*10 - 299 == 1
这句话的结果是true
2017年09月08日 13点09分 17
level 10
嗯嗯,真不敢相信我在游戏吧看编程语言教程[狂汗]
2017年09月08日 13点09分 18
1 2 尾页