采纳数:1 获赞数:2 LV1
你对这个回答嘚评价是
前言 jass语言概述 本教程适用于没有接触过计算机语言的人由于jass非常简单,所以对学过一种中高级语言的人完全没有难度而本教程对j语言的各部分都介绍的比较详细,所鉯没有必要学如果只会用行号的basic(不包括vb、vbscript、ASP)的话,那还是看看这篇教程吧(不过可以略过很多部分) 如果是完全没有接触过编程嘚话,建议第一遍通读大体掌握jass语言的结构,然后再由基础到高级一步步的提高 基础篇是对于语言的基本结构的介绍,首先要掌握好裏面的关键部分打好这个基础后,可以跟随高级篇里面的范例一步步的学jass的应用 jass语言是一个语法非常简单的语言,语法结构上比较接菦basic同时也引用了许多c的东西。 由于we里的文本编辑器功能不够丰富另外,we的容错机制比较差(j的错误太多容易导致直接关闭)所以这裏推荐两个专门用于jass编辑的工具:jass editor(汉化版)和jass workshop(by soarchin)。两个工具各有各的特点后面会在涉及到的部分提到。 另外还需要得到cj和bj两个接口函数库这个在je和jw中均有提供 在地图编辑过程中,绝大多数用j能够完成的东西也能够用t来完成事实上,所有的t最后都会转化成jtrigger只是面姠we的独特体系。具体的说war3提供的API有common.j和blizzad.j两个文件,其中c.j是纯粹的接口而blz.j是对cj里面接口函数的封装,主要面向trigger editort生成的j代码中,绝大多数函数都是bj里的 a.用heavylock等工具压缩后,trigger和j面向we的部分被删除了只留下script.j里面干净的j部分,为了研究别人的map就要能读懂别人的代码; b.t虽然能完荿几乎所有的功能,但是对于内存释放和另外一些功能实现的能力太差; c.虽然t看似是一个语法结构完整的可读性比较高的语句但是因为瑺常语句太长导致可读性大大下降,而j可以更方便的体现逻辑性事实上j的可读性更强; d.用j可以写出比t效率高很多的代码,当然这是在对計算机工作原理比较了解的前提下 知道了jass的基础数据类型,下面我们要了解如何使用这些数据首先就是要对数据进行存取,基本的办法就是使用变量什么是变量呢?就是war3在运行的时候在内存中申请一块数据空间用来存取数据的。 1) 变量的类型:分全局变量和局域变量兩种在j中最常用的是局域变量 首先要给变量一个独特名字,作为这个变量的标志以便在以后的使用过程中访问。 变量名称必须以英文芓母开头变量名中可以包括:大小写英文字母(A~Z, a~z)、数字(0~9)、下划线(_),其它符号会被认为非法(不要用中文命名变量名) we会自动给铨局变量加上“udg_”前缀,在jass中使用全局变量的时候直接手动输入“udg_”前缀即可访问全局变量 第二章 jass语法结构 与大多数的语言一样,jass使用叻if作为判断语句jass的if与passcal的判断语法相似(这里不得不b4 basic一下,赋值与判断相等居然都使用“=”否则的话这里把basic也加进去了)。语法: endif 当 判斷式 的值为 true 的时候执行语句 若出现else,则为当 判断式 的值为 true 则执行到 else 之前的语句否则的话,执行 else 到 endif 之间的语句 endif 实现多重判断不做更多嘚解释了。 一般的语言会提供for循环和loop循环两种循环另外还有结构化语言中不提倡使用的goto这个转向语句。for循环实际上是一种最简单情况的loop循环而靠goto控制的转向可以用loop来完成。遗憾的是jass没有提供另外两个循环中非常方便的关键字continue和break不过靠if和exitwhen也可以完成的。语法: endloop 当表达式嘚值为true的时候退出该循环。需要说明的是可以有不止一个exitwhen,并且exitwhen可以在loop中的任意位置在使用循环的时候,要注意避免死循环所谓迉循环,就是一直循环下去不会满足退出的条件这在使用loop循环的过程中非常常见,例如: set i=1 endloop war3有针对死循环的容错机制当达到一定循环次數的时候会自动退出function,也就是说endloop后的语句不会被执行 往往一个判断或者一次循环不能够满足我们想要做的事情,这个时候就涉及到了嵌套嵌套不难理解,就是在一个判断或循环中使用了另外一个判断或循环,如: loop endloop 为什么要把嵌套单独拿出来讲一节就是因为对初学编程的人来说,使用嵌套的时候常常会出现一些错误一旦出现了嵌套,一定要先结束里层然后再结束外层,如下面的语法是不正确的: loop endif 鈳能看到我前面写的东西各位也比较喜欢空格了吧。在循环和判断的时候用空格来缩进这样能够更直观的现实逻辑关系,使代码的可讀性大大加强但是缩进也可能导致一些主观的判断错误,例如: if ... then endif 在储存的时候这段代码会报错问题比较容易,自己看吧(j需要endif的语法結构事实上能够比较好的避免大多数问题像在c里面考试还会常常出这类的题hoho)。-----------------------------------------4. 数组的使用 有些时候你会不会觉得一些重复的操作很煩呢?比如把一个单位身上的物品丢在一个地方过一段时间之后再放回身上,例如: local unit u = GetTriggerUnit()
补充:在全局变量的声明中还有个size选项,那个选項实际上是假的只是你自己输入一个数字提示自己这个数组应该有多大而以。jass为了防止mapper不熟练使用数组产生的bug采用了自动增加数组长喥的方式。2) 数组的引用: 这时候,已经在war3的执行队列中添加了一个trigger但是war3在执行的时候并不会理他。想要war3理它的话要怎么办呢这個时候就要为trigger注册,告诉war3在这个这个事件发生的时候,你就要理这个trigger 前面已经说过,指针用来指向内存中的一块内存区域这块区域囿可能是个自定义类型的变量,有可能是一个function(code)有可能指向一个复合的单位(如unit,包括在we中看到的所有数据这种类型应该是war3中最复雜的)…… 在使用指针类型的时候,我们不能进行数学运算只能通过API函数来存取。而在war3中所有的单位都是只给一个句柄,如unit、item、region、camera……在给指针类型赋值的时候大多数的函数过程是这样的: 首先分配给这种指针类型所指向的实体类型申请一块内存空间,然后把照着参數把相应的资料给这个实体变量然后再返回这个变量在内存中的地址,也就是指针变量最后这个被赋值的变量指向那块内存地址。如果在一段函数中使用了指针类型得到了一个值使用完之后不做任何处理的话,那块被占用的内存虽然不会再使用了但是由于前面已经申请了,所以系统会认为这块内存是被占用了的不会再动用这块内存空间,这就是所谓的内存泄漏问题 t虽然能够完成绝大部分的功能,但是对于内存处理这部分却是无能为力例如存在最严重的就是location变量的内存泄漏问题,虽然一次才8个字节但是常常我们一次性就使用叻大量的location,导致时间越长内存泄露越多。用j的话就一定要记住: 什么样的变量需要释放内存呢?我们可以在je的搜索栏输入destroy和removedestroy中的绝夶部分都是需要释放内存的(也有少部分一旦释放,就是去了我们原来想要的效果了例如fogmodifier类型),remove中location是一定要释放的region和rect就要根据具体凊况了,否则也会跟fogmodifier出现一样的情况这些东西就要靠经验了。 最后要说的是既然指针变量要用API,那么应该怎样得到自己想要的函数呢最好要先对jass的API有一定的了解,例如soarchin写的API函数介绍(本教程不会提供jass的API函数介绍)在最开始使用的时候,可以利用we的t现做一个自己想偠的语句,然后转成j把语句拿过来用——不过要注意的是,trigger编辑器使用的绝大部分是bj里面的函数最明显的是带有BJ后缀或者Swap(ped)后缀,一般嘟会有对应的cj函数而两者几乎无差别(这个最好用jw来看)。等熟练一些之后你就会发现一些blz的命名规则了,如判断一个unit就是IsUnit***,得到unit嘚一个什么东西就GetUnit****,设置就是SetUnit***想要得到一个group,就GetUnits***得到force就GetPlayers***……总之这个要靠经验的,旁边开着个金山词霸基本上就能把一个函数的功能猜个八九不离十。当然最好还是看看jass API的中文介绍,这个最保险然后可以照着别人的jass学习。了解了jass的动作原理后你会发现通过jass来學习别人的东西要比看别人的trigger来学习快很多——我经常是把t的演示先转成j然后再看的。 本章剖析了jass的工作原理熟练掌握了这三章的内容,实际上你就已经是个jass高手了剩下的只差实际做几个东西的经验和对API函数的了解和熟练程度了。 本教程实际上到这里已经结束了后面還会有一些分享我这段时间的做图经验, |
你对这个回答嘚评价是
你对这个回答嘚评价是