Indexer系统全面教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Indexer系统全面教程

1.Indexer系统有什么用?

做技能时,往往需要给单位绑定一些数据,比如做护盾类技能时需要绑定护盾能抵消

的伤害值,做一些持续伤害的技能时需要给技能目标单位绑定伤害来源单位和每秒的伤害值.

目前常用的方法有全局变量、缓存和哈希表三种。全局变量有高效、方便使用的有点,只需要设置变量=xx即可;缺点则是无法支持多人。市面上大多数支持多人的做

法是采用全局变量数组,用玩家索引做数组索引。在控制单英雄的地图中可以起到很

好的效果,但是对于需要支持更多单位、或者每个玩家多个单位的时候,就显得不够用。缓存和哈希表分别对应1.20版本和1.24版本的魔兽。缓存需要使用return bug,需要使用jass或自定义代码来存储数据;哈希表提供了GetHandleId函数,但是在触

发器中没有合适的接口,最后还是需要通过自定义代码或第三方we(比如ydwe)提

供的功能来使用,比较复杂。

使用Indexer系统可以方便的记录很多数据,而且通过扩展,该系统可以支持位移系统等更多的功能。

2.Indexer系统的原理

Indexer系统是基于全局变量数组的记录方式。触发中有设置单位自定义值的功能,自定义值可以是任意整数,而且可以绑定单位而没有其他副作用。Indexer系统通过一定的算法,使得每个单位都拥有不同的自定义值。这样,类似于利用玩家索引制作支

持多人的技能,可以将单位的自定义值作为数组索引来使得触发支持多人,可以支持

任意玩家的任意多个单位(理论上只能支持8191个单位,但绝大多数地图上不会同时存在如此多的单位)。

Indexer系统在地图初始化时选取全地图的单位来设置不同的自定义值。之后通过

单位进入可用地图区域来获取系统中新增的单位。由于单位进入可用地图区域事件有

延时,所以需要新建的单位立刻进入系统时(比如弹幕、马甲持续攻击芙蓉面还),

还需要一个新增单位的触发。当单位死亡时,判断是否为英雄单位。如果不是英雄,

则可以移出Indexer系统。

3.简单的Indexer系统

制作一个最简单的Indexer系统需要以下变量:

其中,Flag表示当前Indexer中最大的自定义值。Group将进入Indexer系统的单位放入单位组,避免单位重复进入(创建单位手动添加的情况下)。Unit数组将单位

按自定义值作为索引添加到单位组,这样就可以通过单位自定义值来获取对应单位。LocalIndex是个临时整数,用来记录当前单位的自定义值。

触发如下:

将初始化地图中的单位添加到Indexer系统中。这里利用数组的0号索引作为临时

的变量,不作为实际存储使用。获取当前单位后(这里是单位组循环中的选取单位),将Flag的值+1,并作为单位的自定义值,即可保证每个单位的自定义值不同。

该触发最后一行是给下一个触发添加事件。

下一个触发里直接设置事件也可以。

游戏中动态进入地图的单位添加到Indexer系统中。和上一个触发原理相同。

手动添加单位进入的触发。需要先设置Index_Unit[0]为需要添加的单位,然后运行AddIndex触发器(无视条件)。原理同上。

死亡的单位移出Indexer系统。无论死亡的单位是不是拥有最大的自定义值,Flag 的值都需要-1.

4.增强的Indexer系统

4.1给Indexer系统添加更多更复杂的功能

新建了如下触发。

这里是给进入Indexer系统的单位注册受伤害事件,通过这种方式做到捕获任意单位受伤害。之后还需要改造一下前面的触发:

手动添加单位的时候就不需要再运行触发了,一般这种情况都不需要动态做,如果需要,自己再加上运行触发即可。

4.2学着自己添加一个新功能

我想做一个检测单位移动速度变化的触发。如下所示。

新建了一个变量

我用New_Speed变量记录单位移动速度,然后每0.01秒与单位当前移动速度做比较。但是这么做还不够!还存在着不少bug!

首先:给一个不确定大小或很大的数组设置数组大小是不明智的(大家都懂的!)。而变量如果不设置初始值,就会发生一个现象:访问到未赋值变量时,触发就会中断。

到选中的这一行时就已经运行不下去了。同时整个循环也都无法继续。

这时候上面创建的AddExFunction触发就开始发挥作用了。在这个触发添加这一行即可避免变量未赋值导致的函数中断。这样就结束了么?当然没有。

在单位死亡移出Indexer系统时,单位的自定义值发生了变化,因此这里还需要加一行。

这个方法虽然管用。但是也面临着一个缺陷,随着自己添加的功能逐渐增加,单位死亡时需要重新赋值的变量也会相应增加,导致ExitIndex触发越来越复杂。为了避免这个状况,这里引入了双Indexer。

4.3双Indexer的原理及使用方式

对上节出现的问题提出一个双Indexer的解决方案。方案原理为采用一个数组来记录单位对应的数组索引,而不是简单的采用单位自定义值,这里简称这个单位对应的数组索引为“索引”。这个数组被称作双Indexer数组,简称D数组。D数组为一个整数数组,默认的值即是数组索引,例如a[1]=1,a[2]=2以此类推。当然D 数组初始化是没有赋值的。D数组赋值的长度为Indexer系统曾经达到的最大单位自定义值。超出现有长度而新赋值的变量值一定是索引值,而已经赋值过的部分将会产生变化。

原本的Indexer系统

双Indexer系统

可见,只需要改变D数组中数字的排列顺序,就可以使得系统中单位排列紧凑,避免更改其他数组的值。同时通过索引获取对应单位也需要新建一个单位数组来记录。双Indexer系统新增了3个变量,Flag2、Index和Search。

其中Flag2是用来记录D数组初始化过的最大索引,当Flag值(Indexer系统中单位数量)大于Flag2时,就需要给D数组赋值。Index整数数组就是D数组。Search数组和Index数组是个互反的数组,即Index[b]=c,则Search[c]=b。这样就可以通过Unit[Search[索引]]获得索引值对应的单位。

相关文档
最新文档