版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Greedwind 教学 Jass 基础一这个假设你已经比较熟练地使用 Trigger 并有一定的逻辑基础和程序设计基础, Knowning engish ispreferable首先问个问题: 为什么要学 JASS?先看下面的例子:以下例子可以实现在例子:Events:A unit diesConditions: Actions:的位置显示5秒的信息(漂浮文字)后并清除信息吗?-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A +(name of (Triggering Unit
2、) + dies) with size 20 , red 100, green 100, blue 0, alpha 100.-Wait 5.00 seconds-Destroy (last created floating text)象以上例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字. 因为在等待5秒后(-Wait 5.00 seconds), 最近创建的漂浮文字(last created floating text)可能已经不是原来的那个了!)要达到目的, 必须对 JASS 有些了解.将对此 TRIGGER 作进一步的分析.jass 基础学新的程序设计语言, 要先学它的变量类
3、型.之变量篇首先提醒大家: Jass2是区分大小写的, 如 ABcd 和 ABCD 是不一样的.Jass2 变量类型变量相当于物件的箱子, JASS2很多的变量类型只是个指针(变量地址).使用变量前必须要首先看个简单的例子:变量类型和变量名称.local string my1stvar /1个字符型局部变量, 起名为 my1stvar set my1stvar = GreedWind /把GreedWind赋值给变量 my1stvar以后的程序中就可以直接/重新赋值 my1stvar变量(除了数组变量)可以在语句中初始化, 上面可以简化成:local string my1stvar = Gre
4、edWind /JASS2有哪些变量类型呢?字符型局部变量 my1stvar 并赋值为GreedWind用 WORLD EDITOR 和Jass2变量类型做对照便一目了然了WORLD EDITOR 和 JASS 变量类型对照表:World Editor 变量名Jass 变量类型型(用于真/假判断)Destructibledestructable 可破坏物DialogdialogDialog Buttonbutton 按钮Floating Texttexttag 漂浮文字egereger 数值Itemitem 物品Leaderboardleaderboard榜Playlayer 玩家Player
5、 Groupforce 玩家组Polocation 位置(点)Realreal 真值型数字Regionrect 地区Spel Effecteffect 特效Stringstring 字符串Terrain Deformationterraindeformation 地形Timertimer 计时器Timer Windowtimerdialog 计时器窗口UnitunitUnit Groupgroup组Player Scoreplayerscore 积分(1.13版新类型)World Editor 中的 Order(命令) , Ability(技能) , Unit Type(类型), Destru
6、ctible type(可破坏物类型) 和 Item type(物品类型) 在 JASS 中对应的变量类型实际上是eger。可以用单引号示这些类型的值x(x 为在 World Editor 用 View as raw data(以行数据查看)中看到的代码)表Jass 基本变量类型egereger(数值)是的范围在 -2147483648 和 2147483647 之间的整数, 不能有小数位在 Jass 中eger 的几中特殊形式:1.x 单引号加字符形式,该形式为256进制整数,每个字符代表其 AscII 码值,区分大小写,一般用来表示到)2.0、物品、技能等代码。比如对战里剑圣的代码是 Ob
7、la(在物编中按 Ctrl+D 可以看8进制数字,首位为0表示8进制数字3.0Xaa 16进制数字,以0 x 开头的表示16进制数字realreal 是范围很大的32字节数字, 可以有小数位, 123456.33就是 real小数点前或后是0的话,可以省略这个0;比如0.34=.34 4.0=4. 0.0可以写成0.或.0,但不能都省略的值只有 true(真)和 false(假), 多用于条件判断语句if (条件=true) then(符合条件做某事) else(不符合条件就做另一件事)endif stringstring 是字符串变量, 可以是null(空值). 注意Jass 的字符串是大小
8、写区分的, 赋值时引号 handlehandle 句柄, 可以是 null(空值). 是用于指向 Warcraft III 定义的数据结构的指针. 比如上表中的location/player 等除了codeeger/real/boean/string 外的的变量实际上就是 handle 类型的子变量code(程序代码), 可以是 null(空值). 函数可以有 code 类型的传递参数, 表示该函数必须要有其他函数作为参数, 如:function RunFunctionForAllPlayers takes code theFunction returns nothing可以这样调用函数: c
9、all RunFunctionForAllPlayers(function someFunction) / 先运行someFunction也可以: call RunFunctionForAllPlayers(null) /不运行其他函数用户定义变量类型正如上面所说, 上表中 location/player 等除了eger/real/boean/string 外的类型实际上就是handle 类型的子类型, 这些变量就是用户类型变量, 实际就是一个数据结构的指针.数组是指一组同类型的有序列的变量. 数组中包含的元素可以用n来指明(n 表示第 n + 1个元素, 从 0算起).以上所说的变量类型中除
10、了 code 类型, 其他类型的变量都可以定义数组变量, 如locateeger array dropitemsset dropitems0 = .xset dropitems18 = Xbbbdropitems18指 dropitems 中第19个变量.注意:1) 数组所有元素初始值是空, 比如eger 类型的数组初始值为0, handle 类型初始值的为 null数组不能直接再次初始化, 只能数组按元素赋值, 如:locate string array playername = Greedwind /数组赋值locate string array playername /数组元素只能逐个赋
11、值 set playername1 = Greedwindset playername2 = Greedwinds girlfriend unit array myUnitsunit array yourUnits.myUnits = yourUnits /set myUnits0 = yourUnits10 / 合法数组在函数间不能互相传递. 即是不能把数组作为函数参数, 而且函数也不能返回数组类型的变set量.4) 数组元素域在 0 和 JASS_MAX_ARRAY_SIZE = 8192 之间, 即是最多有 JASS_MAX_ARRAY_SIZE + 1 个元素. JASS_MAX_AR
12、RAY_SIZE 是在 common.j 中定义的常数有问有答1)全局变量和局部变量, 怎样和使用变量?首先要了解, 从作用范围来区分, 变量有全局变量和局部变量.全局变量作用于Jass 程序的全部分, 即是如果全局变量abc 在某个函数中改变了值, 这个值也将影响其他了 abc 变量的函数.全局变量globals格式:变量类型 变量名称 = 初始值 /有初始化的全局变量变量类型 变量名称 /无初始化的全局变量变量类型 array 变量名称 /数组全局变量, 不能再次初始化赋值.endglobals局部变量只作用于函数不影响全局变量 abc 的值., 即是如果在函数定义了局部变量 abc, a
13、bc 的值只影响该函数,局部变量格式:local 变量类型 变量名称 = 初始值 /有初始化的局部变量 local 变量类型 变量名称 /无初始化的局部变量local 变量类型 array 变量名称 /数组局部变量, 不能再次初始化赋值注意:1) 不论是全局变量还是局部变量, 必须在程序开始部分首先即是全局变量总是在程序文件的最前端,而局部变量总是在函数的最前面.在 Trigger Editor 用变量管理器(Ctrl + B)中定义的变量都是全局变量在 Trigger Editor 的循环 GUI 语句 For Loop (eger A)和 For Loop ( eger B)都是全局变量实
14、例:globalseger abc = 5188 endglobals.function myfunc1 takes nothing returns nothing localeger abcset abc = 1233 endfunctionfunction myfunc1 takes nothing returns nothinglocaleger myeger B)中的(egerA)(set my= abcset abc = 0 endfunction如果按顺序调用函数 myfunc1 和 myfunc1, 那么在函数 myfunc2中的 my值又是多少?的值是多少呢, abc 最终是:
15、= 5188, abc 最终值为 02)怎样在 Trigger Edit(有关在 Trigger EditUI)中使用局部变量?UI)中使用局部变量详细方法请参看签名中的- 3c 的内存泄漏)GUI 中不能直接局部变量,但是可以使用全局变量作为中介首先定义变量类型。定义变量类型的语句只能放在 TIGGER 的开头,不然会出现编译错误定义变量类型:要用:Custom Script - Action语法:Custom Script: local 变量类型请参看 WORLD EDITOR 和 JASS 变量类型对应表例如:-变量Custom Script: locait u-组变量Custom Sc
16、ript: local group g然后将它们赋值给临时全局变量就可以在 GUI 里调用该值了,注意全局变量要加前缀udg_Custom Script: set udg_TempUnit=u局部变量的使用:在变量表(Control + B)中先定义好同类型临时变量(不要加前缀 udg_)的变量,该变量可以在多个触发里重复利用(在变量表中定义此变量是为了方便 TIGGER EDITOR该变量。)以下例子实现了在的位置显示5秒的信息(漂浮文字)(象这种例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字(-Destroy (diesmessage).因为在等待5秒后(-Wait 5.00
17、seconds), 最近创建的漂浮文字(last created floating text)可能已经不是原来的那个了 )例子:Events:A unit dies Conditions:Actions:-Custom Script: local texttag diesmessage-Custom Script: set udg_TempTextTag = diesmessage /注意要添加udg_前缀-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A+(name of (Tr
18、iggering Unit) + dies) with size 20 , red 100, green 100, blue 0, alpha 100.-Set TempTextTag= (last created floating text)-Wait 5.00 seconds-Custom Script: set udg_TempTextTag = diesmessage-Destroy (TempTextTag)注意:不要利用同名覆盖的方法在 GUI 中使用局部变量!(即以 udg_开头的局部变量与已定义全局变量名字相同)该方法在触发内该类同名变量数量=2时会出现严重 Bug!jass
19、基础之常见问题篇1)全局变量和局部变量, 怎样和使用变量?首先要了解, 从作用范围来区分, 变量有全局变量和局部变量.全局变量作用于Jass 程序的全部分, 即是如果全局变量abc 在某个函数中改变了值, 这个值也将影响其他了 abc 变量的函数.全局变量格式:globals变量类型 变量名称 = 初始值 /有初始化的全局变量变量类型 变量名称 /无初始化的全局变量变量类型 array 变量名称 /数组全局变量, 不能再次初始化赋值.endglobals局部变量只作用于函数不影响全局变量 abc 的值., 即是如果在函数定义了局部变量 abc, abc 的值只影响该函数,局部变量格式:loca
20、l 变量类型 变量名称 = 初始值 /有初始化的局部变量 local 变量类型 变量名称 /无初始化的局部变量local 变量类型 array 变量名称 /数组局部变量, 不能再次初始化赋值注意:1) 不论是全局变量还是局部变量, 必须在程序开始部分首先即是全局变量总是在程序文件的最前端,而局部变量总是在函数的最前面.在 Trigger Editor 用变量管理器(Ctrl + B)中定义的变量都是全局变量在 Trigger Editor 的循环 GUI 语句 For Loop (eger A)和 For Loop ( eger B)都是全局变量实例:globalseger abc = 518
21、8 endglobals.function myfunc1 takes nothing returns nothing localeger abcset abc = 1233 endfunctionfunction myfunc1 takes nothing returns nothinglocaleger myeger B)中的(egerA)(set my= abcset abc = 0 endfunction如果按顺序调用函数 myfunc1 和 myfunc1, 那么在函数 myfunc2中的 my值又是多少?的值是多少呢, abc 最终是:= 5188, abc 最终值为 02)怎样在
22、 Trigger Edit(有关在 Trigger EditUI)中使用局部变量?UI)中使用局部变量详细方法请参看签名中的- 3c 的内存泄漏)GUI 中不能直接局部变量,但是可以使用全局变量作为中介首先定义变量类型。定义变量类型的语句只能放在 TIGGER 的开头,不然会出现编译错误定义变量类型:要用:Custom Script - Action语法:Custom Script: local 变量类型请参看 WORLD EDITOR 和 JASS 变量类型对应表例如:-变量Custom Script: locait u-组变量Custom Script: local group g然后将它
23、们赋值给临时全局变量就可以在 GUI 里调用该值了,注意全局变量要加前缀udg_Custom Script: set udg_TempUnit=u局部变量的使用:在变量表(Control + B)中先定义好同类型临时变量(不要加前缀 udg_)的变量,该变量可以在多个触发里重复利用(在变量表中定义此变量是为了方便 TIGGER EDITOR该变量。)以下例子实现了在的位置显示5秒的信息(漂浮文字)(象这种例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字(-Destroy (diesmessage).因为在等待5秒后(-Wait 5.00 seconds), 最近创建的漂浮文字(las
24、t created floating text)可能已经不是原来的那个了 )例子:Events:A unit dies Conditions:Actions:-Custom Script: local texttag diesmessage-Custom Script: set udg_TempTextTag = diesmessage /注意要添加udg_前缀-Floating Text - Create floating tex(ition of (Triggering Unit)with the message (A+(name of (Triggering Unit) + dies)
25、with size 20 , red 100, green 100, blue 0, alpha 100.-Set TempTextTag= (last created floating text)-Wait 5.00 seconds-Custom Script: set udg_TempTextTag = diesmessage-Destroy (TempTextTag)注意:不要利用同名覆盖的方法在 GUI 中使用局部变量!(即以 udg_开头的局部变量与已定义全局变量名字相同)该方法在触发内该类同名变量数量=2时会出现严重 Bug!jass 基础之四函数篇如果你仔细读完并读懂前面两章,
26、应该对 Jass 函数并不陌生了. 也许我两章写的太过综合紧凑, 所以写到这觉得没什么好写了. 不管怎样, 还是需要进一步深入了解 Jass 函数规范和注意事项.注意, 在此章中不是教你动手写Jass 函数, 而是让你基本可以读懂别人写的Jass-如果你英文足够好而且不傻(这是 Jass 中并立条件, 上一章提到过).可以在 Trigger Editor 中把一些简单的触发器(Trigger)转化成自定义, 因为事先知道程序逻辑, 这样读起来也比较容易.1)函数定义要素语法格式function 函数名 takes 参数表 returns 返回类型局部变量局部变量.表达式表达式表达式.retur
27、n 返回表达式endfunction其中:定义函数的关键字有: function . endfunction, takes, returns函数名的首个字母不能是数字, 函数名中不能有第2章中所说的操作符, 特殊字符和多数非字母符号(如: 空格!#$%&*()-+=|;:?,./), 也不能使用中文. 函数命名要尽量简明易懂, 突出函数功能.c) 参数表是规定传递入函数的数据类型和参数数量, 作用是函数间的逗号( , )分开. 不能定义数组作为参数, 这点在的第一章已经做了说明.参数必须规定数据类型或者是无参数, 如function myfunction1 takes nothing retu
28、rns nothing endfunction(输入), 参数之间用function myfunction2 takeseger creatnum, unit myunit returnscall CreateNUnitsoc(creatnum, GetUnitTypeId(myunit), Player(1),GetUnitLoc(GetTriggeringUnit(), bj_UNIT_FACING ) return trueendfunctionmyfunction1为无参数的函数, 调用时不需要传递参数, 即是用 call myfunction1()myfunction1为2参数函数,
29、 参数类型规定为eger 和 unit. 调用 myfunction2时必须同时传递数据类型分别eger 和 unit 的参数, 或者传递入空值(参看第二章的举例).注意: 数字的空值为 0, handle(句柄)类型及其子类别的空值为 null. 关于 handle 类型请参看第一章. 我在本章背后会列出各数据类型所对应的空值.d) 返回类型是规定函数返回的数据类型, 作用同样是函数间的nothing 说明没有返回参数(输出), 可以用 returnse) 局部变量必须写在函数开始部分. Jass 总是先, 再使用. 如:function myfunction3 takes nothing
30、returns nothinglocallocaleger i = 5eger j = 10call myfunction2(i, sleep(360)call myfunction2(j, endfunction下面的函数是错误的:)function myfunction3 takes nothing returns nothinglocaleger i = 5call myfunction2(i,)localeger j = 10sleep(360)call myfunction2(j,endfunction)f) 表达式是函数的 骨干 , 是逻 辑的实现部 分 . 写好这 部分 , 需
31、要对 common.j,mond.ai 有一定的了解.g) 返回表达式的值必须和该函数时的返回类型一致, 不要返回为恐龙类型, 却偷梁换柱返回个. 返回值不能是数组.2) 程序执行函数每个 Jass在触发器文件都需要定义执行程序的函数文件 war3map.j 中, config()和 main()是函数.config()函数作用是在开始状态等.之前初始化地图, 如按设计时指定点放置/可破坏物,初始化main()函数在开始才执行.在 AI文件中, 用户需自定义 main()函数作为该文件的程序.文件执行function ma函数的固定格式:akes nothing returns nothing
32、 /触发器和 AI均使用function config takes nothing returns nothing /触发器使用注意: 一张地图中只能有1个触发器文件 war3map.j, 此文件包含在 w3m 或 w3x 中一张地图中可以包含多个 AI有问有答:文件, 输入 AI文件的目录为: scripts1)当变量loca在上句空值? 不同数据类型的空值是什么?时, 如果在it myunit语句中不直接赋值, 则该变量的初始化值为空值, 表示没有赋值. 如:中, myunit 没有直接赋值, 那么 myunit 在后值是 null以下是数据类型的空值对应表WORLD EDITOR 和 J
33、ASS 变量类型对照表:World Editor变量名 Jass 变量类型 空值型(用于真/假判断) false Destructible destructable 可破坏物 nullDialog dialognullDialog Button button 按钮 null Floating Text texttag 漂浮文字 nullegereger 数值 0Item item 物品 nullLeaderboard leaderboardPlayer player 玩家 null榜 nullPlayer Group force 玩家组 null Polocation 位置(点) null R
34、eal real 真值型数字 nullRegion rect 地区 0Spel Effect effect 特效 nullString string 字符串 nullTerrain Deformation terraindeformation 地形 null Timer timer 计时器 nullTimer Window timerdialog 计时器窗口 nullUnit unitnullUnit Group group组 nullPlayer Score playerscore 积分(1.13版新类型) null由上表可以看出, 除了eger, real 的空值为 0 和的空值为 fal
35、se 以外, 其他数据类型外, 其他数据类型都是 handle(句柄)的子的空值都是 null. 原因很简单: 除了eger, real,类型, handle 类型的空值为 null, 它的儿子们也跟着 null 到底了.2)common.j, Blizzard.j, common.ai?这3个文件都是支持 War3 Jass 的公共库文件, 文件里面包含和用的函数和全局变量.了所有(几乎是所有)Jass 可以调common.j 是最基础的 API 库文件, 在Trigger Jass 和 AI Jass 中都可以调用.Blizzard.j 包含使用 Trigger Editor 时生成的 T
36、rigger Jass 中经常调用的库函数/全局变量, 实际上是基于 common.j 写的子函数. Blizzard.j 只能在 Trigger Jass 中调用.common.ai 只能在 AI Jass 中调用, 它有 AI 中需要使用的函数和全局变量.注意: 在 Trigger Jass 中, 不能调用 common.ai 中的函数和全局变量; 同样地, 在 AI Jass 中, 也不能使用 Blizzard.j 的函数和全局变量.3) 如何获得的 common.j, Blizzard.j, common.ai?在 war3.mpq/war3x.mpq/war3patpq 都有 com
37、momon.ai, 要获得版本的文件, 可以用 WPQ 打开 war3patpq, 在 WPQ 右上方的输入框中输入: scripts* ,如果你的war3patpq 没有加密过, 那么可以找到这3个文件. 如果是加密过的, 则需要把 war3patpq 的文件全部解压到临时目录, 然后用 Ultra-Edit 中的在文件中搜索字符的功能寻找这3个文件.4) 可以在自己的地图中使用自定义的 common.j, Blizzard.j, common.ai 吗?可以. 用输入管理器输入自定义的 common.j, Blizzard.j, common.ai, 输入目录应为scripts. 这样,
38、运行地图中的时, War3就不会到 war3patpq 寻找这3个文件了而直接从地图中的scripts目录调用. 这样做的好处就是可以使库文件的同步一致. 通常, 版本相同的WAR3, 其库文件也相同, 所以多数时候不需要在地图中输入这3个文件. 但如果你更改了这3个基本文件来支持你的Jass, 或者确保为了库文件的一致性, 便可以在地图中输入基础库文件.5) 怎么解读公共库文件(common.j, Blizzard.j, common.ai)的函数/全局变量?Blizzard 对函数/全局变量 名是相当规范简明易懂的(当然需要一定的英文基础), 它定义的函数/全局变量的名基本上是英语语句.
39、我举些例子:native CreateUnit takes player id,eger unitid, real x, real y, real face returns unit本地函数 CreateUnit() 即是 Create Unit, 意思为创建, 从参数表(takes 和 returns 之间的声明)来看, 这个函数需要输入玩家,编码, 坐标 x, 坐标 y, 方向角度, 返回值是类型变量.从函数的名字和参数表, 可以猜测/确认 CreateUnit()是用来在地图的 x/y 坐标中为指定玩家创建指定, 并且使创建面向所定义的角度, 返回值是创建.在地图函数 main()中,
40、CreateUnit()被大量调用, 用来重现地图设计时用 WORLD EDITUI)放置的.注意: 就如前面所,eger 可以用单引号括起4个英文字母/数字来表示. 所以 CreateUnit()中x来表示. 如:eger unitid 参数可以用 set u = CreateUnit( Player(5), ndgt, -2944.0, -3136.0, 270.000 )上句意思是为玩家5在地图坐标(-2944.0, -3136.0)中创建编码为ndgt的, 并使创建面向角度为270度, 然后把创建保存在变量u 中.总结下 Blizzard 函数名/全局变量名的规律:前坠 Get 取得某
41、属性, 此类函数一般有返回值前缀 Set 设置某属性c) 前缀 Is 是否判断, 此类函数返回类型都是, 返回 true 或 falsed) 中间有2 数据类型转化函数, 如 S2I(), I2R, I2S()等e) 有 Item/Unit/. 肯定是与物品/.相关的函数后缀 BJ 此函数肯定是在 Blizzard.j 中定义的, 不能在 AI 中使用.前缀 bj_ 在 Blizzard.j 中定义的全局常量(常量是指定义并赋值后不能再改变的值)前缀 Create 创建前缀 Remove 移除k) 全部大写 在 common.j 中定义的全局常量6) 实用问题: 如何创建外观随机可变的地图?上
42、面, main() 是地图函数, 在 main() 调用了一些再现地图设计时原貌的子函数如CreateAlits(). 因此,可以在 CreateAlits()中加入随机函数 GetRandom()来控制/物品/可破坏物等初始化过程.可以用 Wwar3map.j 后, 再用WPQ 打开要修改的地图, 提取 war3map.j 来修改 main()函数及其相关函数. 修改完PQ 导入修改后的 war3map.j.a) 函数修改/增加方法:这是3C 地图中的 CreateAlits()函数function CreateAlits takes nothing returns nothingcall
43、CreateNeutralPassiveBuildings() /用户自定义函数 call CreatePlayerBuildings() /用户自定义函数call CreateNeutralHostile() /用户自定义函数 call CreateNeutralPassive() /用户自定义函数 call CreatePlayerUnits() /用户自定义函数endfunction注意: CreateAlits()也不是库函数, 是用户自定义函数):可以根据 CreateAlits()创建另一个函数:function CreateAlitsRandom takes nothing re
44、turns nothing/ random是 1,2,3中的随机数localeger random= GetRandom(1, 3)call CreateNeutralPassiveBuildingsRandom(random)call CreatePlayerBuildingsRandom(random call CreateNeutralHostileRandom(randomcall CreateNeutralPassiveRandom(random)call CreatePlayerUnitsRandom(randomendfunction)因为原来调用的函数都是无参数函数, 所以相应
45、的函数应该做些修改, 如:/创建玩家, 以 CreatePlayerUnits()为蓝本增加新函数function CreatePlayerUnitsRandom takeseger randomreturns nothing/此函数以 CreateUnitsForPlayer0为蓝本增加新函数call CreateUnitsForPlayer0Random(random.endfunction/创建中立)/此函数以 CreateNeutralHostile 为蓝本增加新函数function CreateNeutralHostileRandomeger randomreturns nothin
46、glocal play= PlayLAYER_NEUTRAL_AGGRESSIVE)localocalit ueger unitIDlocal trigger t local real life/加入条件控制, 根据随机数创建不同组合.if random/可掉宝物的= 1 thenset u = CreateUnit( p, nC26, -6533.2, 445.1, 220.680 )set t = CreateTrigger( )call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH )call TriggerRegisterUnitEv
47、ent( t, u, EVENT_UNIT_CHANGE_OWNER ) call TriggerAddAction( t, function Unit000012_DropItems )/不掉宝物set u = CreateUnit( p, nelb, -373.5, 3533.4, 44.518 ) set u = CreateUnit( p, nomg, -233.6, 3436.2, 140.871 )elseif random/不掉宝物= 2 thenset u = CreateUnit( p, a001, -373.5, 3533.4, 44.518 ) set u = Creat
48、eUnit( p, a002, -233.6, 3436.2, 140.871 )else.endif endfunction别忘了修改 main()function ma.akes nothing returns nothing/call CreateAlits() /原版的初始化函数, 不再使用call CreateAlitsRandom() /使用新的.endfunction初始化函数b) 初始设置方法:问题的关键就是, 这么多初始, 怎么样修改起来不累人?这里介绍法:先把要修改的地图修改地图初始的类型/位置/宝物等, 删除所有 TRIGGER, 并保存地图, 提取 war3map.j3
49、. 用W 4.5. 把PQ 打开war3map.j 中对应函数中创建的语句的语句粘贴在原地图中相应函数的适当位置6. 重复1-5,的随机初始化设置注意: 如果用 World Editor 再次修改并保存, main()将使用 GUI 默认生成的 call CreateAlits(),而不是 call CreateAlitsRandom(). 此时还需要打开 war3map.j 修改 main()函数.同样, 使可破坏物等初始设置有随化也可以用此方法.jass 基础之五库函数这章是 Jass 基础中最难的部分, 也是最实用的部分.Jass 的关键字有26个, 跟英文字母一样多.来回顾一下:and
50、, array, call, constant, else, elseif, endfunction, endglobals, endif, endloop, exitwhen, extends, function, globals, if, local, loop, native, not, or, return, returns, set, takes, type, then以此看来, Jass 是语法结构最简单的一种准计算机语言. Jass 实现功能基本依靠调用 common.j, blizzad.j, common.ai 中的库函数.本章所述内容不属于 Jass 语法部分, 最主要讲述
51、:触发器(Triggers)跨通讯(er-Script Communication)队列(Enumerations)队列过滤器(Filters)线程(Threads)1) 触发器(Triggers)触发器用于地图触发器(Trigger Jass), 用于响应特定事件. 它是种响应信号(callback), 触发器不能应用于 AI, 即是说 AI Jass 中不能有触发器的语句.触发器包含创建触发器, 设置触发条件, 设置动作. a)创建触发器触发器的数据类型为 trigger(触发器), 是 handle(句柄)的子类型.创建触发器的函数在 common.j 中的:native CreateT
52、rigger takes nothing returns trigger参数:nothing /无参数返回:trigger /返回创建的触发器使用格式: set 表达式 = CreateTrigger()其中表达式是 trigger 类型的变量新数据类型:trigger 类型: 是 handle 的子类型, 用于调用和处理触发器b)触发事件触发事件的数据类型为 event(事件). 可以引起触发响应的触发器必须先在于监视事件发生.中触发事件, 用触发事件的函数在 common.j 中的native TriggerRegister*Event takes:trigger whichTrigger
53、, . returns event函数名:根据事件对象的不同, 有不同的事件响应. TriggerRegister*Event 中的* 号为对象名, 如:TriggerRegisterUnitEvent, TriggerRegisterEnterRegion 等,不同对象的事件要求传递相应指定对象作为参数, 有些事件要求传递下面所说的过滤器(Filters)参数:trigger whichTrigger /触发器变量. /相应指定对象的变量返回:event /返回该事件使用方法(举事件的例子):call TriggerRegisterUnitEvent(哪个触发器, 哪个新数据类型:event
54、 /事件c)触发条件, 哪种类型的事件)触发条件是一组表达式(boolexpr)数据, 它的数据类型为条件函数(conditionfunc), 是表达式(boolexpr)类型的子类型.建立触发条件的函数在 common.j 中的:native Condition takes code func returns conditionfunc参数:code func /函数代码作为参数返回:conditionfunc /返回建立的条件其中 takes code func 是指需要函数代码 func 作为参数, 参数函数 func 必须的格式必须是:takes nothing returns. 即是
55、说, 用作参数的函数本身应该是无参数且返回值为型().使用格式: set 表达式 =Condition(function型函数名)其中表达式是条件函数(conditionfunc)新数据类型:boolexpr表达式conditionfunc 条件函数, 是表达式的子类型比如:function Girl1 takes nothing returns.return true endfunctionfunction Girl2 takes.return true endfunctioneger i returnsfunction Girl3 takes nothing returns nothing
56、.return endfunction/ 假设 c 为 conditionfunc 类型变量set c = Condition(function Girl1) /(A)set c = Condition(function Girl2) /(B) 本身要求参数set c = Condition(function Girl3) /(C) 返回值不是类型Condiction() 中的参数函数 code类型, 所以(B)(C)函数不可作为解释: Girl1() 是无参数且返回为的函数, 可以用作func. 而 Girl2() - 本身要求参数, Girl3() - 返回值不是Condiction()的
57、参数.在第一章变量篇中我没有详细说明 code 类型的数据, 因为怕读者不能理解. 现在我说明下 code 类型数据.用例子说明, 比如:call myfuction1(IsGirl() /(A)call myfuction2(function IsGirl() /(B)(A) 和 (B) 之间 不同呢? 按理解: (A)(B) 都把 IsGirl() 运行返回后的值当作 myfunction1()/myfunction2()的参数. IsGirl()在(A)中是的处理过程. 而(B)是创建了一个运行IsGirl()逻辑的监视线程, 只要线程没给清除/终止, IsGirl()将一直监视变化.
58、注意这里所说的线程跟下面的 AI 线程是两码事.d) 增加触发条件:触发条件可以用 TriggerAddCondition()增加增加触发条件的函数在 common.j 中的:native TriggerAddCondition takes trigger whichTrigger, boolexpr condition returns triggercondition参数:trigger whichTrigger /触发器变量 boolexpr condition /触发条件变量返回:triggercondition /返回该触发条件的 handle(句柄)使用格式:set tc = Tri
59、ggerAddCondition(触发器, 触发条件)其中 tc 为 triggercondition 类型变量新数据类型:triggercondition 触发条件句柄(注意: 触发条件和上面例:的触发事件是不一样的!)这是增加/移除/改变触发条件的例子/文件头 globals.个全局变量 tctriggercondition tc = null trigger mytrigger = null.endglobalsfunction Girl takes nothing returns.return true endfunctionfunction notGirl takes nothing
60、 returns.return false endfunction/为 mytrigger 增加触发条件function addcondition takes nothing returns nothing.set mytrigger = CreateTrigger()set tc = TriggerAddCondition(mytrigger, Condition(function Girl).endfunction/因为 tc 是 mytrigger 触发条件的句柄, 把 tc 清空便清除了指向的触发条件. function removecondition takes nothing re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62037-2:2021/AMD1:2025 FR Amendment 1 - Passive RF and microwave devices,intermodulation level measurement - Part 2: Measurement of passive intermodulation in coaxial c
- 2025年高职劳动与社会保障(劳动与社会保障教育心理学案例分析)试题及答案
- 2025年高职食品加工(食品发酵技术)试题及答案
- 工程机械制造安全培训课件
- 制氧中心安全培训
- 工程安全管理课件模板
- 工程图纸培训
- 2026年反洗钱知识竞赛培训试题及答案
- 慢阻肺肺康复依从性:睡眠质量干预策略
- 学校综合办公室成本控制方法
- 2025年文化旅游产业人才需求与培养可行性分析报告
- 胶州舞蹈课件
- 幼儿园小班语言儿歌《大一岁了》课件
- 北京市海淀区2024-2025学年六年级上学期期末考试语文试题
- 煤矿基本知识培训课件
- 数字治理 课件全套 彭飞 第1-12章 数字治理导论 - 数字环境治理
- 高压清洗车安全操作规程
- 价值流培训课件
- QGDW11970.4-2023输变电工程水土保持技术规程第4部分水土保持监理
- 2025至2030中国医疗云服务行业产业运行态势及投资规划深度研究报告
- 【高分复习笔记】林清泉《金融工程》(第2版)笔记和课后习题(含考研真题)详解
评论
0/150
提交评论