|
发表于 2008-9-13 22:54:18
|
显示全部楼层
比如,刚打开魔兽,还没有做其它事情.
申请一个变量A , 地址是1
再申请一个变量B, 则地址一定是2
再申请一个变量C,则地址一定是3
这时,如果删除B,( 包括句柄),
再申请一个变量C,C的地址应该是2
再申请一个变量D,D的地址应该是4
也就是说,地址,是从小到大搜索,直到找到一个可用的为止.
利用这个特性,可以做一些映射.
比如,想为一个计时器,绑定到一个单位上.
( 比如一个子弹在飞,想飞3秒后,删除子弹. 这时,就要想办法在timeraction里知道,
哪一个单位才是要删除的子弹呢...)
一般的作法是: 把计时器Handle,单位的Handle,用缓存绑定到一起.
这样可以通过缓存去查.
因为地图上,一共也不会超过1000个单位吧..
在地图初使化时,建立一个长度为1000的数组Timers,每个元素都是一个Timer.
这就能保证这些Timer的Handle是连续存放的.
先记录Timers第一位的Timer的指针,记为Head.
之后把这些Timer全删掉. 为什么这么做呢,就是为了要占这1000个位子.
这1000个位子,现在还是不可以用的. 因为还有Timers数组的变量在引用它们.
直到把Timers数组的相应位set null后才可以用.
比如,现在数组的Head为A000 0000, 而我想生成一个Timer,并要求这个Timer的Handle是A000 0008
那就很简单的了, set Timers[8]=null , 之后,再CreateTimer, 所得到的Timer的Handle就是A000 0008了.
同时,也很容易知道一个Timer,在数组中的位置了. 比如,A000 0008的位置,就是
A000 0008 - A000 0001 = 8, 第8位么...
这时,如果我们再创建一个数组,为Units, 里面存放着想绑定的单位.
比如想为A000 0008这个Timer绑定一个单位猪头亮,
先用A000 0008 - A000 0000 得到8, 之后在Units数组的第8位放上猪头亮就可以了.
以后什么时候想找到这个计时器绑定的单位, 用计时器的Handle 减去 Head ,就得到了
数组的下标,进而知道单位了.
也许到这里,您会想,直接减不就可以么, 非要生成那1000个干什么..
嗯, 这是为了控制长度.
那1000个点位,是为了保证,以后所生成的计时器的Handle,都应该不大于Head+1000
不然,Head是A000 0000, 生成的一个计时器是A000 A000,这就没办法保存了.
因为A000 A000 - A000 A000 = A000, 也就是10进制的40960, 魔兽的数组没有这么长.
( 就算有,也太浪费空间了. )
其实,真正用起来,还有一些技巧.. 这个是DataSystem的一部分,也是思想的核心.
( 本来想给你找一些代码的, 可是 该死的渣老白居然把Ftp关了... ) |
|