天工维度魔兽争霸开发者社区-全国最大的TJ集中营-原提百万联盟

标题: 【通用】哈希表应用实例(一) [打印本页]

作者: Seago    时间: 2020-8-27 18:08
标题: 【通用】哈希表应用实例(一)
哈希表的应用实例(一)——计时器传递参数等问题
许多新手在制作触发器时往往会遇到一些列无法理解的问题。
如:一些稍微复杂的技能效果,常会遇到诸如伤害丢失、目标不正确或是自己单人测试没问题,但是多人测试其他玩家就会出现各种问题。通常编写的逻辑都没有问题,问题出在了对一些基本变量的有效范围理解不清,以致运行时的实际值和自己的预想值并不一样,所以最终的效果也就天差地别。
这里所说的基本变量指的是以【触发单位】为代表的,一系列和触发器紧密相关的取值方式。

首先来说说魔兽的运行方式。在初级阶段,我们可以简单的理解为单线程运行。何为单线程?就是说所有的触发、函数有严格的执行顺序,即使地图上可能存在有许多单位,这些单位相关的触发看似有同时触发的可能性,但也只是因为执行的时间极短,所以给人一种同时执行的错觉,本身还是有严格的执行顺序区分的。所以基于这点,在一些无法直接传递参数的地方,如选取单位组单位做动作,我们都可以通过全局变量等形式来传递参数。(不考虑被其他触发中断的情况,这点比较复杂,以后讨论。)因为是单线程执行的,所以别的动作需要等当前动作完成之后才会执行,因此在选取单位组单位做动作的时候可以认为此时这个用于传递参数的全局变量的值都是我们赋予的值,不会改变。

回到开头提到的问题,基本变量的实际值和自己预想的不一样,为什么会这样?很常见的情况是直接在计时器中使用了这些基本变量。以触发单位为例,在触发执行时,触发单位才有了实际意义。比如英雄发动技能效果,那么触发单位就是这个发动技能效果的英雄。触发执行完后,触发单位也就没有意义了
计时器呢?计时器的执行是脱离与触发器的。例如一个运行间隔是1秒钟的计时器,不循环,他的实际作用是告诉游戏引擎,在1秒钟之后要做一件事情,而不是让触发器运行1秒钟以后干什么,触发器的执行是一瞬间的事情,计时器安排的事情是独立于触发器的,无论这个间隔设置的多短,他始终是独立于触发器的。基于此理解,在计时器动作执行的时候,已经脱离了触发器了,自然触发单位之类的也就没有意义了,也就不再是自己预想的值了。


如何让计时器可以取到自己想要的值?哈希表。
相信大家都知道,计时器运行完之后,也需要销毁,需要排泄。自然也能理解,计时器也是个handle类型,也可以获取到他的handleId,也就是整数地址。而在计时器动作运行时,可以通过【到期的计时器】来获取到当前的计时器,进而可以获取到handleId。于是我们便可以用计时器的handleId来作为主索引,次索引可以根据自己的需求设置任意整数,这样我们就可以通过哈希表来传递计时器需要的参数了。用全局变量也可以达到类似的效果,但毕竟全局变量谁都可以访问,除非你只在一个地方使用,否则从计时器被创建到被执行时的期间内,你无法确定这个全局变量是否已经被赋予了新的值了。哈希表则不同了,我们使用的计时器的整数地址作为主索引,只要这个计时器没有被销毁,那么这个整数地址一定是唯一的,所以传递的值一定是我们当初指定的。


作者: xueyuan1996    时间: 2020-8-27 18:19
大佬 学习了
作者: GarVey    时间: 2020-8-27 18:21
学习学习
作者: han6991833    时间: 2020-8-27 19:39
大佬,哈希表的帖子可以多来点。
作者: Seago    时间: 2020-8-27 19:51
han6991833 发表于 2020-8-27 19:39
大佬,哈希表的帖子可以多来点。

ok
作者: jzclikeyz21    时间: 2020-8-28 00:04
感谢楼主的分享!
作者: a505214683    时间: 2020-8-28 00:55
大佬 学习了
作者: 皮皮虎    时间: 2020-8-28 01:56

学习学习
作者: 雨散云飞    时间: 2020-8-29 11:38
继续看!!!
作者: mpdf1995    时间: 2020-8-29 14:16
厉害了我的楼主
作者: Sun丶包子    时间: 2020-8-29 22:16

大佬 学习了
作者: yishiwangxi    时间: 2020-8-30 13:12
感谢分享
作者: yishiwangxi    时间: 2020-8-30 13:15
我的编辑器里玩家1的默认ID一直是1。。。。
作者: Seago    时间: 2020-8-30 14:23
yishiwangxi 发表于 2020-8-30 13:15
我的编辑器里玩家1的默认ID一直是1。。。。

T里面的获取玩家ID是在原有的ID基础上+1,因为通常程序语言是索引是从0开始的,T为了符合大多数人从1开始的习惯。实际处理的过程中功能很多,不一定都是直接用T获取玩家ID的,可能只是中间某个步骤用到了,但T没有展示出来。
作者: CNWorth    时间: 2020-9-1 09:24
哈希很实用,感谢分享~
作者: chance125    时间: 2020-9-1 16:00
大佬 学习了
作者: q345895843    时间: 2020-9-3 16:33
支持一波~~
作者: sanyangzhihuo    时间: 2020-9-3 16:40
很详细 谢谢大佬
作者: yo梦    时间: 2020-9-5 14:43

学习学习
作者: xiangnan88    时间: 2020-9-5 16:59
回复学习一下。。。。。。。
作者: 牧少皇    时间: 2020-9-5 20:47
太强了,学习
作者: 资深巫师    时间: 2020-9-6 09:24
许多新手在制作触发器时往往会遇到一些列无法理解的问题。
作者: Seago    时间: 2020-9-6 16:09
资深巫师 发表于 2020-9-6 09:24
许多新手在制作触发器时往往会遇到一些列无法理解的问题。

纯新手向的教程已经非常多了,再写新手教程也没什么意义。
作者: 死亡配染回    时间: 2020-9-6 16:51
大佬大佬
作者: 你家小夜神    时间: 2020-9-7 17:24
向大佬一起学习,一起进步
作者: 蜗牛先生    时间: 2020-9-15 22:49
发执行完后,触发单位也就没有意义了
作者: 347780682    时间: 2020-9-22 17:19
大佬谢谢分享
作者: W2472032347    时间: 2020-10-14 21:01
感谢大佬分享
作者: shaoyeabin    时间: 2020-11-8 12:36
看看到底是个啥东西。。
作者: 至尊_子帆    时间: 2020-11-22 14:57
......阿西吧,我是萌新
作者: Seago    时间: 2020-11-22 18:48
至尊_子帆 发表于 2020-11-22 14:57
......阿西吧,我是萌新

萌新建议先学习比较基础的做法。对一个功能有初步的理解之后再考虑设计。
作者: FrostKing    时间: 2020-12-9 12:17
大佬牛逼
作者: demonsung    时间: 2020-12-16 14:10
继续学习
作者: 瀚海漂流    时间: 2020-12-30 17:29
嗯很好学习了
作者: 第三个感觉    时间: 2020-12-31 13:28
永远支持提百万联盟
作者: yangxinlin    时间: 2021-1-16 23:59
谢谢教程,学到了许多
作者: nkjvxdaf    时间: 2021-1-23 16:43
大佬 学习了
作者: 泛光灯    时间: 2021-2-2 01:14
大佬 学习了
作者: gandi2019    时间: 2021-2-16 16:55
了解一下
作者: somehandgm    时间: 2021-3-19 09:31
谢谢大佬的指点,感谢
作者: 18115715170    时间: 2021-3-19 11:35
感谢楼主的分享!
作者: 群除我佬    时间: 2021-3-20 10:27
群除我佬啊111
作者: zifkxwbz    时间: 2021-3-20 16:47
本帖最后由 zifkxwbz 于 2021-3-20 16:48 编辑

楼主nb 我来看看 学会了
作者: 星火    时间: 2021-4-26 22:14
感谢分享
作者: alva3000    时间: 2021-4-27 16:12
很好的学习资料
作者: 天轮    时间: 2021-5-10 16:26
支持一波
作者: 自由如风    时间: 2021-7-12 10:47
这样子,是给这个时间绑定整数了吗
作者: Seago    时间: 2021-7-19 19:17
自由如风 发表于 2021-7-12 10:47
这样子,是给这个时间绑定整数了吗

给计时器绑定参数,每次计时器运行时都可以通过当前计时器(到期的计时器)来获取你绑定的这些参数。
作者: 稻草刀    时间: 2021-8-2 18:41
学习学习一下
作者: 泼洒的牛奶    时间: 2021-8-11 02:38
哈希表没用过,学习一下!
作者: zowyy    时间: 2021-9-17 15:30
感谢分享
作者: jin2827    时间: 2021-9-17 21:10
正好需要 感谢 可以学习一波
作者: fm893387358    时间: 2021-9-20 02:10
666666666666666
作者: 花清清    时间: 2021-9-26 02:28
学习学习
作者: zfjlove123    时间: 2021-9-26 08:32
来学习学习
作者: hayagu    时间: 2021-10-29 16:55
大佬牛啊,
作者: xianshi    时间: 2021-11-20 02:14
学习一下~
作者: 小脑薯胖了胖    时间: 2021-12-16 23:22
研究学习
作者: 口与川    时间: 2021-12-31 18:29
看看接下来的文章
作者: 熊猫    时间: 2022-2-28 14:31
就是来学习哈希表的
作者: 荀瑶    时间: 2022-3-11 23:11
大佬,学习了学习了。
作者: kabasiki    时间: 2022-3-19 13:34
大佬牛逼
作者: 470908830    时间: 2022-3-21 14:42
哈希表计时器
作者: watermelon    时间: 2022-3-21 20:23
大佬666666
作者: 根本停不下来    时间: 2022-4-11 06:10
谢谢分享
作者: xieming1314    时间: 2022-5-3 11:24
看看怎么样,学习学习
作者: 学技术哪家强    时间: 2022-6-19 11:38
学习学习学习学习学习学习学习学习学习学习
作者: sxrjptue    时间: 2022-6-19 12:41
是把获取到的整数地址当做变量的寻址依据存储变量吗
作者: Seago    时间: 2022-6-23 23:06
sxrjptue 发表于 2022-6-19 12:41
是把获取到的整数地址当做变量的寻址依据存储变量吗

是的。对于同一个哈希表而言,key值只要是不同的整数就可以存不同的数据,直接使用handleId作为key是一个比较简单的处理方式。当然复杂的系统涉及到handle回收之类的可能导致handleId前后不一致,需要额外处理。例如常见的给某个物品绑自定义值,物品被消耗后需要及时清除,否则可能存在数据问题。
作者: pyx    时间: 2022-6-28 22:15
学习学习
作者: a1052808697    时间: 2022-8-6 11:02
谢谢大佬~!!学习了
作者: raxfal    时间: 2022-10-25 17:11
看起来不错的样子
作者: angiou    时间: 2022-10-29 18:47
真的很好 感谢大佬!
作者: 3142088298    时间: 2022-11-24 22:02
前来学习一下!!!!!
作者: gxmy2012    时间: 2022-12-13 11:04
感谢分享前来学习
作者: 观茶员    时间: 2023-1-18 13:40
哈希值的使用1 谢谢分享
作者: qqwwee147159    时间: 2023-3-14 06:20
很细心的讲解 感觉自己进步了
作者: 是我是我    时间: 2023-3-16 06:56
学习学习
作者: 1091241720    时间: 2023-4-5 22:49
谢谢楼主分享
作者: xphxgroo    时间: 2023-5-19 17:41
感谢大佬分享
作者: GMs2484990328    时间: 2023-5-23 00:54
学习
作者: Acelin    时间: 2023-6-28 12:45
来学习一下
作者: 人间失格    时间: 2023-11-27 17:15
学习学习
作者: 不吃果子狸    时间: 2023-12-6 19:17
进阶必看 感谢楼主分享
作者: eevvok    时间: 2024-2-24 14:20
支持一下,辛苦了,祝愿天工越来越好
作者: qwe136183    时间: 2024-8-20 07:49
有点收获   讲得很通俗易懂




欢迎光临 天工维度魔兽争霸开发者社区-全国最大的TJ集中营-原提百万联盟 (http://bbs.mvprpg.com/) Powered by Discuz! X3.4