JASS的常用系统

2024-11-26 02:51:25
推荐回答(1个)
回答1:

数据系统,顾名思义,就是用来储存数据的。好的数据系统要求存得下、存得多、找得到、找得快。以下是Jass里常用的几种数据系统。
1. 全局变量(global variables)
全局变量可以是单个的,也可以是数组形式,后者常被作为数据系统。全局变量的形式为:变量名[索引]。变量名以字母开头、由数字字母和下划线组成,索引是0-8191的整数。Jass里的变量一经申明为数组,数组大小永远都是8192。它的优点是,只要知道索引,可以立即访问到对应变量的值;缺点恰恰是,不知道索引就访问不到。全局变量的声明有两种,一种是直接在变量里创建,另一种是写在文件头,只是触发编辑器里直接在触发创建的全局变量会被系统添加udg_的前缀。
2. 游戏缓存(gamecache)
游戏缓存本来是用于在单机战役的不同地图之间传递数据的。但是由于有一些与哈希表类似的非常好的特性,在1.24之前的版本里,游戏缓存一直扮演着哈希表的角色,returnbug+gamecache曾是最流行的数据系统,而ruturnbug也是利用的War3本身所拥有的bug。它的用法与哈希表差不多,只不过它的母键和子键却不是整数,而是字符串。由于War3里字符串不可避免的泄漏,以及游戏缓存本身的效率问题,它还是远远不及哈希表优秀的。该系统由于JASS的不安全因素被hashtable所取代。(虽然这部分漏洞被修正,不过依然存在漏洞)
3. 哈希表(hashtable)
这个是1.24的新玩意儿,用SaveXxx和LoadXxx两个系列的函数完成数据的储存和读取。哈希表的容量是无限的,而且什么都可以存,即使存了很多东西以后,存取效率也不会变低。不仅如此,它的母键和子键可以是任意的整数,与GetHandleId函数配合,比数组变量方便很多。一个示例: call SaveInteger(udg_ht, GetHandleId(udg_unit), 'ABCD', 123456789)
set i=LoadInteger(udg_ht, GetHandleId(udg_unit), 'ABCD')
//此时i的值就是123456789 如果你想使用一个哈希表你需要在全局变量里声明。
除了以上三种数据系统以外,还有location链、rect矩阵等等,当然你也可以自己编写更适用的hash算法,把这几种数据系统相互组合,构造出适合你的、你需要的最佳数据系统。
哈希表语法结构:
a=SaveInteger(pv,key1, key2, b)
pv是一个表格
key1自定义数值
key2自定义的值
b是你的变量
b=LoadInteger(pv,key1,key2,a)