找回密码
 点一下
查看: 5972|回复: 36

纯数据编辑器版“必须在目标身后”和“必须在目标前方”验证器

[复制链接]
发表于 2011-1-24 16:23:03 | 显示全部楼层 |阅读模式
我打算把这两个验证器加入到GAx3 mod里面方便大家使用。


发这个演示的由头是这一贴:
http://bbs.islga.org/read-htm-tid-50133.html
很多同学已经发现技能可以直接设置施法角度,但是这个角度是针对施法者的,而不是目标的,利用验证器来判断施法者是否在目标身后这点是相当麻烦的,但并不是做不到。所以这里放了个演示。里头有两个验证器:“必须在目标身后”、“必须在目标前方”


简单地说一下实现原理:

要做“必须在目标身后”是比较困难的,所以不妨先把思路逆转过来,先考虑如何实现“必须在目标前方”。

由于有一个验证器类是枚举区域,所以按照理论上说,我们只要枚举一下目标前方180度区域是否能搜索到施法者就是了。

那么怎么实现目标前方是否有施法者的搜索呢?很多同学大概已经会计算目标前方180有几个单位这样的搜索。但是不能只是计算任意单位,而需要计算目标前方有几个施法者。那就需要对每一个枚举单位进行过滤。看看它是不是施法者。

虽然枚举区域的验证器可以对每个枚举的单位用一次用你指定的验证器进行过滤,很不幸的是,验证器中并不存在直接的单位比较,比如你无法在验证器里进行 (施法者 是否等于 目标单位) 这样比较。因此这里又是一个困难点。其实并不是完全没有办法克服,比如你在搜索设置里exclude掉所有无关单位。或者干脆给施法者上一个特殊的buff,然后在枚举出来的单位里验证这个buff。不过由于放在GAx3 Mod里的验证器需要是比较通用型的,所以用一个特定的buff来做显然是不合适的,而且buff法还存在一个问题。也就是说你在验证的时候必须先加buff,这完全脱离验证器的作用范围,比如我想要一个技能只能在目标身后用,结果却得给施法者先上个buff,那这个技能不是已经算是被“使用”了么?。当然用排除法也是不错的,但是这个演示里用的是更直接的法子,也就是直接用单位过滤器过滤出self单位来。虽然单位过滤里没有施法者这一项,但是却有自身单位这一项,在目前的需求下是已经可以满足要求的了。

所以我们可以先做一个单位过滤验证器,Is Self,也就是枚举目标单位就是施法者自己。把这个验证器作为子验证器加入到枚举区域的单位枚举验证器里。这样枚举出来的单位就只有施法者自身了。

那么如此,我们通过枚举目标单位前方180度是否有至少一个(其实最多也只有一个)施法者自身的验证器,来实现了施法者必须在单位前方的验证器了。

说说很简单,其实实现起来还是有点麻烦的,所以我放了演示让大家参考。



那么继续进行,我们还只是走到了成功的一半。大家更想要的验证器其实是施法者必须在单位后方这样的验证器,是吧?按照逻辑学来说,前方和后方是互斥概念,我们如果可以实现必须在前方,那么只要加个相反操作不是就能实现必须在后方的验证器了么?

可惜这只是理论上行得通而已。单纯给上面的“必须在目标前方”验证器进行Negative操作,结果只会出错。这是因为验证器的内部结构都很复杂,并不像逻辑数学那么说一是一,说二是二的。

那我们来试试看把上面的枚举条件换成目标单位前方180度只有0个施法者自身看呢?可惜这样也是不行的,因为结果会导致怎么都找不到。因为0个本来就是找不到,而这个验证器找不到就返回否。所以当你在前方时,由于不是0个,所以返回否,在后方时,由于找到了0个,所以还是找不到,还是返回否。

所以就结果来说,还是必须做出在目标单位后方找到至少一个施法者这样的验证器才行。可是很多同学会发现,枚举区域的枚举角度必须是以中心单位的朝向为角平分线的。你不能指定角度从几度到几度,所以只能做出前方180度,无法做出后方180度。

所以这里又需要扭转一下思路。

枚举区域效果并不只可以枚举一个区域,我们枚举两个如何?区域1,单位前方180度,区域2,单位周围360度(其实就是全地图)。然后如果我们在区域1里找到了0个施法者,在区域2里找到了1个施法者,那么结果不就是等于在单位后方180度找到了一个施法者么?同时枚举结果也不会永远是0了。这个验证器可以成立。

于是,我们复制一下区域0的参数,加一个区域,然后将其范围改为360,搜索记数为1。

捕获.PNG

然后附演示地图:

地图中的幽灵的狙击技能必须在目标后方时才可以使用,否则会无法使用。比用触发器模拟方便多了。因为触发器毕竟无法阻止单位接收技能命令,而数据编辑器的验证器却能办到。


图1是试图狙击黑圈机枪兵,结果跳出的错误提示:必须在目标后方。

Screenshot2011-01-24 15_34_31.jpg

图2是从后方狙击一个雷兽。

Screenshot2011-01-24 15_30_55.jpg



但是这个地图里本身还存在一个验证器“必须在目标前方” 。没有实际用到,但是大家可以看看其构成。

ValidatorBehindTarget.SC2Map

17 KB, 下载次数: 114

发表于 2011-1-24 16:29:27 | 显示全部楼层
抢到沙发~先顶再看!
回复

使用道具 举报

发表于 2011-1-24 16:50:47 | 显示全部楼层
原来原理是双区域回避0这个数字
另外 search下有filter应该不必单独做一个is self的验证器吧

如图 正面5 背面100

vatest.SC2Map

169 KB, 下载次数: 25

回复

使用道具 举报

 楼主| 发表于 2011-1-24 16:53:40 | 显示全部楼层
引用第2楼za12567于2011-01-24 16:50发表的  :
另外 search下有filter应该不必单独做一个is self的验证器吧

这样毕竟方便加更复杂的过滤扩展嘛。当然就这个例子本身来说没有很大区别。
回复

使用道具 举报

发表于 2011-1-24 16:55:13 | 显示全部楼层
看头目的帖果断回下!顶!头目威武!
回复

使用道具 举报

 楼主| 发表于 2011-1-24 17:00:36 | 显示全部楼层
当然附加的那个区域并不是必须这样写。其实只要能正确回避0就可以了。

但是这样写比较利于理解,别人看的时候更容易明白,而且也免得自己以后忘了。那个is self放的位置其实也差不多。
回复

使用道具 举报

发表于 2011-1-24 17:04:45 | 显示全部楼层
看了这个地图,我想问下头目大人,可不可以把验证器加到武器里呢?比如只能攻击正面的单位..........
回复

使用道具 举报

 楼主| 发表于 2011-1-24 17:06:33 | 显示全部楼层
当然可以,不过不要表述错了,这个演示是,你在目标背面或者你在目标正面。

而不是目标在你正面。

目标在你正面的话现成的数据编辑器机制就能做到。
回复

使用道具 举报

发表于 2011-1-24 17:10:27 | 显示全部楼层
貌似直接 include caster
disable所有其他目标更直接
回复

使用道具 举报

 楼主| 发表于 2011-1-24 17:15:53 | 显示全部楼层
嗯这法子我里面也提了,就那排除法。反正抓到施法者的法子不少的。这个演示里只是其中一个。这个毕竟看起来最直观容易理解。include毕竟在区域结构外面。不是能一下联想到。

在实际使用的时候自然可以拣自己觉得最方便的法子了。
回复

使用道具 举报

 楼主| 发表于 2011-1-24 17:27:26 | 显示全部楼层
对了,我看了下你板凳楼那个演示,其实你那个搜索过滤是没意义的。

self是player的子集,你把player都excluded掉了,那self就没用了啊。你那里生效的其实是那个include caster。所以就等价于禁用所有的,只留下include caster了。
回复

使用道具 举报

发表于 2011-1-24 17:31:38 | 显示全部楼层
只分前后吗?侧面算什么?
回复

使用道具 举报

 楼主| 发表于 2011-1-24 17:33:25 | 显示全部楼层
要会举一反三。楼上的同学。
回复

使用道具 举报

发表于 2011-1-24 17:35:28 | 显示全部楼层
那180可以填其它的数字么。。
回复

使用道具 举报

发表于 2011-1-24 17:36:05 | 显示全部楼层
引用第11楼喂喂于2011-01-24 17:31发表的  :
只分前后吗?侧面算什么?

90-》0
270-》1
就是左右侧90度范围
回复

使用道具 举报

发表于 2011-1-24 17:37:22 | 显示全部楼层
引用第10楼Renee于2011-01-24 17:27发表的  :
对了,我看了下你板凳楼那个演示,其实你那个搜索过滤是没意义的。

self是player的子集,你把player都excluded掉了,那self就没用了啊。你那里生效的其实是那个include caster。所以就等价于禁用所有的,只留下caster了。

那是各种尝试的遗留物。。
结论是include有赦免权
回复

使用道具 举报

发表于 2011-1-24 23:16:38 | 显示全部楼层
我这么理解不知道对不对:

这个选项是确定了施法者要在谁的背后

这个是干什么用的,上面的那个选项不是已经确定了目标吗?

这个选项是确定了谁要在目标背后

而这个计数,就是目标身后有几个施法者的时候,验证成功。
计数我改成-1之后没有影响,-1就意味着随便有几个施法者都可以验证成功是吗?
对了,施法者不永远都只可能是一个吗?-1是不限制数量,但是施法者只可能是一个,也就是这个数值1和-1其实无所谓的对吧?
回复

使用道具 举报

 楼主| 发表于 2011-1-24 23:37:37 | 显示全部楼层
其实因为只要前方0人,后面肯定是1人,所以其实大于-1大于0大与等于1什么的都无所谓。这个纯粹是为了避开0结果用的。就像我上面说到的。
回复

使用道具 举报

发表于 2011-1-24 23:44:13 | 显示全部楼层
另外角度有点迷糊,
0是单位右边吗?顺时针旋转0-180是后面,180-360是前面?
按照这个想法我把目标背后的验证改成小于等于180,以为可以成立但是然后发现是错的
可是错在哪儿呢,大于等于180明明就是180-360是前面啊,小于等于180不就是0-180吗,为什么就不是后面呢?这个角度到底是怎么计算的啊?
回复

使用道具 举报

 楼主| 发表于 2011-1-24 23:54:53 | 显示全部楼层
跟你说了,角度是以单位朝向为角平分线的你所指定角度值的角。

那个大于小于等于操作是用来比较结果数的,不是比较角度大小的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 04:10 , Processed in 0.280514 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表