欢迎光临散文网 会员登陆 & 注册

【系列】潜水党的简单lua教程四

2023-06-25 18:27 作者:未晞_a  | 我要投稿

前面三篇文章基本已经讲完了作图需要用到的绝大部分内容,剩下的一些知识已经与作图无关了,这里不再赘述。


下面开始正式讲作图部分。

而在使用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的一些介绍。





【系列】潜水党的简单lua教程四的评论 (共 条)

分享到微博请遵守国家法律