----------------------------------------------------------------------
World Editor中的Order(命令) , Ability(技能) , Unit Type(单位类型), Destructible type(可破坏物类型) 和 Item type(物品类型) 在JASS中对应的变量类型实际上是integer。
可以用单引号'Xxxx'(Xxxx为在World Editor用View as raw data(以行数据查看)中看到的代码)表示这些类型的值
Jass基本变量类型
integer
integer(数值)是的范围在 -2147483648 和 2147483647 之间的整数, 不能有小数位
在Jass中Integer的几中特殊形式:
1.'xxxx' 单引号加字符形式,该形式为256进制整数,每个字符代表其AscII码值,区分大小写,一般用来表示单位、物品、技能等代码。比如对战单位里剑圣的代码是 'Obla'(在物编中按Ctrl+D可以看到)
2.0xxx 8进制数字,首位为0表示8进制数字
3.0Xaa 16进制数字,以0x开头的表示16进制数字
real
real是范围很大的32字节数字, 可以有小数位, 123456.33就是real
小数点前或后是0的话,可以省略这个0;比如0.34=.34 4.0=4. 0.0可以写成0.或.0,但不能都省略
boolean
boolean的值只有true(真)和false(假), 多用于条件判断语句
if (条件==true)
then
(符合条件做某事)
else
(不符合条件就做另一件事)
endif
string
string是字符串变量, 可以是null(空值). 注意Jass的字符串是大小写区分的, 赋值时用双引号 "" 引用
handle
handle句柄, 可以是null(空值). 是用于指向Warcraft III定义的数据结构的指针. 比如上表中的location/player等除了integer/real/boean/string外的的变量实际上就是handle类型的子变量
code
code(程序代码), 可以是null(空值). 函数可以有code类型的传递参数, 表示该函数必须要有其他函数作为参数, 如:
function RunFunctionForAllPlayers takes code theFunction returns nothing
我们可以这样调用函数: call RunFunctionForAllPlayers(function someFunction) //先运行someFunction
也可以: call RunFunctionForAllPlayers(null) //不运行其他函数
用户定义变量类型
正如上面所说, 上表中location/player等除了integer/real/boean/string外的类型实际上就是handle类型的子类型, 这些变量就是用户类型变量, 实际就是一个数据结构的指针.
数组
是指一组同类型的有序列的变量. 数组中包含的元素可以用[n]来指明(n 表示第n + 1个元素, 从 0 算起).
以上所说的变量类型中除了code类型, 其他类型的变量都可以定义数组变量, 如
locate integer array dropitems
set dropitems[0] = 'Xxxx'
......
set dropitems[18] = 'Xbbb'
dropitems[18]指dropitems中第19个变量.
注意:
1) 数组所有元素初始值是"空", 比如integer类型的数组初始值为0, handle类型初始值的为null
2) 数组不能直接再次初始化, 只能数组按元素赋值, 如:
locate string array playername = "Greedwind" //数组非法赋值
locate string array playername //数组元素只能逐个赋值
set playername[1] = "Greedwind"
set playername[2] = "Greedwind's girlfriend"
unit array myUnits
unit array yourUnits
...
set myUnits = yourUnits // 非法
set myUnits[0] = yourUnits[10] // 合法
3) 数组在函数间不能互相传递. 即是不能把数组作为函数参数, 而且函数也不能返回数组类型的变量.
4) 数组元素域在 0 和JASS_MAX_ARRAY_SIZE = 8192 之间, 即是最多有JASS_MAX_ARRAY_SIZE + 1 个元素. JASS_MAX_ARRAY_SIZE是在common.j中定义的常数
有问有答
1)什么是全局变量和局部变量, 怎样声明和使用变量?
首先要了解, 从作用范围来区分, 变量有全局变量和局部变量.
全局变量作用于Jass程序的全部分, 即是如果全局变量abc在某个函数中改变了值, 这个值也将影响其他引用了abc变量的函数.
全局变量声明格式:
globals
变量类型 变量名称 = 初始值 //有初始化的全局变量
变量类型 变量名称 //无初始化的全局变量
变量类型 array 变量名称 //数组全局变量, 不能再次初始化赋值
...
endglobals
局部变量只作用于函数内部, 即是如果在函数内部定义了局部变量abc, abc的值只影响该函数内部, 不影响全局变量abc的值.
局部变量声明格式:
local 变量类型 变量名称 = 初始值 //有初始化的局部变量
local 变量类型 变量名称 //无初始化的局部变量
local 变量类型 array 变量名称 //数组局部变量, 不能再次初始化赋值
注意:
1) 不论是全局变量还是局部变量, 必须在程序开始部分首先声明.
即是全局变量声明总是在程序文件的最前端,
而局部变量声明总是在函数的最前面.
2) 在Trigger Editor用变量管理器(Ctrl + B)中定义的变量都是全局变量
3) 在Trigger Editor的循环GUI语句 For Loop (Integer A)和For Loop (Integer B)中的(Integer A)(Integer B)都是全局变量
实例:
globals
integer abc = 5188
endglobals
.......
function myfunc1 takes nothing returns nothing
local integer abc
set abc = 1233
endfunction
function myfunc1 takes nothing returns nothing
local integer myint
set myint = abc
set abc = 0
endfunction
如果按顺序调用函数myfunc1 和 myfunc1, 那么在函数myfunc2中的myint的值是多少呢, abc最终值又是多少?
答案是: int = 5188, abc 最终值为 0
2)怎样在Trigger Editor(GUI)中使用局部变量?
(有关在Trigger Editor(GUI)中使用局部变量详细方法请参看我的签名中的链接 - 3c的内存泄漏)
GUI中不能直接引用局部变量,但是我们可以使用全局变量作为中介
首先声明定义变量类型。声明定义变量类型的语句只能放在TIGGER的开头,不然会出现编译错误
声明定义变量类型:
要用:Custom Script - Action
语法:
Custom Script: local <变量类型> <变量名>
变量类型请参看WORLD EDITOR和JASS变量类型对应表
例如:
--单位变量
Custom Script: local unit u
--单位组变量
Custom Script: local group g
然后将它们赋值给临时全局变量就可以在GUI里调用该值了,注意全局变量要加前缀"udg_"
Custom Script: set udg_TempUnit=u
局部变量的使用:
在变量表(Control + B)中先定义好同类型临时变量(不要加前缀udg_)的变量,该变量可以在多个触发里重复利用
(在变量表中定义此变量是为了方便TIGGER EDITOR引用该变量。)
以下例子实现了在单位死亡的位置显示5秒的死亡信息(漂浮文字)
(象这种例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字(-Destroy (diesmessage)). 因为在等待5秒后(-Wait 5.00 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 text at ((position of (Triggering Unit))
with the message ((A+(name of (Triggering 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!
PS:文件来自搬砖蝼蚁 |