找回密码
 点一下

怎么判断英雄使用疾风步后攻击单位背面做动作?

[复制链接]
发表于 2010-10-13 19:13:00 | 显示全部楼层
引用第18楼难受死了于2010-10-13 18:18发表的  :
你要把 A单位和B单位间的向量转换成角度

还不是要三角函数啊

之后还要限定角度的范围,还要用绝对值 才能判断
.......
两个单位之间的角?
攻击者要攻击被攻击者,就必须朝向被攻击者。单位之间的角其实就是攻击者的朝向。
于是简单的角度加减法运算就能确定是不是背刺了...

回楼上的小鸟:因为小鸟你是飞行单位有z高度,所以就用你来指代老~~~
回复

使用道具 举报

发表于 2010-10-13 19:57:25 | 显示全部楼层
请你看看两点间的角度的内部实现再说 谢谢
回复

使用道具 举报

发表于 2010-10-13 20:01:46 | 显示全部楼层
越扯越远 去水区讨论吧.............
回复

使用道具 举报

发表于 2010-10-13 21:39:38 | 显示全部楼层
引用第21楼难受死了于2010-10-13 19:57发表的  :
请你看看两点间的角度的内部实现再说 谢谢
大哥... 我什么时候说要算两点角度了~
这问题也没什么好研究的,到此为止吧。
回复

使用道具 举报

发表于 2010-10-13 21:59:31 | 显示全部楼层
以前不是说过背刺可以同时借用两点间方向和单位面向角度吗
从攻击单位的所在位置到被攻击单位的所在位置 已经被攻击单位的面向角度
还是说我头昏昏地看错问题了...应该是头昏昏看漏什么了吧....
回复

使用道具 举报

发表于 2010-10-13 23:04:53 | 显示全部楼层
引用第23楼core于2010-10-13 21:39发表的 :

大哥... 我什么时候说要算两点角度了~
这问题也没什么好研究的,到此为止吧。

单位之间的角其实就是攻击者的朝向

这难道不是两点间的角度????
回复

使用道具 举报

发表于 2010-10-13 23:19:00 | 显示全部楼层
我认为11楼的方法绕路了,增加计算量了。楼上如果也同意的话,那我们并没有什么分歧。
回复

使用道具 举报

发表于 2010-10-13 23:55:19 | 显示全部楼层
.......我对你无语

增加了计算量??

就只要把一个角度转化成单位向量(此属无奈,提供的API只有角度)

然后和另外一个向量点成 做一个简单的判断

你认为这是增加了计算量?


你认为求绝对值 把向量转换成角度 因为atan值域为-90 - 90 你这里必须通过不同的象限来确定最后的角度(这里起码用4个分支,必然导致某些象限的速度会更慢,因为可能需要判断3次能确定) 还要限制角度范围(起码要统一一个角度范围0 - 360?-180 - 180?,最后才能比较) 乱七八糟的加加减减 这些东西开销很小???

搞笑了 还简单的加减呢 我跟你说上面的算法没一个是对的(甚至连函数的值域都搞错了)

用向量不需要一个if分支

用角度 漫天都是if 这种时候把向量转化为角度是愚蠢的 角度一般用来做插值和数据备份(以免向量矩阵运算的蠕变)。
回复

使用道具 举报

发表于 2010-10-14 01:34:33 | 显示全部楼层
A=攻击者面向角度 //因为取值范围(0,360)
B=被供给者面向角度 //因为取值范围(0,360)
C=A-B //所以取值范围(-360,360),于是...
if (C>90 and C<270) or (C<-90 and C>-270) then
//不是背刺
else
//是背刺
endif

忘了听谁说的了,三角函数是算级数展开,不是直接查表,所以计算量肯定不会比这个小吧?
回复

使用道具 举报

发表于 2010-10-14 01:36:14 | 显示全部楼层
引用第27楼难受死了于2010-10-13 23:55发表的  :
.......我对你无语

增加了计算量??

就只要把一个角度转化成单位向量(此属无奈,提供的API只有角度)
.......
发动群嘲又有什么用  说这么多还不如你把LZ要求的东西做出来..............
回复

使用道具 举报

发表于 2010-10-14 02:41:35 | 显示全部楼层
攻击者面向角度 此值不准 如果你用此值计算 我就不说了(因为转身速度的原因 有时侯 没来得及转过来 但是攻击已经输出了 就无法判断成立)

应该用 攻击者到被攻击者之间的向量计算

还有你的算法根本是大错特错

A 90度 B 60度

应该是属于背刺 A-B = 30

30不在(90,270) 也不在(-270,-90)

不知道你这个是怎么想出来的

你要用角度做 你要先计算A-B的绝对值C 如果大于180 就用360 - C

然后用这个值和你要的角度范围比
回复

使用道具 举报

发表于 2010-10-14 02:53:48 | 显示全部楼层
if (C>90 and C<270) or (C<-90 and C>-270) then
//不是背刺
A 90度 B 60度
应该是属于背刺 A-B = 30
30不在(90,270) 也不在(-270,-90)
...
回复

使用道具 举报

发表于 2010-10-14 03:35:05 | 显示全部楼层
嗯上面我看错了

不过写程序的时候 绝对值不等式 不需要展开 先计算绝对值 不然反而造成最坏情况下需要判断更多的分支

比如这里最坏情况 需要判断5次 不展开只需要判断3次

而且不易理解
回复

使用道具 举报

发表于 2010-10-14 03:52:19 | 显示全部楼层
于是... 三种算法汇总如下

方法一:用攻击者面向角度替代两点角度
缺点:转身攻击会导致误差,用山丘之王(近战)打大城堡(大碰撞体积)测试,接受伤害事件误差在+-10度以内~ 被攻击事件误差可以上百
A=攻击者面向角度
B=被攻击者面向角度
C=A-B
if (C>90 and C<270) or (C<-90 and C>-270) then
//不是背刺
else
//是背刺
endif

方法二:两点间距离与被攻击者面向比较
(Xa,Ya)=攻击者位置
(Xb,Yb)=被攻击者位置
x=Xb-Xa
y=Yb-Ya
A=arctan(y/x)
if x<0 then
A=A+180
elseif y<0 then
A=A+360
endif

//灰色部分jass里一个Atan2就有了,触发器就是两点角度
A=Atan2(Xb-Xa,Yb-Ya)
B=被攻击者面向角度
C=A-B
if (C>90 and C<270) or (C<-90 and C>-270) then
//不是背刺
else
//是背刺
endif

方法三:向量点积
(Xa,Ya)=攻击者位置
(Xb,Yb)=被攻击者位置
//Va=(Xb-Xa,Yb-Ya)
B=被供给者面向角度
//Vb=(cos(B),sin(B))
C=Va·Vb=(Xb-Xa)*cos(B)+(Yb-Ya)*sin(B)
if C>0 then
//是背刺
else
//不是背刺
endif
回复

使用道具 举报

发表于 2010-10-14 16:33:49 | 显示全部楼层
貌似很有种更简单的方法。。。。
GROUP A=在以被刺目标单位面向角度+180位移(被刺允许距离/2)为中心点选取单位,满足匹配单位=被刺施放单位
然后if A中数量>0 做动作。。。。
回复

使用道具 举报

发表于 2010-10-14 16:48:57 | 显示全部楼层
LZ的这个技能如果不需要支持多人的话,可以用T来做
利用打开关闭触发起,来实现
触发器1
事件:单位使用疾步风
设置A=触发单位
打开触发器2

触发起2
事件:任何单位受到伤害
条件:伤害来源=A
动作:GROUP B=在以被攻击单位面向角度+180位移为50为中心点半径为50选取单位,满足匹配单位=A
if B中单位数量>0 then(说明攻击单位在背后)
然后添加动作。。。

最后
关闭当前触发起
回复

使用道具 举报

发表于 2010-10-14 17:00:01 | 显示全部楼层
…… 夫子这个比起33楼任意一个的开销都大海了去了...
不过背刺本来出现次数就不算多,效率也并非那么重要...

看楼主喜好咯~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 02:01 , Processed in 0.075153 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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