潜水党的简单lua教程五
Aaaaaya゚
编辑于 2023年09月19日 04:55

之前简单的说明了一下lua以及jass的语法。

这里贴一下lua的基础教程链接:https://www.runoob.com/lua/lua-tutorial.html

这个教程概括了所有lua的基础内容,十分的通俗易懂。

下面开始说说如何创建一个可以编写lua的基础war3地图。

首先打开YDWE的配置文件,见示例1

示例1

当然除了编辑器界面,还有另外一种方法打开配置文件,见示例2

示例2

找到配置文件双击点开后,找到魔兽插件项,勾选上lua引擎,见示例3。

示例3

然后再切到系统关联项,勾选上关联地图文件的.w3x和.w3m,见示例4

示例4

通过ydwe创建一个基础地图,这里不作赘述,详情见示例5

示例5

通过界面上方的模块打开触发编辑器,见示例6

示例6

通过界面上方的模块,有一个小写A的按钮,打开触发编辑器,见示例7

示例7

删掉原先的触发,或修改掉名称,命名规范是一件很重要的事情。

然后写入以下触发:

事件 - 地图初始化

动作 - 

游戏 - 输入作弊码:exec-lua:lua.base

(输入作弊码:exec-lua:)效果等同于lua里面的require,作用是调用地图内的lua脚本。

见示例8。

示例8

之后的lua.base,这个是我写入口文件的个人习惯,读者可根据喜好自行修改。

如修改成base、main等等,都毫不影响。

示例9

示例10

jass的目录结构使用的分隔符为\\

但在lua里面,require文件使用的分隔符有所变化,以.代替\\

所以这里lua.base的意思可以理解为lua\\base.lua

即调用地图内,lua文件夹内的base.lua文件

所有的lua脚本,结尾后缀都为.lua

如果没有在前面加上lua.

那么就会检索地图内的base.lua、main.lua文件

以上就是用Trigger写lua入口的方式。

这里再提供两种通过jass写lua入口的方法。

还是先删掉所有的触发器,然后通过w3x2lni.exe将地图解包成目录结构,见示例11。

示例11

找到目录结构内的war3map.j文件,用记事本打开,见示例12。

示例12

找到函数 YDTriggerSaveLoadSystem__Init,这个函数会在地图的main入口内加载。

因此在这里添加一行代码:call Cheat("exec-lua:lua.base)

同样能起到和示例8一样的效果。

示例13

除了使用记事本以外,也可以通过之前我提到的vscode来打开war3map.j文件来编辑。

同样是找到war3map.j,然后添加:call Cheat("exec-lua:lua.base)

见示例14

示例14

不要忘记保存,而且之后的操作全部在vscode内进行。

都改好了之后,在map目录内新建一个名称为lua的文件夹,新建一个名称为base的lua文件。

开始编写代码,详情见示例15:

示例15

接下来将地图目录拖到w3x2lni内,点击obj转成w3x文件,注意是地图目录,并非地图文件。

见示例16:

示例16

右键ydwe测试地图,你会看到除了成功进入游戏之外,还会弹出一个黑色背景的窗口,这个窗口就是控制台(cmd),详情见示例17/18

示例17

示例18

print是一个非常重要也是使用频率非常之高的函数,他可以打印出一些消息,方便你不断调试代码以及进行代码排错。

但lua本身的print函数是无法打印中文消息的,因此你需要打印中文消息时,需要覆盖掉print函数,使用ydlua引擎内的控制台来打印消息。

见示例19/20:

示例19

示例20

如果你没有去覆盖print函数,那么打印出的中文就会变成乱码,见示例21/22:

示例21

示例22

至此,所有基础的设置都已经调好了,现在已经可以开始通过lua去编写地图了。

这里讲一下有关lua作图的一些知识点。

ydlua取消了原生lua的一些功能,即ydlua不推荐你去使用这些功能,所以它给你注释掉了。

但这些被取消的东西并不影响你作图,ydlua的内容完全支撑你做出一张好图,记住这一点就好了。

require函数是用来调用其他lua脚本的。

原生lua支持你调用任何目录内的脚本,但ydlua的范围仅在你地图文件内,也就是只能调用你地图文件里的lua脚本,无法调用地图文件外的lua脚本。

如果你想调用地图外的lua脚本,那么你需要用到一些特殊方法,而不是直接require 目录+文件名。

ydlua不只是可以在地图内的脚本调用,在地图外的脚本依然可以调用,但效果只能依靠你的地图来运行。

想要熟练掌握lua作图,前置条件是学会jass,你可以不精通,但你需要会写和看懂jass。

因为require "jass.common&#​34;内是cj的所有函数,如果你看不懂jass,那么你写起来就会很费劲,所以熟练掌握lua作图的前置条件就是jass入门。

命名规范很重要!命名规范很重要!命名规范很重要!

命名规范就是文件、变量、函数的名称规范,很多作者在使用T作图的时候,变量命名都很随意,常用命名基本都是以下几种:

从二十六英文字母表、阿拉伯数字内取其中一个当做变量名。

更有甚者喜欢用中文当做变量名。

这种命名方法都是不规范的,喜欢中文当然没问题,但变量、函数名都是不能使用中文的。

虽然文件名可以使用中文,但我这里依然不推荐你使用中文来命名脚本、目录。

这里有人要说了,为什么ydwe里的逆天局部变量可以使用中文来命名变量呢?

因为ydwe里的逆天局部变量从严格意义上来说,它并不是真正的局部变量。

而jass内的局部变量,它只能在函数块的置顶去声明,但逆天局部变量明显违反了这一规则,可以在任何地方去声明并且获取。

而逆天局部变量的变量名称,是一个字符串类型,字符串是可以输入中文的。

规范的命名方法有以下几种:

第一种、驼峰法:

这一种也是我最喜欢的命名方法,同样也是common.j和blizzard.j里用到的命名方法,也被细分为大小两种命名。

大驼峰法:GetUnitName(获取单位名称)

小驼峰法:getUnitName(获取单位名称)

我个人习惯以大驼峰法来给函数命名,小驼峰法给变量命名。

第二种、蛇形法:

优点是看上去更加简洁,而且无需切换输入法,方便快捷。

示例:get_unit_name(获取单位名称)

第三种、串式法:

这种方法在jass和lua里面并不支持,只是有这么一种命名法而已,我这里提一下,不推荐大家使用,而且与蛇形法区别不大。

示例:get-unit-name

第四种、匈牙利法:

与小驼峰法类似,首字母必定是小写,用于区分变量的类,即类+变量名,优点是能够明确区分出变量的类型和含义,缺点是增加了不必要的记忆负担,因为你需要同时记忆出首字母代表的类和后面的名称,看需求以及个人喜好使用即可。

示例:sGetUnitName(获取单位名称)

s代表了string这个类,GetUnitName代表了变量的意思。

了解到命名方法之后,那么变量该如何命名呢?

可读性强的名称优先于简短的名称,尽量使用完整化的称谓,不要图方便就去简写。

见示例23:

除此之外尽可能的避免混淆,误导,或者含糊不清的词汇。

这也许会很困难,但坚持下去一定会有一个好的结果。

培养一个好的写代码习惯相当重要,除非你能保证永远只有你一个人写代码,不会有其他人去看你的屎山代码。

其他的等我想到再补充吧,下次聊一下函数(function)和触发器(trigger)