【系列】潜水党的简单lua教程四
前面三篇文章基本已经讲完了作图需要用到的绝大部分内容,剩下的一些知识已经与作图无关了,这里不再赘述。
下面开始正式讲作图部分。
而在使用lua作图之前,就必须要了解到ydwe lua,以及common.j和blizzard.j的概念。
先从common.j说起,这里简称cj。
很多we新手应该都会听过所谓的j党、t党说法。
j党就是使用jass语言制作地图的作者
t党就是使用trigger制作地图的作者。
trigger就是触发器。
而触发器是大部分作者普遍使用的一种作图方式。
触发器的优点是简单直白、容易入门,我最早接触作图也是从触发器开始熟悉的,甚至很长一段时间内都是使用触发器制作地图。
jass是war3的程序语言,这一点很好理解。
这里我要纠正一个地方:在很多we新手的观点里面,jass是英文,所以要学习jass需要有一定的英文基础,不会英文就写不了jass。
这个认知是非常片面且错误的。
虽然jass的内容都是英文,但并不是说,你不懂英文就写不了。
想要用jass制作地图,需要掌握的英文都是一些非常简单的词汇,如:
function:函数
takes:携带
returns:返回
return:同returns
end:结束
if:如果
then:然后
else:其他
call:声明
loop:循环
exitwhen:出口
set:设置
globals:全局
……
上面列举的只是一部分,但其他的关键词也并不难记,顶多小学水平就能记住这些单词,如果记不住,那我认为,你不仅仅只是不适合学习jass,甚至可以说不适合学习这个词汇。
平时打打游戏,群里吹吹比,刷刷手机短视频不好吗,为什么要折磨自己。
回归common.j的话题。
cj是we的底层代码,或者说底层api,里面的所有函数都可以通过编辑器来调用实现效果。
并且部分通用的函数已经被封装好,以触发器的形式呈现在触发编辑器内。
而你写的所有的触发,最终都会去执行cj函数。
既然了解了cj,那么blizzard.j是什么呢?
这里简称bj,bj是对cj功能的一次封装,因为cj提供的只是最基础的函数,如果整个地图全部通过cj来制作,那么代码量会非常庞大,为了节省工作量,因此衍生才衍生出了bj。
这里我写一个例子,方便更好的去理解bj为什么会存在,以及cj与bj的区别:
// cj写法:使玩家一的镜头在0.3秒内移动到坐标1314,1314
local player p = Player(0) // 赋值玩家一
if (GetLocalPlayer() == p) then
call PanCameraToTimed(1314, 1314, 0.3)
endif
// bj写法:使玩家一的镜头在0.3秒内移动到坐标1314,1314
local player p = Player(0) // 赋值玩家一
local location o = Location(1314, 1314) // 获取点
call PanCameraToTimedLocForPlayer(p, o, 0.3)
call RemoveLocation(o)
这里可以看到,bj比cj多了一个赋值 类型为点的变量,以及多了一条清空点的变量。
除此之外,原本需要三行的代码量被缩减到了一行,上面也提到了bj其实是对cj的封装,那么封装到底是什么呢?
封装有两个作用:
一:隐藏对象的属性以及细节
二:简化编程过程。
因为隐藏了原生代码的属性以及细节,封装过后的api更容易让不了解的人上手使用。
同时一定程度上提高了代码的安全性,毕竟一层层的去剖析封装过程也是一件很麻烦的事情。
当然这些都不是最主要的。
在jass里面,封装最主要的功能还是简化编程过程。
因为输入大量的代码比点击一个个的窗口要累多了,而代码只有在复制粘贴的简便上具备了无可比拟的优势。
bj与部分cj加起来,就是we里的触发编辑器的所有功能了。
当然了,这里的we仅仅只是war3目录里自带的原生worldedit,并不包括ydwe以及雪月we之类的修改编辑器。
了解完cj和bj,再来说说ydwe lua:
ydwe lua是一个嵌入到war3的插件,可以让作者编写lua语言来执行调用cj里的功能和函数。
这里简称ydlua。
所以如果想要通过lua作图,了解ydlua是必不可少的一个步骤。
那么如何使用ydlua呢?
ydlua存在内置库,也可以说是内置模块,而代码在war3地图内实现功能也是依靠这些内置库来完成。
分别是:
jass.common:等同于cj,包含了cj里面所有的函数
jass.globals:能够获取你在地图内预设的所有jass全局变量,包括bj内变量
jass.japi:调用japi函数,japi函数是ydwe添加的新功能,而这里的japi函数,并不代表着编辑器内已经被封装好的japi功能,具体用法后面会讲。
jass.hook:可以对原本的cj函数下钩子,下钩子是什么意思呢?就是你可以获取原本的cj函数携带的参数,并且去改变它的参数。
jass.slk:可以在地图运行的时候读取地图内的slk/w3 * 文件。
更直白点说就是,你可以通过slk来获取地图内的物编数据,ydwe里面,将slk的功能列入在japi内。
原生编辑器是不存在直接获取物编数据方式的。
slk包含了子项:
unit:单位
item:物品
destructable:可破坏物、可摧毁的
doodad:装饰物、小装置
abilty:技能
buff:魔法效果
upgrade:科技、升级
misc:其他
以上这五个内置库基本覆盖了所有的作图需求,当然也是最常用的五个内置库。
除此之外,还有另外一些不太常用的内置库,分别是:
jass.runtime:在地图运行时获取lua信息或者修改lua的配置。
jass.console:与控制台相关,可以用来打开关闭控制台,用于显示一些处理信息之类。
jass.debug:用于解析ydlua的内部机制。
jass.log:日志库,因为我没用过,具体功能也不了解。
以上便是有关ydlua和cj、bj的一些介绍。